如何在vim中自动高亮当前单词?

7
例如,我们的文本是:
hello world
abcd hello world
hello world

在Eclipse中,当您的光标停留在某个单词时,当前文件中的单词"hello"会自动高亮显示。在正常模式下键入"ww"时,光标位于其他单词"world "上,该单词将在当前文件中突出显示,"hello"将自动取消高亮显示。这个功能对用户非常方便。
请问Vim有没有相应的插件或其他方式可以实现这个功能?
4个回答

10

像这样的吗?

set updatetime=10

function! HighlightWordUnderCursor()
    if getline(".")[col(".")-1] !~# '[[:punct:][:blank:]]' 
        exec 'match' 'Search' '/\V\<'.expand('<cword>').'\>/' 
    else 
        match none 
    endif
endfunction

autocmd! CursorHold,CursorHoldI * call HighlightWordUnderCursor()

这不会覆盖搜索寄存器,但会使用与通常使用的相同的高亮显示(如果你想要不同的高亮颜色,请将Search更改为所需的高亮群组)。需要较短的更新时间以便CursorHold事件能够相当经常地触发。此外,如果光标位于标点符号或空格之上,则不会突出显示任何内容。

iskeyword设置确定在使用expand('<cword>')时认为哪些是单词的一部分。


这很棒,因为它不会覆盖搜索寄存器! - aharris88
你能更具体地说明如何使颜色与搜索高亮不同吗? - lsimmons
哇,它完美地运行了,几行vimscript代码可以改变生活。 - 1234
1
@lsimmons 输入 :highlight 可以查找所有不同的高亮组名称(第一列)。将单词“'Search'”替换为新的高亮组名称。例如::s/Search/ErrorMsg - FDinoff

5

在 @FDinoff 很棒的答案基础上进行改进,可以自定义高亮的暗色背景和下划线,并在快速修复列表、fugitive 文件类型和差异模式下禁用:

function! HighlightWordUnderCursor()
    let disabled_ft = ["qf", "fugitive", "nerdtree", "gundo", "diff", "fzf", "floaterm"]
    if &diff || &buftype == "terminal" || index(disabled_ft, &filetype) >= 0
        return
    endif
    if getline(".")[col(".")-1] !~# '[[:punct:][:blank:]]'
        hi MatchWord cterm=undercurl gui=undercurl guibg=#3b404a
        exec 'match' 'MatchWord' '/\V\<'.expand('<cword>').'\>/'
    else
        match none
    endif
endfunction

augroup MatchWord
  autocmd!
  autocmd! CursorHold,CursorHoldI * call HighlightWordUnderCursor()
augroup END

4

是的,有一个vim插件可以自动高亮显示单词出现的位置。这个插件专门用于在.php文件中的$variables->properties

演示: enter image description here

这个插件则适用于Perl文件。

演示:

enter image description here

也许你可以根据自己的需求进行修改。


@jinleileiking 如果您喜欢这个插件,可以尝试更改这一行 https://bitbucket.org/sras/vawa/src/303c32f257113115ed724018ed13f229d7a6759c/plugin/vawa.vim?at=default#cl-80 和第81行 *.php -> * - Kent
@Kent 我认为改变那一行(第81行)不会产生任何影响。脚本只突出显示$variable->properties。因此它只会突出显示以$->开头的单词。 - blackbishop
1
@blackbishop 哦,抱歉,我没有检查插件的功能。那么 OP 需要检查并更改正则表达式。 - Kent

3

vim.wikia.com 上有一份脚本,可以实现你所需的功能。它将等待你停止移动光标,然后突出显示当前单词的所有实例。您随后可以使用 nN 跳转到它们之间,就像使用搜索结果一样。

我在此复制该脚本以防链接失效:

" 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

如该页面上的评论所述,如果您想一直使用此功能,可以在定义函数后从vimrc中调用它。这样,您可以使用z/(或您分配的其他快捷键)来稍后关闭它。


工作了!虽然有一些小错误。可以改变高亮颜色吗? - jinleileiking
我认为它使用你设置为“IncSearch”的任何颜色。请参阅:h hl-IncSearch获取帮助。 - Matthew Strawbridge
1
它可以作为一个函数工作,但无法自动启动。如果从 .vimrc 中调用它作为一个函数,它会打印 ON 消息,但它不起作用。只使用 'guts' 也是一样的。 - Luka Bradeško

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接