Выделить все вхождения выбранного слова?

159

Как выделить все вхождения выбранного слова в GVim, как в Notepad ++?

Маттео Кокон
источник

Ответы:

202

В обычном режиме:

:set hlsearch

Затем выполните поиск шаблона с помощью команды /в обычном режиме или с <Ctrl>oпоследующим /в режиме вставки. *в обычном режиме будет искать следующее вхождение слова под курсором. hlsearchВариант будет выделить все из них , если установлен. #будет искать предыдущее вхождение слова.

Чтобы удалить выделение предыдущего поиска:

:nohlsearch

Возможно, вы захотите сопоставить :nohlsearch<CR>с каким-нибудь удобным ключом.

wilhelmtell
источник
34
Если вы планируете переключать hlsearchмного, вы можете :set hlsearch!вместо карты :set nohlsearch. Это переключает настройку, а не всегда выключает ее.
Дэвид Уинслоу
1
Также имейте в виду, что курсор переместится к предыдущему (#) или следующему (*) вхождению слова
Хуан Кампа
1
Но вы можете вернуться к месту , где была нажата кнопка *или #на <Ctrl>oв нормальном режиме.
Руслан
8
Вместо этого :nohlsearchвы можете просто использовать:noh
crisron
Установите в .vimrc: noremap <F4> :set hlsearch! hlsearch?<CR>для переключения между выделением и удалением выделения по <F4>.
Chalist
124

*Ключ будет выделить все вхождения слова , который находится под курсором.

sleepynate
источник
31
Только если &hlsearchвключен.
Вильгельмтелл
10
Также будет выполнен переход к следующему вхождению слова под курсором. Если вы хотите перейти к предыдущему вхождению, используйте #.
Виниций Пинто
7
Могу ли я заставить его просто оставаться на текущей позиции?
nn0p
@ nn0p Да, вы можете - в этом случае следуйте принятому ответу stackoverflow.com/a/3431203/363688 . Это просто альтернативное действие, которое также выделит все случаи.
sleepynate
1
Есть ли способ использовать эту функцию, но с выделенным одним или несколькими словами?
Сон Чо
22

Я знаю, что это действительно старый вопрос, но если кто-то заинтересован в этой функции, можете проверить этот код http://vim.wikia.com/wiki/Auto_highlight_current_word_when_idle

" Highlight all instances of word under cursor, when idle.
" Useful when studying strange source code.
" Type z/ to toggle highlighting on/off.
nnoremap z/ :if AutoHighlightToggle()<Bar>set hls<Bar>endif<CR>
function! AutoHighlightToggle()
   let @/ = ''
   if exists('#auto_highlight')
     au! auto_highlight
     augroup! auto_highlight
     setl updatetime=4000
     echo 'Highlight current word: off'
     return 0
  else
    augroup auto_highlight
    au!
    au CursorHold * let @/ = '\V\<'.escape(expand('<cword>'), '\').'\>'
    augroup end
    setl updatetime=500
    echo 'Highlight current word: ON'
  return 1
 endif
endfunction
clagccs
источник
1
Можно ли изменить этот скрипт так, чтобы текст под курсором, который первоначально выделялся при нажатии z /, оставался подсвеченным, даже если курсор перемещается на другие слова? Это было бы полезно при прокрутке исходного кода в поисках исходного слова.
Стенсоотла
18

самый простой способ, наберите в обычном режиме *

У меня также есть эти сопоставления для включения и отключения

"highligh search enabled by default
set hlsearch
"now you can toggle it
nnoremap <S-F11> <ESC>:set hls! hls?<cr>
inoremap <S-F11> <C-o>:set hls! hls?<cr>
vnoremap <S-F11> <ESC>:set hls! hls?<cr> <bar> gv

Выберите слово, нажав на него

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

Бонус: CountWordFunction

fun! CountWordFunction()
    try
        let l:win_view = winsaveview()
        let l:old_query = getreg('/')
        let var = expand("<cword>")
        exec "%s/" . var . "//gn"
    finally
        call winrestview(l:win_view)
        call setreg('/', l:old_query)
    endtry
endfun
" Bellow we set a command "CountWord" and a mapping to count word
" change as you like it
command! -nargs=0 CountWord :call CountWordFunction()
nnoremap <f3> :CountWord<CR>

Выделение слова с помощью мыши и одновременный подсчет вхождений: OBS: обратите внимание, что в этой версии у нас есть команда «CountWord» в конце

nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>
SergioAraujo
источник
Теперь я использую nnoremap * *``cgnиnnoremap # #``cgN
SergioAraujo
так что после того *, как я наберу , как отключить подсветку?
user5359531
Это для выделения текущего слова в документе
Chalist
@ user5359531 :nohили:nohlsearch
dylnmc
@ user5359531 как насчет nnoremap <silent> * :execute "normal! *N"<cr>а nnoremap <silent> # :execute "normal! #n"<cr>? Они просто выделяют слово под курсором, но не перемещают его в следующий раз.
dylnmc
10

Решения на основе поиска ( *, /...) перемещают курсор, что может быть неудачно.

Альтернативный вариант - использовать улучшенный плагин mark.vim , а затем завершить его, .vimrcчтобы дважды щелкнуть подсветку триггера (я не знаю, как выбор клавиатуры может вызвать команду):

"Use Mark plugin to highlight selected word  
map <2-leftmouse> \m   

Это позволяет многократные выделения, постоянство и т. Д.

Чтобы удалить выделение, либо:

  • Двойной клик снова
  • :Mark (выключить до следующего выбора)
  • :MarkClear
YvesgereY
источник
2
Решения, основанные на поиске, перемещают курсор только при включенном инкрементальном поиске. Вы можете отключить его , как это: :set noincsearch. На мой взгляд, это одна из самых раздражающих функций в Vim и одна из первых вещей, которые я отключаю для новых установок.
Джахрой
3
Я думаю *безоговорочно переместит курсор. И я не могу понять, как это incsearchможет раздражать, поскольку это всего лишь «взгляд вперед», выполняющий текущий поиск без фактического изменения вашей позиции.
YvesgereY
3
Вау ... Ты прав. Я предполагал, что отключение incsearchпредотвратит движение, но быстрый тест подтвердит, что вы правы. Мои извинения. Тем не менее, это очень легко создать отображение , которое предотвращает движение: :nnoremap * *N. Я не могу поверить, что вас не раздражает, что ваш курсор перемещается по экрану во время поиска. Но ... эти вещи абсолютно субъективны. Vive la différence ;-)
Жахрой
3
Вы также можете сделать :let @/='hilight_this', если вы hlsearchвключили. Он подсвечивает текст без прыжков, и вам не нужно менять существующие настройки. Это изменяет значение, которое в данный момент хранится в регистре поиска.
Бен Дэвис
1
Это должен быть принятый ответ. <лидер> м делает работу, нет необходимости отображать двойной щелчок.
Сасан
4

Сначала (или в вашем .vimrc):

:set hlsearch

Затем поместите курсор на слово, которое вы хотите выделить, и нажмите *.

hlsearchозначает выделить все вхождения текущего поиска, а также *означает поиск слова под курсором.

Нед Бэтчелдер
источник
3

Сначала убедитесь, что hlsearch включен, введя следующую команду

:set hlsearch

Вы также можете добавить это в свой файл .vimrc как установлено

set hlsearch

теперь, когда вы используете механизм быстрого поиска в командном режиме или обычную команду поиска, все результаты будут выделены. Для перемещения вперед между результатами нажмите «n», для перемещения назад нажмите «N»

В обычном режиме, чтобы выполнить быстрый поиск слова под курсором и перейти к следующему вхождению одной командой, нажмите «*», вы также можете найти слово под курсором и перейти к предыдущему вхождению, нажав «#». '

В обычном режиме быстрый поиск также может быть вызван с помощью

/searchterm<Enter>

чтобы убрать блики при использовании ocuurences, я привязал это к ярлыку в моем .vimrc

:nohl
Kashif
источник
2

Включить подсветку поиска:

:set hlsearch

Затем найдите слово:

/word<Enter>
Джон Кугельман
источник
2

выделить слово без перемещения курсора, хлопнуть

" highlight reg. ex. in @/ register
set hlsearch
" remap `*`/`#` to search forwards/backwards (resp.)
" w/o moving cursor
nnoremap <silent> * :execute "normal! *N"<cr>
nnoremap <silent> # :execute "normal! #n"<cr>

в ваш vimrc.

Что хорошо в этом, так это g*и g#будет работать как "нормально" *и #.


Для hlsearchзапуска вы можете использовать «short-form» (если у вас нет другой функции, которая начинается с «noh» в командном режиме)::noh . Или вы можете использовать длинную версию::nohlsearch

Для чрезвычайного удобства (я переключаюсь, hlsearchможет быть, 20 раз в день), вы можете сопоставить что-то с переключателем hlsearchследующим образом:

" search highlight toggle
nnoremap <silent> <leader>st :set hlsearch!<cr>

.:. если ваш <leader>есть \(это по умолчанию), вы можете нажать \st(быстро) в нормальном режиме для переключения hlsearch.

Или, может быть, вы просто хотите :nohсоставить карту:

" search clear
nnoremap <silent> <leader>sc :nohlsearch<cr>

Вышеприведенное просто работает :nohlsearchтак, что (в отличие от :set hlsearch!) оно все равно выделит слово при следующем нажатии *или #в обычном режиме.

ура

dylnmc
источник
1

использование autocmd CursorMoved * exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))

Убедитесь, что вы что-то IncSearchнастроили. например call s:Attr('IncSearch', 'reverse'). В качестве альтернативы вы можете использовать другую группу подсветки.

Это выделит все вхождения слов под вашим курсором без задержки. Я обнаружил, что задержка замедляет меня, когда я просматриваю код. Цвет выделения будет соответствовать цвету слова, поэтому он будет соответствовать вашей схеме.

Seph
источник
0

Почему бы просто: z /

Это выделит текущее слово под курсором и любые другие вхождения. И вам не нужно давать отдельную команду для каждого элемента, который вы ищете. Возможно это не доступно в нечестивом гвиме? По умолчанию это vim.

* хорошо, только если вы хотите, чтобы курсор перемещался к следующему вхождению. При визуальном сравнении двух вещей вы часто не хотите, чтобы курсор двигался, и раздражает нажатие клавиши * каждый раз.

INL
источник
Vim и gvim обычно имеют одинаковый набор команд. В справочной документации нет ссылки на команду "z /".
wds
Он недоступен не только в gvim, но и в vim. Только что проверил - явно не работает.
Руслан
z / работает, когда используется этот скрипт, упомянутый в предыдущем ответе .
fzzylogic
0
  1. Добавьте эти строки в свой ~/.vimrcфайл

" highlight the searched items set hlsearch " F8 search for word under the cursor recursively , :copen , to close -> :ccl nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

  1. Перезагрузите настройки с помощью :so%
  2. В обычной модели перебери слово.

  3. Нажмите * Нажмите F8 для рекурсивного поиска по всему вашему проекту над словом

Йордан Георгиев
источник
0

Например, это плагины:

Просто найдите под курсором в vimawesome.com

Ключ, как упоминалось в clagccs , заключается в том, что выделение НЕ конфликтует с вашим поиском : https://vim.fandom.com/wiki/Auto_highlight_current_word_when_idle

Снимок экрана: как это НЕ конфликтует с поиском: введите описание изображения здесь Примечания:

  • vim-Подсветка подсветки по умолчанию, на снимке экрана я переключился на подчеркивание
  • vim-Подсветка подсвечивает / подчеркивает слово под курсором по умолчанию, на снимке экрана я его отключил
  • мои цвета очень серые. Проверьте свой, чтобы настроить его тоже.
Ксопи Гарсия
источник