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

问题描述 投票:1回答:1

我尝试用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中的视觉块。

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

vim
1个回答
2
投票

The problem

如果检查映射,您将看到它未按预期定义:

: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>

The autocmd

......有效,但不是通常的方式。 Vim有文件类型检测,开箱即用检测*.cssfiletype=css。无需将该信息复制到您的autocmd中。相反,你可以挂钩到FileType事件:

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

Alternative to autocmds

我建议将任何设置,映射和文件类型特定的autocmds放入~/.vim/ftplugin/{filetype}_whatever.vim(或{filetype}/whatever.vim; cp.:help ftplugin-name),而不是定义大量的:autocmd FileType {filetype};它更清洁,更好地扩展;但要求你有:filetype plugin on。覆盖默认文件类型插件中的内容的设置应该进入~/.vim/after/ftplugin/{filetype}.vim

More small fixes

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

Final recommendation

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

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

Or use a plugin

(除非你是一个极简主义者,以某种代价避免使用插件,或者你只是为了学习经验而这样做。)

请注意,有几个评论者插件可以很好地执行此操作,并且这些插件是通用的(并且通常是可扩展的),因此它们适用于任何文件类型:

© www.soinside.com 2019 - 2024. All rights reserved.