替换后如何防止vim突出显示匹配项?


13

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

我使用vim7.2的Ubuntu 9.04 。我在OS X 10.6(也是vim7.2)上有同样的问题。对两者都适用的东西是可取的。

更新:我收到的所有答案都只是添加要执行的键映射:noh(或等效操作)。我确实尝试避免习惯于习惯的自定义键行为,但是如果没有这些行为,我会惨遭失败(例如,在朋友的计算机上等)。我想在更换后vim自动进行:noh。也就是说,我只想hlsearch在使用/*(可能是其他几种情况)时使用,而在其他时候则不需要。

Answers:


7

如果您不想永久禁用,可以按照此答案中的建议绑定一个键来切换高亮显示,以解决关于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
我知道这个选项。问题在于,我通常不搜索要替换的内容,因此在大多数情况下突出显示要替换的内容毫无意义。然而,这对我非常有用正在寻找的东西,所以我不希望它去完全程。
本杰明·奥克斯

@Benjamin:您确实暗中搜索了它。那就是:s所做的。搜索模式,然后对匹配项进行转换。使用:nohl是正确的解决方案,因为它会关闭当前搜索模式的高亮显示,直到执行下一个搜索为止。这样做不会更改'hlsearch'选项的状态或影响前一个搜索词的存储值。
jamessan

2
@jamessan:我知道这是一个搜索和替换。只是我不需要突出显示它。通常,烦恼比什么都重要。
本杰明·奥克斯

不久前,我开始默认关闭高亮显示,然后如您建议的那样在需要时将其打开。仍然不完美,但是更好。
本杰明·奥克斯

9

我有两种不同的解决方案,两者都非常好,每种方案都有细微的不同行为。我最喜欢的是选项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的所有可能性,但是对于概念验证而言,这已经足够了。


感谢您的更新-直到现在才看到它。(看起来您也添加了它吗?有趣的是。)我将不得不玩它。
本杰明·奥克斯

需要注意的是2.使其V无法使用可视模式进行搜索
Bryce Guinta

我使用以下命令修改了选项1中的第一行。 autocmd cursorhold * set nohlsearch | let @/ = "" 这将清除搜索寄存器并删除突出显示的内容。并没有花太多时间进行此设置,但我想将其发布给那些最终在这里使用的人。
伯克利·马丁内斯

2

我只是键入“ / asdf”(假设“ asdf”不在文件中)以消除突出显示。我知道这很简单,但是对我有用。


2
的想法与相同:noh,但并不总是有效。:)有趣的是,您提到:我以前有个朋友总是输入他的名字,因为它的出现频率比他写的“ asdf”之类的少。(我想,金达很有趣。)
本杰明·奥克斯

真正。也许我会记住:下次不。
格雷格·格雷厄姆

1

将以下内容放入您的.vimrc文件:

nnoremap <silent> <F11> :exe ":silent! normal /$^\r"<CR>

这将静默隐藏突出显示的搜索词,但不会禁用该:set hlsearch功能。在下一次搜索中再次激活它。


最好只使用为此目的设计的内置命令-:nohl。然后,您就不会浪费搜索寄存器的内容了,它用于诸如跳转到下一个匹配项,未指定时的模式默认值之类的
事情。– jamessan

是的,但令我感到恼火的是,我的下一次搜索没有按预期突出显示。所以我想出了这个快速的解决方案。它可能也很脏,但是可以工作。我认为这对于vim是可以接受的-即使我不会在真正的大型项目的源代码中使用“肮脏的”东西。
GregorMüllegger2010年

1

另一种可能性是@/在执行替换后重置寄存器(实际上是读写寄存器)。这将还原先前的突出显示:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.