在Vim中使用vmap注释和取消注释CSS代码

时间:2018-09-11 22:59:15

标签: vim

我尝试使用vmap注释和取消注释CSS文件

当我在CSS文件中选择行并用'xx'注释掉时

autocmd BufEnter *.css vmap  xx  :s/\%V\s*\(\S.*$\)\%V/\/* \1 *\//g <CR>

效果很好

但是当我尝试vmap'xu'取消注释CSS代码时,

autocmd BufEnter *.css vmap  xu  :s/\%V\/\*\|**\/\%V//g <CR>


'xx' comment =>   background-color => /*  background-color:red;  */
'xu' uncomment =>  /*  background-color */ => background-color

映射是尝试从css文件中我选择的行中删除'/*' and '*/'

我遇到以下错误:

E871: (NFA regexp) Can't have a multi follow a multi !
E61: Nested *
E476: Invalid command

在我看来,我在'\%V和\%V'之间没有'或'运算符,这在Vim中是可视块。

任何人都知道如何解决问题

1 个答案:

答案 0 :(得分:2)

问题

如果您检查映射,就会发现它没有按预期定义:

:vmap xu
v  xu            :s/\%V\/\*|**\/\%V//g <CR>

在映射内部,|命令分隔符将终止映射命令,因此需要转义。 (第:help map-bar页)。这通常是通过<Bar>完成的,但是也可以通过在\前面添加来完成。偶然地,您的正则表达式就是这样,从而避免了映射定义错误,而且破坏了映射。

vmap  xu  :s/\%V\/\*\<Bar>**\/\%V//g <CR>

您可能还应该始终避开第二个文字*;这会给您一个不同的(未找到模式)错误,而不是E871:

vmap  xu  :s/\%V\/\*\<Bar>\**\/\%V//g <CR>

autocmd

...可以,但是通常不是这样。 Vim具有文件类型检测,开箱即用将*.css识别为filetype=css。无需将该信息复制到您的autocmd中。相反,您可以加入FileType事件:

autocmd FileType css vmap  xu  :s/\%V\/\*\<Bar>\**\/\%V//g <CR>

替代autocmds

我建议将所有设置,映射和特定于文件类型的autocmd放入~/.vim/ftplugin/{filetype}_whatever.vim(或{filetype}/whatever.vim; cp。:help ftplugin-name)中,而不要定义很多:autocmd FileType {filetype};它更干净,缩放性更好;但是需要您拥有:filetype plugin on。在默认文件类型插件中覆盖内容的设置应改为进入~/.vim/after/ftplugin/{filetype}.vim

更多小补丁

  • You should use :vnoremap而非:vmap;它使映射不受重新映射和递归的影响。
  • 在编辑CSS文件之后,该映射还将在任何其他缓冲区中处于活动状态,因为它是一个 global 缓冲区。添加<buffer>参数以将其限制为(CSS)缓冲区。
  • 您可以为:substitute使用另一个分隔符;它避免了模式中/的转义,并使其更具可读性。

最终推荐

我将以下内容放入~/.vim/ftplugin/css_mappings.vim

vnoremap <buffer> xu :s#\%V/\*\<Bar>\**/\%V##g <CR>

或使用插件

(除非您是极简主义者,否则不惜一切代价避免使用插件,或者如果您只是为了学习经验而这样做的话。)

请注意,有几个注释器插件可以很好地做到这一点,并且它们是通用的(并且通常是可扩展的),因此它们适用于任何文件类型: