1

我找到并修改了一些 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

但这对我不起作用,它只是粘贴在文字字符串“&b:cmtldr”中(我也试过不带&),所以我把它改成了第一块代码。然而,我的强迫症不会让我放过它。我已经搜索了如何在这种情况下在 vim 中使用变量,但我尝试过的没有任何帮助。有什么建议么?

4

1 回答 1

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>这里:它只会对你从命令行打开的第一个文件启用评论。)


为什么要重新发明轮子,已经有很多评论插件了?我个人使用 NERD 评论者。它可以配置为用于\c评论,默认情况下它<Leader>cc以这种方式用于评论(有更多可用选项)。

于 2012-11-10T22:27:50.130 回答