2009-10-11 82 views

回答

81

的自动命令会做你想要什么:

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

vi highlight current word

编辑:我已经使用了IncSearch高亮组在我的例子,但你可以找到其他颜色通过运行这个使用命令:

:so $VIMRUNTIME/syntax/hitest.vim 
+0

有没有一种方法来消除匹配错误? – UncleZeiv 2010-01-27 17:07:10

+0

@UncleZeiv:我不太清楚你的意思是错误 – 2010-01-27 22:09:20

+0

如果我将光标移到C样式注释(星号跟斜杠)的末尾,我得到E488:尾随字符:匹配IncSearch/\ <*/\> ',而且我甚至必须在继续之前按Enter键,非常烦人!我想它应该以某种方式逃脱,并且/或者至少可以找到一种方法来消除警告。无论如何伟大的提示。 – UncleZeiv 2010-01-28 14:28:20

18

如果设置

:set hlsearch 

突出显示搜索模式的所有事件,然后用*#找到你的光标下的单词的出现,将会给你一些方法你想要什么。不过,我认为语法感知的变量突出显示超出了VIM的范围。

+1

您的解决方案非常棒!唯一的问题是当我使用*光标跳转到下一个搜索结果。难道不能将光标保留在当前单词上吗? – Meysam 2011-05-10 04:59:33

+2

@Meysam - 你可以创建一个简单的映射,只是(未经测试):nmap * * N – lukaszkorecki 2012-02-24 13:41:23

5

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

: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 
2

如果你不想突出语言的话(报表/ 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()