Vim:vmap替换需要额外的转义

时间:2015-12-02 17:19:09

标签: regex vim

我对Vim的map命令比较陌生,但我理解一般语法。

TL:DR: 为什么我需要〜/ .vimrc文件中的额外管道?

vmap <C-e> :s/^\(\/\*\\| \*\/\\| \*\)/\/\/\//g<CR>:noh<CR>

背景:我在我写的地图上感到困惑,要求<C-e>替换

/*
 * Comment blocks
 */

///
/// Company Doxygen comment block
///

如果我在vim命令行中编写替换,那么在\运算符没有额外|的情况下它可以正常工作。

:'<,'>s/^\(\/\*\| \*\/\| \*\)/\/\/\//g<CR>:noh<CR>

感谢阅读!

1 个答案:

答案 0 :(得分:1)

管道|用于分隔Vim命令。所以如果你做了以下事情:

map a b | c

它将被视为两个不同的命令/语句:map a bc。为了避免|被中断为命令分隔符,您需要通过\|转义它或使用<bar>

所以你的命令看起来更像是:

xnoremap <c-e> :s#\v^(/\*<bar> \*/<bar> \*)#///#g<CR>:noh<CR>

注意:通过使用#作为替换分隔符以及使用非常神奇的\v,我减少了转义。我还切换到noremap以阻止重新映射以及使用xmap而不是vmap来阻止在选择模式下触发此操作。

如需更多帮助,请参阅:

:h :|
:h <bar>
:h key-codes
:h :map-commands
:h /\v