在Vim中像NetBeans一样突出显示光标下的变量

63

我之前使用 NetBeans,非常喜欢它的一个功能:当你把光标放在一个变量名上时,所有该变量的出现位置都会被高亮。这对于快速查找变量的所有出现位置非常有用。是否可能将此行为添加到 Vim 中?

10个回答

98

这个自动命令可以实现你想要的功能:

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

高亮当前单词的vi编辑器

编辑:在我的示例中,我使用了IncSearch高亮组,但你可以通过运行此命令找到其他可用的颜色:

:so $VIMRUNTIME/syntax/hitest.vim

9
好的,很容易,我只需要将其更改为:autocmd CursorMoved * silent! exe printf('match IncSearch /\<%s\>/', expand('<cword>')) - UncleZeiv
3
@UncleZeiv: 我已经修复了答案以逃避这个模式。 "silent!" 只是抑制错误 - 最好是修复它们的原因.. ;) - blueyed
3
有没有慈善的人能解释一下这个命令如何工作? - Sebastián Grignoli
3
Netbeans会强调出与当前选定变量上下文相关的变量。它知道在lambda函数中声明的同一变量和包含它的普通函数之间的区别,并相应地进行了突出显示。是否有可能在突出显示中引入这种语言特定的智能? - SenG
有没有可能不突出显示光标所在位置的单词?这个功能很好用,但是在屏幕上容易失去自己的位置。 - Karl
显示剩余4条评论

24
如果您设置了

:set hlsearch

要突出显示所有搜索模式的出现,并使用*#查找光标下单词的出现,这将使您达到部分想要的目标。但是,我认为语法感知变量高亮超出了VIM的范围。

1
你的解决方案很棒!唯一的问题是当我使用 * 时,光标会跳到下一个搜索结果。难道不能让光标停留在当前单词上吗? - B Faley
2
@Meysam - 你可以创建一个简单的映射来实现这一点(未经测试):nmap <leader>* *N - lukaszkorecki
1
作为lukaszkorecki评论的补充:如果你想让光标保持在同一位置,你可以使用nmap <leader>* (双反引号) - Vladimir Zhdanov

9
这个语句将允许一个变量来启用/禁用高亮显示光标下单词的所有出现:
:autocmd CursorMoved * exe exists("HlUnderCursor")?HlUnderCursor?printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\')):'match none':""

要启用高亮显示,可以使用以下方法:

:let HlUnderCursor=1

并使用以下代码禁用:

:let HlUnderCursor=0

可以很容易地为启用/禁用高亮定义快捷键:

:nnoremap <silent> <F3> :exe "let HlUnderCursor=exists(\"HlUnderCursor\")?HlUnderCursor*-1+1:1"<CR>

删除变量会阻止匹配语句的执行,但不会清除当前高亮。
:unlet HlUnderCursor

6

如果您不想在光标停留在语言单词(如if#define等)上时突出显示这些单词,您可以根据@too_much_php的回答将此功能放入您的.vimrc中:

let g:no_highlight_group_for_current_word=["Statement", "Comment", "Type", "PreProc"]
function s:HighlightWordUnderCursor()
    let l:syntaxgroup = synIDattr(synIDtrans(synID(line("."), stridx(getline("."), expand('<cword>')) + 1, 1)), "name")

    if (index(g:no_highlight_group_for_current_word, l:syntaxgroup) == -1)
        exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))
    else
        exe 'match IncSearch /\V\<\>/'
    endif
endfunction

autocmd CursorMoved * call s:HighlightWordUnderCursor()

5

1
将 F2 映射为切换高亮显示:
map <F2> :set hlsearch!<CR> * #

这肯定不是完美的。'* #' 跳动得有点多...


1

vim_current_word 可以直接使用,支持语法高亮,并且允许自定义颜色。


0

这个变量是为了速度优化而设计的(使用CursorHold而不是CursorMoved),并且与hlsearch兼容。当前搜索词的高亮显示不会被打断。

" autosave delay, cursorhold trigger, default: 4000ms
setl updatetime=300

" highlight the word under cursor (CursorMoved is inperformant)
highlight WordUnderCursor cterm=underline gui=underline
autocmd CursorHold * call HighlightCursorWord()
function! HighlightCursorWord()
    " if hlsearch is active, don't overwrite it!
    let search = getreg('/')
    let cword = expand('<cword>')
    if match(cword, search) == -1
        exe printf('match WordUnderCursor /\V\<%s\>/', escape(cword, '/\'))
    endif
endfunction

0

与被接受的答案类似,但这种方法允许您在将光标悬停在单词上后设置延迟时间,然后突出显示。 1000 的单位是毫秒,意味着它将在 1 秒后突出显示。

set updatetime=1000

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

更多信息请参见:h CursorHold


0

vim-illuminate 对我很有用。

match-up 对我很有用。

vim match-up: 连同 modern matchit 和 matchparen,更好的 % 导航和高亮匹配单词

特性

  • 跳转到匹配单词
  • 跳转到开启和结束单词
  • 在括号内跳转(z%)
  • 完整的文本对象集合
  • 突出显示 (), [], 和 {}
  • 突出显示全部匹配单词
  • 显示屏幕外匹配单词
  • 显示当前位置(面包屑导航)
  • (neovim) tree-sitter 集成

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