我尝试用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中的视觉块。
任何人都知道如何解决问题
如果检查映射,您将看到它未按预期定义:
:vmap xu
v xu :s/\%V\/\*|**\/\%V//g <CR>
在映射内部,|
命令分隔符将结束映射命令,因此需要进行转义。 (Cp.: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>
我建议将任何设置,映射和文件类型特定的autocmds放入~/.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>
(除非你是一个极简主义者,以某种代价避免使用插件,或者你只是为了学习经验而这样做。)
请注意,有几个评论者插件可以很好地执行此操作,并且这些插件是通用的(并且通常是可扩展的),因此它们适用于任何文件类型: