как выделить все вхождения слова в vim при двойном щелчке - PullRequest
5 голосов
/ 29 июля 2011

Когда я в Windows, я использую notepad ++, а в Linux я использую vim. Мне очень нравится Vim. Но есть по крайней мере одна вещь, которую я нахожу действительно интересной в notepad ++. Вы можете дважды щелкнуть слово, и оно автоматически выделит все вхождения этого слова. Мне было интересно, смогу ли я сделать что-то подобное с vim? Поэтому вопрос заключается в том, как выделить все вхождения слова, когда вы дважды щелкаете слово в vim.

Очевидно, я не хочу искать по этому слову или менять позицию курсора, просто выделяя. Мой :set hlsearch также включен.

возможно, вы захотите избежать мыши в vim, но я делаю исключение здесь :).

Я знаю, что * выполняет ту же работу, но как насчет мыши?

Ответы [ 2 ]

18 голосов
/ 29 июля 2011

Если вы хотите выделить слово под курсором как *, но не хотите переместить курсор, тогда я предлагаю следующее:

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
14 голосов
/ 29 июля 2011

Вы можете сопоставить * двойной щелчок простым отображением:

:map <2-LeftMouse> *

Если вы хотите использовать упомянутую функциональность в режиме вставки, вы можете использовать это отображение:

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

Без (Ctrl-o) * будет напечатано

[EDIT] Как указал ZyX, всегда полезно использовать noremap соответственно inoremap, если вы хотитечтобы убедиться, что если * или <c-o> будут сопоставлены с чем-то другим, то это рекурсивное отображение не будет расширено.

...