vim - 在 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 中的可视块。
任何人都知道如何解决问题
解决方案
问题
如果您检查映射,您会发现它没有按预期定义:
: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>
替代自动命令
我建议将任何设置、映射和特定于文件类型的自动命令放入~/.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>
或者使用插件
(除非您是一个极简主义者,会不惜一切代价避免使用插件,或者您这样做只是为了学习经验。)
请注意,有几个评论器插件可以很好地做到这一点,并且它们是通用的(并且通常是可扩展的),因此它们适用于任何文件类型:
推荐阅读
- python - 在 models.Model 和我的 Model 类之间添加父类
- javascript - 使用 chrome devtools 调试滚动卡顿。“更新层树”
- python - 42000 [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]'go' 附近的语法不正确。(102) (SQLExecDirectW)
- sql - SQL 仅选择第二个表中的行,包含从第一个表接收到的确切结果
- cobol - PL/I 字帖到 COBOL 字帖
- docker - 从容器内部访问服务主机
- javascript - 从中获取价值
- node.js - Express js 使用 nginx 反向代理时摩根日志中的 IP 地址无效
- python-3.x - 如何让 mypy 接受 List[Optional[str]] 作为 filter() 的输入参数?
- firebase - Firebase 子集合结构