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

时间:2014-01-13 08:17:53

标签: search macros vim

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

" remove c++ style comment
nmap _ :s/^[ \t]*\/\///<CR>==:nohls<cr>
" comment line, c++ style
nmap - :s/^[ \t]*/\/\/ /<CR>==:nohls<cr>

这些工作通过用另一个替换线条图案的开头。在一种情况下添加//和在另一种情况下删除斜杠(如果找到)。

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

考虑序列:

  1. 搜索'hello'
  2. 使用宏来评论一行
  3. 再次搜索(输入'n'或/,keyup,输入)
  4. 结果:搜索不查找“hello”,因为搜索模式设置为宏使用的任何内容,即^ [\ t] *
  5. 如何修改此宏以不将不需要的模式注入搜索历史记录?

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:7)

  1. 使用let old = @/
  2. 保存当前搜索注册表
  3. 做你的事,
  4. 使用call histdel('/', -1)
  5. 删除历史记录中的最后一次搜索
  6. 使用let @/ = old恢复搜索注册。
  7. 像这样:

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

    或者使用Tim Pope的Commentary

答案 2 :(得分:2)

此外,还有一个search()功能,它无法触及搜索记录。