在Vim中搜索"off the record",或从搜索历史中删除搜索模式?

tiv*_*oni 5 vim macros search

我在我的.vrimrc可爱的小宏中添加/删除代码中的c ++样式注释:

" remove c++ style comment
nmap _ :s/^[ \t]*\/\///<CR>==:nohls<cr>
" comment line, c++ style
nmap - :s/^[ \t]*/\/\/ /<CR>==:nohls<cr>
Run Code Online (Sandbox Code Playgroud)

这些工作通过用另一个替换线条图案的开头.在一个案例中添加//,在另一个案例中删除斜杠(如果找到).

我遇到的问题是那些宏使用搜索和替换.结果,不需要的搜索模式被保存到vim的搜索历史中,使其混乱.

考虑一下顺序:

  1. 搜索'你好'
  2. 使用宏来注释一行
  3. 再次搜索(输入'n'或/,keyup,输入)
  4. 结果:搜索不查找"hello",因为搜索模式设置为宏使用的任何内容,即^ [\ t]*

如何修改此宏以不将不需要的模式注入搜索历史记录?

Chr*_*ndt 9

最近的Vims有:keeppattern修饰符,它将阻止模式添加到历史记录中.


rom*_*inl 7

  1. 保存当前搜索寄存器let old = @/,
  2. 做你的事,
  3. 删除历史记录中的最后一次搜索call histdel('/', -1),
  4. 恢复搜索寄存器let @/ = old.

像这样:

" remove c++ style comment
nnoremap <silent> _ :let old = @/<bar>s/^[ \t]*\/\///<CR>==:nohls<bar>call histdel('/', -1)<bar>let @/ = old<cr>
" comment line, c++ style
nnoremap <silent> - :let old = @/<bar>s/^[ \t]*/\/\/ /<CR>==:nohls<bar>call histdel('/', -1)<bar>let @/ = old<cr>
Run Code Online (Sandbox Code Playgroud)

或者使用蒂姆波普的评论.