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

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

【问题讨论】:

    标签: vim netbeans highlight


    【解决方案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 集成

                  【讨论】:

                    猜你喜欢
                    • 2013-01-31
                    • 2015-10-21
                    • 2015-02-28
                    • 2011-07-31
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-10-23
                    • 2012-01-27
                    • 2012-11-02
                    相关资源
                    最近更新 更多