如何使用变量简化此vim快捷方式?

时间:2012-11-10 21:16:17

标签: variables vim

我发现并修改了一些我发现的vimrc代码,用于评论vim的当前行/块:

"
" Commenting blocks
"
autocmd FileType c,cpp,java noremap <buffer> <Leader>c :s,^\(\s*\)[^// \t]\@=,\1// ,e<CR>:nohls<CR>zvj
autocmd FileType sh,python  noremap <buffer> <Leader>c :s,^\(\s*\)[^# \t]\@=,\1# ,e<CR>:nohls<CR>zvj
autocmd FileType vim        noremap <buffer> <Leader>c :s,^\(\s*\)[^\" \t]\@=,\1\" ,e<CR>:nohls<CR>zvj

autocmd Filetype c,cpp,java noremap <buffer> <Leader>u :s,^\(\s*\)// \s\@!,\1,e<CR>:nohls<CR>zvj
autocmd Filetype sh,python  noremap <buffer> <Leader>u :s,^\(\s*\)# \s\@!,\1,e<CR>:nohls<CR>zvj
autocmd Filetype vim        noremap <buffer> <Leader>u :s,^\(\s*\)\" \s\@!,\1,e<CR>:nohls<CR>zvj

原始代码使用autocmd FileType行来设置变量以定义该行的注释。它看起来与此相似:

autocmd FileType c,cpp,java let b:cmtldr=//
autocmd FileType sh,python  let b:cmtldr=#
autocmd FileType vim        let b:cmtldr=\"

noremap <buffer> <Leader>c :s,^\(\s*\)[^&b:cmtldr \t]\@=,\1&b:cmtldr ,e<CR>:nohls<CR>zvj

但是这对我来说不起作用,它只是粘贴在文字字符串“&amp; b:cmtldr”中(我也尝试过没有&amp;),所以我把它改成了第一个代码块。但是,我的OCD不会让我失望。我在这个上下文中已经做了一些搜索如何在vim中使用变量,但我尝试过没有帮助。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这里有两个错误的语法:

  1. :let:set不同,因此您必须在此处使用表达式,并且应该看起来像let b:cmtldr="\""
  2. 您无法将变量值放入正则表达式,您必须使用\=将其置于替换字符串中。最好在这里使用:execute<C-r>

    noremap \c :s,\v(\s*)(\V<C-r>=escape(b:cmdldr, '\,')<CR>\v|\s)@!,\=submatch(1).b:cmtldr,e<CR>:nohl<CR>zvj
    

    (我猜你实际上并不是指<buffer>:它只会对你从命令行打开的第一个文件进行评论。)


  3. 为什么重新发明轮子,已经有很多评论插件?我个人使用NERD Commenter。它可以配置为使用\c进行评论,默认情况下它使用<Leader>cc进行评论(有更多可用选项)。