我尝试使用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中是可视块。
任何人都知道如何解决问题
答案 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>
...可以,但是通常不是这样。 Vim具有文件类型检测,开箱即用将*.css
识别为filetype=css
。无需将该信息复制到您的autocmd中。相反,您可以加入FileType
事件:
autocmd FileType css vmap xu :s/\%V\/\*\<Bar>\**\/\%V//g <CR>
我建议将所有设置,映射和特定于文件类型的autocmd放入~/.vim/ftplugin/{filetype}_whatever.vim
(或{filetype}/whatever.vim
; cp。:help ftplugin-name
)中,而不要定义很多:autocmd FileType {filetype}
;它更干净,缩放性更好;但是需要您拥有:filetype plugin on
。在默认文件类型插件中覆盖内容的设置应改为进入~/.vim/after/ftplugin/{filetype}.vim
。
:vnoremap
而非:vmap
;它使映射不受重新映射和递归的影响。<buffer>
参数以将其限制为(CSS)缓冲区。:substitute
使用另一个分隔符;它避免了模式中/
的转义,并使其更具可读性。我将以下内容放入~/.vim/ftplugin/css_mappings.vim
:
vnoremap <buffer> xu :s#\%V/\*\<Bar>\**/\%V##g <CR>
(除非您是极简主义者,否则不惜一切代价避免使用插件,或者如果您只是为了学习经验而这样做的话。)
请注意,有几个注释器插件可以很好地做到这一点,并且它们是通用的(并且通常是可扩展的),因此它们适用于任何文件类型: