如何在Vim中双击以突出显示单词的所有出现情况

7
当我在Windows上时,我使用notepad ++,在Linux上我使用vim。我真的很喜欢vim。但是,在notepad ++中有至少一件事情我觉得非常有趣。您可以双击单词,它会自动突出显示该单词的所有出现。我想知道是否能在vim中做类似的事情?因此,问题是当您双击vim中的单词时如何突出显示该单词的所有出现。
显然,我不想搜索那个单词或更改我的光标位置,只想突出显示。我的:set hlsearch也已打开。
也许您想在vim中避免使用鼠标,但我在这里例外:)。
我知道*可以完成同样的工作,但鼠标怎么办?

  • 将光标移动到下一个单词出现的位置。
- Donglei
2个回答

20

如果您想像*一样突出显示光标下的单词,但不想移动光标,则建议执行以下操作:

nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>

这个命令将搜索寄存器 (@/) 设置为当前单词,并打开 'hlsearch' 以便高亮显示结果。通过设置 @/,光标不会像使用 *# 命令时那样移动。

解释:

  • <silent> - 不显示执行后的命令
  • <2-LeftMouse> - 使用左键双击
  • @/ 是用于使用 /? 进行搜索的寄存器
  • expand('<cword>') 获取光标下的当前单词
  • escape(pattern, '\') 转义正则表达式中的元字符
  • \V 使用非魔术模式,因此必须使用 / 转义所有元字符
  • \<\> 确保当前单词位于单词边界上
  • set hls 打开 'hlsearch',以便出现高亮显示

如果设置 @/ 寄存器不是你的菜,那么你可以使用 :match 命令,像这样:

nnoremap <silent> <2-leftMouse> :exe 'highlight DoubleClick ctermbg=green guibg=green<bar>match DoubleClick /\V\<'.escape(expand('<cword>'), '\').'\>/'<cr>

要清除匹配的内容,只需要使用:

:match none

1
这是我在 .vimrc 文件中拥有的最有用的一行代码。非常感谢! - Pieter-Jan

17

你可以通过简单映射将 * 映射到双击:

:map <2-LeftMouse> *

如果您想在插入模式下使用该功能,可以使用此映射:

:imap <2-LeftMouse> <c-o>*

如果不使用(Ctrl-o),*会被打印出来。

[编辑] 正如ZyX所指出的那样,使用noremapinoremap总是一个好主意,如果你想确保*<c-o>将被映射到其他内容,这个递归映射就不会被展开。


@aminfar:我很高兴能帮到你;)我还学到了一个新技巧,*可以搜索光标下的单词XD这就是我喜欢VIM的原因之一:每天都能学到一个新技巧;) - das_weezul
3
你应该使用noremapinoremap,这会使映射免疫重映射 *<C-o> - ZyX
4
将把光标移动到下一个单词。如果你想保持光标在当前单词上,尝试使用map <2-LeftMouse> *# - Yep_It's_Me
@Yep_It's_Me - 这会将光标移回到开头 - 这有什么作用?我不明白你的意思。 - serup
@Yep_It's_Me,我使用带有多个终端的tmux,其中之一是TDD的输出-在该窗口中,我希望双击移动光标,但我明白你的意思。 - serup
显示剩余2条评论

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