突出显示所选单词的所有出现?


159

如何在GVim中突出显示所选单词的所有出现,例如在Notepad ++中?

Answers:


202

在普通模式下:

:set hlsearch

然后搜索与所述命令的图形/在正常模式下,或者<Ctrl>o随后/在插入模式。*在正常模式下,将在光标下搜索单词的下一个出现位置。hlsearch如果设置,该选项将突出显示所有这些选项。#将搜索单词的先前出现。

要删除上一个搜索的突出显示:

:nohlsearch

您可能希望映射:nohlsearch<CR>到一些方便的键。


34
如果您打算进行hlsearch多次切换,则可能要映射:set hlsearch!而不是:set nohlsearch。这将切换设置,而不是始终将其关闭。
大卫·温斯洛

1
另外,请注意,光标将移动到单词的上一个(#)或下一个(*)
Juan Campa

1
但是你可以回去的地方,你按压的位置*#通过<Ctrl>o在正常模式下。
Ruslan 2015年

8
而是:nohlsearch可以使用:noh
crisron

设置为.vimrcnoremap <F4> :set hlsearch! hlsearch?<CR>用于在高光之间切换,并通过删除高光<F4>
Chalist

124

*键将突出显示光标下所有出现的单词。


31
仅在&hlsearch打开时。
威廉希尔

10
它还将跳到光标下该单词的下一个出现位置。如果要跳到上一个出现的位置,请使用#
Vinicius Pinto 2014年

7
我可以使其保持在当前位置吗?
nn0p

@ nn0p是的,您可以–在这种情况下,请遵循公认的答案stackoverflow.com/a/3431203/363688。这只是一个替代动作,还将突出显示所有出现的事件。
sleepynate '16

1
有没有办法使用此功能,但突出显示一个或多个单词?
成祖

22

我知道这是一个非常老的问题,但是如果有人对此功能感兴趣,可以查看此代码 http://vim.wikia.com/wiki/Auto_highlight_current_word_when_idle

" Highlight all instances of word under cursor, when idle.
" Useful when studying strange source code.
" Type z/ to toggle highlighting on/off.
nnoremap z/ :if AutoHighlightToggle()<Bar>set hls<Bar>endif<CR>
function! AutoHighlightToggle()
   let @/ = ''
   if exists('#auto_highlight')
     au! auto_highlight
     augroup! auto_highlight
     setl updatetime=4000
     echo 'Highlight current word: off'
     return 0
  else
    augroup auto_highlight
    au!
    au CursorHold * let @/ = '\V\<'.escape(expand('<cword>'), '\').'\>'
    augroup end
    setl updatetime=500
    echo 'Highlight current word: ON'
  return 1
 endif
endfunction

1
是否可以修改此脚本,以便即使将光标移动到其他单词时,按z /时最初突出显示的光标下面的文本也保持突出显示?当在源代码中滚动查找初始单词时,这将很有用。
stensootla

18

最简单的方法,在普通模式下键入 *

我也有这些映射来启用和禁用

"highligh search enabled by default
set hlsearch
"now you can toggle it
nnoremap <S-F11> <ESC>:set hls! hls?<cr>
inoremap <S-F11> <C-o>:set hls! hls?<cr>
vnoremap <S-F11> <ESC>:set hls! hls?<cr> <bar> gv

通过单击选择单词

set mouse=a     "Enables mouse click
nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>

奖励:CountWordFunction

fun! CountWordFunction()
    try
        let l:win_view = winsaveview()
        let l:old_query = getreg('/')
        let var = expand("<cword>")
        exec "%s/" . var . "//gn"
    finally
        call winrestview(l:win_view)
        call setreg('/', l:old_query)
    endtry
endfun
" Bellow we set a command "CountWord" and a mapping to count word
" change as you like it
command! -nargs=0 CountWord :call CountWordFunction()
nnoremap <f3> :CountWord<CR>

用鼠标选择单词并一次计算出现次数:OBS:请注意,在此版本中,我们在末尾有“ CountWord”命令

nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>

现在我用nnoremap * *``cgnnnoremap # #``cgN
SergioAraujo

所以输入后*,如何关闭高亮显示?
user5359531

这是为了突出显示文档中的当前单词
Chalist

@ user5359531 :noh:nohlsearch
dylnmc

@ user5359531怎么样nnoremap <silent> * :execute "normal! *N"<cr>nnoremap <silent> # :execute "normal! #n"<cr>?这些只是突出显示光标下的单词,但不会将其移到下一个出现的位置。
dylnmc

10

基于搜索的解决方案(*/...)移动光标,这可能是不幸的。

一种替代方法是使用增强的mark.vim插件,然后完成.vimrc使双击触发突出显示的操作(我不知道键盘选择如何触发命令):

"Use Mark plugin to highlight selected word  
map <2-leftmouse> \m   

它允许多个突出显示,持久性等。

要删除突出显示,请执行以下任一操作:

  • 再次双击
  • :Mark (关闭直到下一个选择)
  • :MarkClear

2
基于搜索的解决方案仅在启用渐进式搜索的情况下才移动光标。您可以像这样将其关闭::set noincsearch。在我看来,它是Vim中最烦人的功能之一,也是我为全新安装禁用的第一件事。
jahroy 2013年

3
我认为*将无条件移动光标。而且我看不到incsearch会有什么烦人的事,因为这只是“向前看”,在不实际改变您的位置的情况下执行当前搜索。
YvesgereY

3
哇...你是对的。我以为关闭incsearch会阻止移动,但是快速测试可以确认您是正确的。我很抱歉。然而,它的超级容易地创建一个映射,以防止运动::nnoremap * *N。我不敢相信您执行搜索时会在屏幕上跳过光标,这并不令人讨厌。但是...这些事情完全是主观的。Vive
ladifférence

3
您也可以:let @/='hilight_this'假设已hlsearch启用。它突出显示文本而不会跳转,您不必更改现有设置。这将更改当前存储在搜索寄存器中的值。
本·戴维斯

1
这应该是公认的答案。<leader> m完成任务,无需映射双击。
Sassan

4

首先(或在您的.vimrc中):

:set hlsearch

然后将光标放在要突出显示的单词上,然后按*

hlsearch表示突出显示当前搜索的所有出现,并*表示搜索光标下的单词。


3

首先通过发出以下命令确保hlsearch已启用

:set hlsearch

您还可以按设置将此添加到您的.vimrc文件中

set hlsearch

现在,当您在命令模式或常规搜索命令中使用快速搜索机制时,所有结果都将突出显示。要在结果之间向前移动,请按“ n”向后移动,按“ N”

在普通模式下,要快速搜索光标下方的单词并跳至一个命令中的下一个出现的单词,请按“ *”,也可以搜索光标下方的单词并按“#”移至上一个出现的单词'

在正常模式下,也可以使用

/searchterm<Enter>

要删除有关使用场合的提示,我已将其绑定到我的.vimrc中的快捷方式

:nohl



2

高亮显示单词而不移动光标

" highlight reg. ex. in @/ register
set hlsearch
" remap `*`/`#` to search forwards/backwards (resp.)
" w/o moving cursor
nnoremap <silent> * :execute "normal! *N"<cr>
nnoremap <silent> # :execute "normal! #n"<cr>

进入您的vimrc。

这样做的好处是g*,它g#仍然可以像“ normal” *和一样工作#


要设置hlsearch关闭,你可以(除非你有另一个功能是在命令模式“能剧”开始)使用“短表”: :noh。或者您可以使用长版本::nohlsearch

为了提供极大的便利(我发现自己hlsearch每天可能切换20次),您可以映射一些内容来进行切换,hlsearch如下所示:

" search highlight toggle
nnoremap <silent> <leader>st :set hlsearch!<cr>

。:。如果您<leader>\(默认情况下),则可以\st正常模式下按(快速)进行切换hlsearch

或者,也许您只想:noh映射:

" search clear
nnoremap <silent> <leader>sc :nohlsearch<cr>

上面的代码运行起来:nohlsearch很简单(不同于:set hlsearch!),下次您按*#正常模式下,它仍会突出显示单词。

干杯



1

autocmd CursorMoved * exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))

确保您已经IncSearch设置了某些内容。例如call s:Attr('IncSearch', 'reverse')。或者,您可以在其位置使用另一个突出显示组。

这将立即突出显示光标下所有出现的单词。我发现在浏览代码时,延迟会使我慢下来。突出显示的颜色将与单词的颜色匹配,因此与您的方案保持一致。


0

为什么不只是:z /

这将突出显示光标下的当前单词以及任何其他出现的单词。而且,您不必为要搜索的每个项目提供单独的命令。也许这在邪恶的gvim中是不可用的?默认情况下它在vim中。

*仅在您希望光标移动到下一个出现位置时才是好。在视觉上比较两件事时,您通常不希望光标移动,并且每次按*键都很烦人。


Vim和gvim通常具有相同的命令集。帮助文档中没有对“ z /”命令的引用。
wds 2014年

它不仅在gvim中可用,而且在vim中也不可用。刚刚检查了一下-显然行不通。
Ruslan 2015年

使用先前答案中提到的脚本时,z /可以工作。
fzzylogic

0
  1. ~/.vimrc文件中添加这些行

" highlight the searched items set hlsearch " F8 search for word under the cursor recursively , :copen , to close -> :ccl nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

  1. 重新加载设置 :so%
  2. 在普通模型中,请仔细阅读。

  3. 按*按F8键以单词的形式递归搜索整个项目


0

例如,此插件:

只需在vimawesome.com上的光标下搜索

正如clagccs所提到的,关键是突出显示与您的搜索不冲突https : //vim.fandom.com/wiki/Auto_highlight_current_word_when_idle

它与搜索不冲突的屏幕截图: 在此处输入图片说明 注意:

  • 默认情况下,vim会亮起高光,在我的屏幕截图中,我切换为下划线
  • 默认情况下,vim会亮起光标下方的高亮/下划线单词,在我的屏幕截图中,我未设置它
  • 我的色彩非常灰白。检查您的自定义。
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.