首页 > 解决方案 > 在 Vim 中使用 vmap 注释和取消注释 css 代码

问题描述

我尝试使用 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

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

我收到以下错误:

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

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

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

标签: 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 具有文件类型检测功能,并且开箱即用地*.cssfiletype=css您检测。无需将该信息复制到您的 autocmd 中。相反,您可以挂钩FileType事件:

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

替代自动命令

我建议将任何设置、映射和特定于文件类型的自动命令放入~/.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; 它使映射不受重新映射和递归的影响。
  • 编辑 CSS 文件后,映射也将在任何其他缓冲区中处于活动状态,因为它是一个全局缓冲区。添加<buffer>参数以将其限制在 (CSS) 缓冲区中。
  • :substitute您可以为;使用另一个分隔符 它避免了/模式中的转义,并使其更具可读性。

最终推荐

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

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

或者使用插件

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

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


推荐阅读