如何让 vim 在替换后不再高亮显示匹配项?

如何让 vim 在替换后不再高亮显示匹配项?

set hlsearch我的 中有。这通常非常有用,但在我执行类似替换后(运行后会突出显示每行的结尾)~/.vimrc必须这样做很烦人。如何在像这样替换后不突出显示?:noh'<,'>s/$/',/vim

我在 Ubuntu 9.04 上安装了vim7.2。我在 OS X 10.6(也是 7.2)上遇到了同样的问题vim。希望能有一款可以在两者上运行的软件。

更新:我收到的所有答案都只是添加一个要执行的键映射:noh(或等效操作)。我真的试图避免使用我真正习惯的自定义键行为,但如果没有它们,我会惨遭失败(例如在朋友的电脑上等)。我想在进行替换后vim自动执行:noh。也就是说,我只hlsearch在使用/*(可能还有其他几种情况)时才想要,而其他时候则不需要。

答案1

如果你不想永久禁用,你可以绑定一个键来切换突出显示,如对类似问题的回答在 stackoverflow 上。

map  <F12> :set hls!<CR>
imap <F12> <ESC>:set hls!<CR>a
vmap <F12> <ESC>:set hls!<CR>gv

如果要永久禁用突出显示:

11.1. After I searched for a text with a pattern, all the matched text
      stays highlighted. How do I turn off the highlighting
      temporarily/permanently?

The 'hlsearch' option controls whether all the matches for the last
searched pattern are highlighted or not. By default, this option is not
enabled. If this option is set in a system-wide vimrc file, then you can
turn off the search highlighting by using the following command:

    :set nohlsearch

(来自VIM 常见问题解答

答案2

我有两种不同的解决方案,都很不错,但每个解决方案的行为都有细微的不同。我最喜欢的是选项 2:

  1. 我的 .vimrc 中有以下两行:

    autocmd cursorhold * set nohlsearch
    autocmd cursormoved * set hlsearch
    

    如果光标没有移动,第一个函数会等待超时(不可配置)并关闭 hlsearch。如果光标再次移动,第二个函数会将其重新打开。

    这不是一个完美的解决方案,但对我来说是有效的(并且当超时可配置时将接近完美 - 目前,超时与 vim 的内置计时器绑定。)

  2. 或者你可以尝试以下几行:

    autocmd cursorhold * set nohlsearch
    noremap n :set hlsearch<cr>n
    noremap N :set hlsearch<cr>N
    noremap / :set hlsearch<cr>/
    noremap ? :set hlsearch<cr>?
    

这会在光标无移动的短暂超时后关闭 hlsearch,然后将其重新打开以执行标准搜索命令。它并未涵盖重新打开 hlsearch 的所有可能性,但足以作为概念验证的起点。

答案3

我只需输入“/asdf”(假设文件中没有“asdf”)即可取消突出显示。我知道这很简单,但对我来说很有效。

答案4

另一种可能性是@/在替换后重置寄存器(实际上是一个读写寄存器)。这将恢复之前的突出显示:

command! -nargs=* -range S
\ let atslash=@/|exe ':'.<line1>.','.<line2>.'s'.<q-args>|let @/=atslash

但是,这仍然有几个问题:
- 它不是修改:s,而是定义一个新命令。虽然可以使用cabbrev映射:s:S,但我没有办法捕获所有构造,例如:<range>s
- 如果您:nohl之前使用隐藏了一个搜索,那么这将重新突出显示之前的搜索。我不知道如何查找:nohl之前是否调用过。(也许可以绕过这个问题并覆盖命令:nohl,但这也需要覆盖所有搜索命令,这可能太多了……)。

相关内容