ChatGPT解决这个技术问题 Extra ChatGPT

Vim 清除上次搜索突出显示

想要改进这篇文章?提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。

在 Vim 中进行搜索后,我会突出显示所有出现的事件。我怎样才能禁用它?我现在再次搜索无法找到的乱码。

有没有办法暂时禁用突出显示,然后在需要时重新启用它?

:set invhlsearch 如果已经突出显示,则禁用突出显示,如果未突出显示,则启用它。您可以将其映射为 Shift-H。
@StewartJohnson 在我的 .vimrc 文件中这样做似乎会干扰/破坏 :set mouse=a。任何想法为什么?这个错误只发生在 iTerm2
多年来,我输入了很多乱码来清除该突出显示(对于多 GB 文本文件来说效率非常低)。乱码搜索本质上是浪费计算时间的第二次搜索。好问题!
@StewartJohnson 小心!您的带有映射的评分最高的评论会导致错误和意外行为,如下面对 stackoverflow.com/a/1037182/1698467 的评论中所述
@StewartJohnson 建议的 nnoremap <esc> :noh<return><esc> 解决方案在 GUI vim 中运行良好,但在终端中运行 vim 时会导致箭头键和其他 ESC 编码键出现问题。 不要将其放入您的 ~/.vimrc 中而不将其包装在 if has('gui_running') ... end 中。

q
qwertzguy

要在下一次搜索之前关闭突出显示:

:noh

或者完全关闭突出显示:

set nohlsearch

或者,切换它:

set hlsearch!

nnoremap <F3> :set hlsearch!<CR>

从这个答案和评论中并不清楚这一点:请注意,set nohlsearch 也会禁用下一次搜索的突出显示。 :noh 的行为非常不同:当您执行新搜索时,甚至当您执行与当前搜索相关的操作时(例如,当您键入 n 转到下一项时),突出显示将自动重新启用。
我把它映射到 <Ctrl-L>因为这是我清理屏幕的首选按键。这是我的映射:nmap <silent> <C-L> <C-L>:nohlsearch<CR>:match<CR>:diffupdate<CR>
@Rainning,这是您要放入 .vimrc 的内容吗?如果没有,您可以在 .vimrc 中添加什么以在每次搜索后永久启用 :noh?
对于 2021 年的读者:nnoremap <nowait><silent> <C-C> :noh<CR>
@LiamClink:我已经更新了命令,应该是 nnoremap。是的,你应该把它放在你的 .vimrc 中。我不明白你的问题,因为下次你在键盘上敲/并输入一个新的关键字进行搜索时,旧的都被替换了,所以你只需在每次搜索后由<C-C>自己清理.
g
gcochard

VIM Documentation

要清除上次使用的搜索模式:

:let @/ = ""

这不会将模式设置为空字符串,因为它会在任何地方匹配。模式真的很清晰,就像启动 Vim 时一样。


...据我了解,这将是解决他的问题的更好方法。
这就是我要找的!我投了赞成票,这个问题有点模糊。这使我认为这就是他想要的:“我现在再次搜索无法找到的乱码”。因为那是我正在做的清除搜索,但没有禁用它,所以下一次搜索会再次突出显示。
这就是我认为的问题...这是我为加快清除搜索字符串(并因此删除所有突出显示)而执行的命令::command C let @/="" 使用此命令可让您键入 :C 以清除搜索字符串... 非常快,不会影响以后的搜索或突出显示。
@jcreamer898,请参阅有关“寄存器”(:he registers)的 vim 帮助。 Vim 有几个不同的内置寄存器来保存文本,有时用于提取数据,有时用于最后搜索等。当您进行搜索时,vim 将模式放入“/”寄存器中,您可以使用 @/ 引用它。您还可以使用 @regname=value 为寄存器分配值,其中 regname 是寄存器的名称。因此,@/="" 只是将寄存器 "/" 设置为空字符串(除了 "/" 寄存器,如果它包含空字符串,vim 将清除最后一次搜索)。
将此添加到您的 .vimrc 以获得 Ctrl+/ 以清除上次搜索:noremap <silent> <c-_> :let @/ = ""<CR>
R
Rory O'Kane

你可以做

:noh

:nohlsearch 暂时禁用搜索突出显示,直到下一次搜索。


谢谢,这很有帮助......返回突出显示的任何命令?
:nohs 只是关闭当前突出显示。如果您有 :set hlsearch 那么它将继续突出显示您的搜索。
我认为这就是 OP 正在寻找的内容(尽管 Shaun 的回答也有效)。我赞成这个更短。我知道他接受了 nohls 的答案,但设置它会禁用所有搜索突出显示,即使之后尝试了另一个搜索。
这可能是 OP 首先想要的,并且是最短、最好的答案恕我直言。
即使在这凡间也可以达到完美!我会使用它而不是 :help,并且不想污染 : nnoremap :noh
佚名

几年前我在 vim.org 上找到了这个答案:

将以下内容添加到您的 .vimrc 中:

"This unsets the "last search pattern" register by hitting return
nnoremap <CR> :noh<CR><CR>

因此,在您搜索后,只需在命令模式下再次按回车键,突出显示就会消失。


我认为这是一个比实际被接受的解决方案更好的解决方案——无论是这个解决方案还是映射到 的另一个解决方案。
这是对“nnoremap :noh”的更好回答,因为它不会导致奇怪的行为。
需要注意的重要一点是,请确保不要在重映射的右侧放置任何评论。它们将被解释为重映射的命令,而不是注释。
评论错误;该命令不会取消设置最后一个搜索模式,而只是关闭当前结果的突出显示;您可以点击 n 查找下一个匹配项(将再次突出显示)。顺便说一句,在编写脚本时,我会避免使用缩写形式,而是写 :nohlsearch
添加 以避免显示闪烁并在命令行中留下 noh - :nnoremap :nohlsearch
C
Community

来自http://twitter.com/jonbho/status/2194406821

" Clear highlighting on escape in normal mode
nnoremap <esc> :noh<return><esc>
nnoremap <esc>^[ <esc>^[

mapping to the escape key 需要第二行,因为 Vim 内部使用转义来表示特殊键。


为了清楚起见,这使您可以通过按 Escape 键清除搜索突出显示
出于某种原因,这使我的终端 vim 启动时就像按下了“c”一样。有任何想法吗?
当我尝试它时,这导致了一些非常奇怪的行为:在启动时,常规的 vim 运动(例如 j,k)会导致行被删除。 nnoremap :noh 没有引起这些问题。我无法找到根本原因。
嗯,我遇到了和上面一样的问题。除非您喜欢随机删除文本,否则不要在未经测试的情况下按原样使用它...
使用 "nnoremap :noh" 使 vim 总是以 "REPLACEMENT" 模式启动。
m
millerdev

我最初的解决方案(下)是肮脏和浪费的。我现在使用 :noh

像 Vim 中的许多特性一样,正确的方法通常不容易被发现。

--

(不要这样做)

搜索一个不太可能的字符序列(混合主行上的键):

/;alskdjf;

这适用于 vim 和更少,并且比@ShaunBouckaert 逻辑上更简洁的解决方案“清除最后使用的搜索模式”更容易记住/输入:

:let @/ = ""

一个潜在的缺点是它会在您的搜索历史记录中添加垃圾内容。


这不仅是一个肮脏的解决方案(我自己直到现在才使用它,没有冒犯),另一个缺点是它在窗口底部添加了一个丑陋的红色横幅,上面写着“找不到图案”,这几乎和突出显示一样烦人本身并需要丢弃进一步的操作(例如“搜索+退格”)。
它也可能需要几秒钟,因为它实际上会搜索整个文件的其余部分。如果文件很大,那真的很烦人。当然,你可以标记你当前的位置,跳到开头,然后向后搜索一个字符,但这同样很脏。
这是大多数人了解 :nohl 命令之前会使用的解决方案。一旦我了解了后者,我立即停下来进行这些搜索。
这不是答案;它只是建议做 OP 已经做过的事情:“我现在再次搜索一些无法找到的乱码。”
如果您想要一个简单而简短的模式,只需使用 /$4。它不仅不可能匹配任何东西,而且实际上完全不可能。 $ 必须始终跟在换行符之后或者是文件的结尾,并且 4 既不是换行符也不是文件的结尾。 (具体是4的原因,就是在同一个键上,所以打字真的很方便)
A
Anthony Geoghegan

提出 :noh:nohlsearch 的答案(例如,Matt McMinn 的)对于 暂时禁用搜索突出显示是正确的 - 正如在原始问题中所问的那样。

我想我会贡献一个我觉得在普通模式下有用的映射:

nnoremap <C-L> :nohlsearch<CR><C-L>

默认情况下,Vim 中的 CtrlL 清除并重绘屏幕。许多命令行程序(主要是那些使用 GNU Readline library 的程序,例如 Bash)使用相同的组合键来清除屏幕。此功能在后台运行的进程打印到终端,覆盖前台进程的部分的情况下很有用。

此正常模式映射还会在重绘屏幕之前清除最近搜索词的突出显示。我发现这两个功能相辅相成,将一个 CtrlL 一起用于两个操作而不是创建单独的映射来禁用搜索突出显示很方便。

注意: 使用 noremap 而不是 map,否则映射将是递归的。

提示:我通常将 Caps Lock 重新映射为 Ctrl,以便更轻松地键入此类组合键;执行此操作的详细信息取决于您选择的操作系统/窗口系统(并且与此答案无关)。以下两个提示都包括有关将 Caps Lock 映射到 Ctrl 以及 Esc 的信息:

地图大写锁定以在 XWindows 中转义

地图大写锁定以在 Windows 中转义


s
sjas
nnoremap silent <cr> :noh<cr><cr>

这样,在搜索后点击 enter 时,我就摆脱了命令行中显示的 :noh

就像开始输入一个新命令,Backspace 将其清除并将焦点放回编辑器窗口。


谢谢你。出现在左下角的“:noh”让我发疯了,该死的强迫症。
我试图通过执行 nnoremap :noh 将其映射到移动的 cr 但它不起作用,你知道它为什么不起作用吗?
我怀疑您不能将 shift 与 return 结合起来,但老实说我不知道。
@CharlieParker IIRC 您只能在 [a-z] 和此类字符上使用 shift。
除了 :<Backspace>,你可以在 nnoremap 之后添加 <silent> 来告诉 Vim 不要在命令区域显示任何输出:nnoremap <silent> <cr> :noh<CR><CR>
a
avocade

重新映射到我的 .vimrc.local 文件中,快速而肮脏但非常实用:

" Clear last search highlighting
map <Space> :noh<cr>

S
Sheharyar

永久禁用搜索突出显示

每当您使用 / 进行搜索时,匹配项都不会突出显示

:set nohlsearch

清除突出显示直到下一次搜索

:noh

:nohlsearch(清除直到按下 nN

按 ESC 清除突出显示

nnoremap <esc> :noh<return><esc>

按另一个键或自定义地图清除突出显示

按 \ (反斜杠) nnoremap \ :noh 清除突出显示

按两次 ESC 清除高亮显示 nnoremap :noh


nnoremap <silent> <esc> :noh<return><esc> 解决方案在 GUI vim 中运行良好,但在终端中运行 vim 时会导致严重问题使用箭头键和其他 ESC 编码键。 不要将其放入您的 ~/.vimrc 中而不将其包装在 if has('gui_running') ... end 中。还可以考虑添加 <silent> 以避免在状态栏中闪烁 :noh 命令。
t
the Tin Man

我通常将 :noh 映射到反斜杠键。要重新启用突出显示,只需点击 n,它将再次突出显示。


P
Pablo Olmos de Aguilera C.

这就是我使用的(从许多不同的问题/答案中提取):

nnoremap <silent> <Esc><Esc> :let @/=""<CR>

使用“double” Esc 可以删除突出显示,但是一旦再次搜索,突出显示就会重新出现。

另一种选择:

nnoremap <silent> <Esc><Esc> :noh<CR> :call clearmatches()<CR>

根据 vim 文档:

clearmatches() 清除之前由|matchadd()| 定义的所有匹配项。和 |:match|命令。


我在顶级解决方案中遇到了一些错误,因此为了节省您尝试所有答案的时间。 使用此解决方案! 编辑您的 .vimrc 并将以下条目放入其中:nnoremap <silent> <Esc><Esc> :let @/=""<CR>
但这就是它所说的 Oo 也许你可以投票?
我支持你的解决方案......这是最好的IMO......而且我也支持它...... :)
使用 @/="" 清除搜索寄存器的副作用是使 n 无法恢复您的搜索。我更喜欢 :noh,它将先前的搜索保留在寄存器中以供重复使用。
a
arcseldon

关闭突出显示直到下一次搜索

:noh

https://i.stack.imgur.com/Skzzj.gif


0
00prometheus

移动光标后立即关闭突出显示:

安装 vim-cool。它的创建是为了解决这个特定问题。只要您移动光标,它就会关闭突出显示。但请注意,它需要最新的 vim 版本!


这很容易解决问题。重新映射对我来说太过分了
最后,不再需要额外的按键来按下大声笑
应该是默认选项!
d
dkiyatkin

为此有两个“必备”插件:

明智的 - Ctrl-l 用于 nohlsearch 和重绘屏幕。 unimpared - [oh, ]oh 和 coh 来控制 hlsearch。


unimpaired 在 v2 中将 co 更改为 yo,所以它是 yoh。请参阅 github.com/tpope/vim-unimpaired/blob/v2.0/doc/unimpaired.txtgithub.com/tpope/vim-unimpaired/issues/150
coh 仍然有效,但如果您使用 coh,则会有一条消息建议您使用 yoh
D
Deqing

如果您安装了 incsearch.vim plugin,则有一个设置可以在搜索后自动清除突出显示:

let g:incsearch#auto_nohlsearch = 1

https://i.stack.imgur.com/75EF2.gif


t
the Tin Man

Janus for VIM and GVIM 为像我这样的新手准备了很多东西,包括

<leader>hs - toggles highlight search

这正是您所需要的。只需在正常模式下键入 \hs。 (leader key 默认映射到 \。)

HTH。


L
Lindsay Haisley

我的猜测是,最初的问题不是禁用搜索突出显示,而是简单地清除上次搜索的突出显示。原始发帖人提到的搜索乱码字符串的解决方案是我已经使用一段时间来清除先前搜索中的突出显示的解决方案,但它既丑陋又麻烦。

我发现将 nnoremap ... 添加到 ~/.vimrc 的几个建议在这里具有在启动时将 vim 置于替换模式的效果,这根本不是我想要的。我找到的最简单的解决方案是添加该行

nmap <esc><esc> :noh<return>

到我的 ~/.vimrc。这符合 KISS 原则,并且不会干扰使用单个 的箭头键。在命令模式下需要双 (或在插入或替换模式下使用三重 )来清除先前搜索的突出显示,但从 UI 的角度来看,这使得操作尽可能简单。


单个 干扰箭头键是什么意思?
@hansmosh 请参阅 unix.stackexchange.com/questions/28713/… 我在 .vimrc 中使用如下两行 nmap <esc><esc> :noh<return> - to turn off search highlighting and nmap <esc>` :set hlsearch<return> - to turn on search highlighting
M
Matthieu

我个人喜欢将 esc 映射到命令 :noh,如下所示:

map <esc> :noh<cr>

I wrote a whole article recently about Vim search:如何在 vanilla Vim 上搜索以及增强搜索功能的最佳插件。


重新映射 <esc>可能会出现问题,因为会自动添加超时,从而使重新进入正常模式变得很慢。 vi.stackexchange.com/questions/16148/…
t
the Tin Man

这将在 updatetime 毫秒不活动后清除搜索突出显示。

updatetime 默认为 4000 毫秒或 4 秒,但我将我的设置为 10 秒。请务必注意,updatetime 的功能不止于此,因此请在更改之前阅读文档。

function! SearchHlClear()
    let @/ = ''
endfunction
augroup searchhighlight
    autocmd!
    autocmd CursorHold,CursorHoldI * call SearchHlClear()
augroup END

A
Amaynut

如果您希望能够快速启用/禁用突出显示,您可以将一个键映射到

" Press F4 to toggle highlighting on/off, and show current value.
:noremap <F4> :set hlsearch! hlsearch?<CR>

只需将上面的代码片段放入您的 .vimrc 文件中。

这对我来说是最方便的方式来显示和隐藏搜索亮点

有关详细信息,请查看文档 http://vim.wikia.com/wiki/Highlight_all_search_pattern_matches


S
Stryker

我只使用下面的简单 nohl,不需要任何插件。

:nohl


s
skywinder

通过结合 2 个最佳答案的另一种解决方案:

"To clear the last used search pattern:
nnoremap <F3> :let @/ = ""<CR>

使用 @/="" 清除搜索寄存器的副作用是使 n 无法恢复您的搜索。我更喜欢 :noh,它将先前的搜索保留在寄存器中以供重复使用。您可以使用 nnoremap <F3> :noh<CR><F3> 绑定到
c
caopeng

你可以使用 :noremap 打开/关闭搜索结果,像这样

:noremap <F3> :set hls! hls?<CR>


J
John Slavick

我在 ~/.vimrc 中使用以下内容

nnoremap <Leader><space> :noh<Enter>

这使得清除当前突出显示的搜索变得非常容易和快速。我的前导键映射到 \,因此这使我的右手小指和拇指很容易执行该操作。


t
the Tin Man

我认为混合@ShaunBouckaert 和 2009 年 3 月 19 日 16:22 的答案是一个很好的折衷方案:

" Reset highlighted search
nnoremap <CR> :let @/=""<CR><CR>

按 Enter 键,突出显示的文本不再突出显示,而搜索突出显示仍处于启用状态。


d
dinigo

根据@baruch-even 的回答,您可以在正常模式下通过 ESC 双击删除搜索词:

nnoremap <esc> :let @/ = ""<return><esc>
nnoremap <esc>^[ <esc>^[

我认为第二个绑定还可以,但第一个很危险。重新映射 <esc> 在 GUI vim 中运行良好,但在终端中运行 vim 时会导致严重问题与箭头键和其他 ESC 编码键。 不要将其放入您的 ~/.vimrc 中而不将其包装在 if has('gui_running') ... end 中。还可以考虑添加 <silent> 以避免在状态栏中闪烁 :noh 命令。
r
ricardo

我也不喜欢。我发现一直输入 :nohl 很烦人......所以我将以下映射放在我的 .vimrc

noremap <C-_> :nohl<cr>:<backspace>

第一位 (:nohl<cr>) 清除突出显示;第二位 (:<backspace>) 是 clean 命令行的技巧。搜索仍在后台,因此如果您只需点击 n,它就会重新突出显示并带您到下一个搜索项。


a
ardnew

为这两种行为定义映射,因为两者都很有用!

完全清除搜索缓冲区(例如,按 n 进行下一个匹配将不会恢复搜索)

保留搜索缓冲区,并切换突出显示搜索结果 on/off/on/...(例如,按 n 将恢复搜索,但突出显示将基于切换的当前状态)

" use double-Esc to completely clear the search buffer
nnoremap <silent> <Esc><Esc> :let @/ = ""<CR>
" use space to retain the search buffer and toggle highlighting off/on
nnoremap <silent> <Space> :set hlsearch!<CR>

有了这个,如果我按 <Esc>后跟一个箭头键,它会弄乱缓冲区内容,因为箭头键开头的 Esc 与第一个 <Esc>我按下了,然后 vim 剩下的箭头键序列是垃圾。不,我还没准备好放弃 hjkl 的箭头键 :)
@Eric 我无法用 gVim 8.2.2824 重现它。你能详细说明一下吗?此外,请尝试在 <silent> 之前加上 <nowait>
不幸的是,像这样重新映射 <esc> 通常会在退出插入模式时导致烦人的延迟。请参阅vi.stackexchange.com/questions/16148/…
p
pixel 67

我将此添加到我的 vimrc 文件中。

command! H let @/=""

在您进行搜索并想要清除搜索中的亮点后,只需执行 :H