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

Posted

技术标签:

【中文标题】像在 NetBeans 中一样在 Vim 中突出显示光标下的变量【英文标题】:Highlight variable under cursor in Vim like in NetBeans 【发布时间】:2010-12-05 19:01:26 【问题描述】:

我曾在 NetBeans 中工作并喜欢此功能:当您将光标放在变量名中时,该变量的所有出现都会突出显示。这对于快速搜索所有出现的变量非常有用。是否可以将此行为添加到 Vim?

【问题讨论】:

【参考方案1】:

如果你设置了

:set hlsearch

突出显示所有出现的搜索模式,然后使用*# 来查找光标下的单词的出现,这将为您提供一些您想要的方式。但是我认为语法感知变量突出显示超出了 VIM 的范围。

【讨论】:

您的解决方案很棒!唯一的问题是当我使用 * 时,光标会跳转到下一个搜索结果。光标不能一直停留在当前单词上吗? @Meysam - 你可以创建一个简单的映射来做到这一点(未经测试):nmap * *N 作为对 lukaszkorecki 评论的补充:如果您希望光标保持在同一位置,您可以使用 nmap <leader>* `` (双反引号)【参考方案2】:

这个自动命令会做你想做的事:

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

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

:so $VIMRUNTIME/syntax/hitest.vim

【讨论】:

如果我将光标移到 C 风格注释的末尾(星号后跟斜杠),我会得到 E488: Trailing characters: match IncSearch /\&lt;*/\&gt;,我什至必须在继续之前按 Enter,非常烦人!我想它应该以某种方式逃脱和/或至少可以找到一种方法使警告静音。无论如何,很棒的提示。 好的,很简单,我只需要把它改成:autocmd CursorMoved * silent! exe printf('match IncSearch /\&lt;%s\&gt;/', expand('&lt;cword&gt;')) @UncleZeiv:我已经修复了逃避模式的答案。 “沉默!”只抑制错误 - 最好修复它们的原因.. ;) 任何慈善人士可以解释一下这个命令是如何工作的吗? Netbeans 将突出显示可通过当前所选变量的上下文访问的变量。它知道在 lamda 函数中声明的相同变量与包含它的普通函数之间的区别,并将相应地突出显示。是否可以在突出显示中引入这种特定于语言的智能?【参考方案3】:

我认为您真正想要的是 Shuhei Kubota 的以下插件:

http://www.vim.org/scripts/script.php?script_id=4306

根据描述:'这个脚本像许多IDE一样突出光标下的单词。'

干杯。

【讨论】:

【参考方案4】:

此语句将允许变量启用/禁用突出显示光标下单词的所有出现:

: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

【讨论】:

【参考方案5】:

如果您不想在光标位于这些单词上时突出显示语言单词(语句/ preprocs,例如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()

【讨论】:

【参考方案6】:

此变体针对速度(使用 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

【讨论】:

【参考方案7】:

vim_current_word 开箱即用,具有语法意识,并允许自定义颜色。

【讨论】:

【参考方案8】:

映射 F2 以切换突出显示:

map <F2> :set hlsearch!<CR> * #

这当然不是完美的。 '* #' 跳的有点多……

【讨论】:

【参考方案9】:

类似于接受的答案,但这种方式允许您在将光标悬停在单词上之后设置延迟时间,然后突出显示才会出现。 1000 以毫秒为单位,表示它将在 1 秒后突出显示。

set updatetime=1000

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

请参阅:h CursorHold 了解更多信息。

【讨论】:

【参考方案10】:

vim-illuminate 对我有用。

match-up 对我有用。

vim 匹配:更好的 % 导航和突出显示匹配的单词现代 matchit 和 matchparen

特点

在匹配词之间跳转 跳转到打开和关闭单词 跳进去 (z%) 全套文本对象 突出显示 ()、[] 和 突出显示所有匹配的单词 屏幕外显示匹配 显示您的位置(面包屑) (neovim)tree-sitter 集成

【讨论】:

以上是关于像在 NetBeans 中一样在 Vim 中突出显示光标下的变量的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit:你如何突出场景的一部分,就像在教程中一样?

更改 netbeans 中单个文件的语法突出显示

更改netbeans中自动突出显示的变量名的突出显示颜色?

崇高文本 3 提示,如在 NetBeans 中

在 Mac OS 中使用 Netbeans+ Cakephp 突出显示 .ctp 文件的语法

像在 Jupyter 中一样从函数中打印数据帧 [重复]