Vim clear последнее поисковое выделение

1904

После выполнения поиска в Vim я выделяю все события. Как я могу отключить это? Сейчас я делаю еще один поиск чего-то бессмысленного, что не может быть найдено.

Есть ли способ просто временно отключить выделение, а затем снова включить его при необходимости?

Габриэль Соломон
источник
197
Я думаю, что решение «nnoremap <esc>: noh <return> <esc>» является более полным ответом на вопрос - поместив это в свой .vimrc, вы можете просто нажать <esc> после поиска, чтобы очистить выделение из предыдущего поиска (но не отключить подсветку навсегда).
Стюарт Джонсон
5
: set invhlsearch отключит выделение, если оно уже выделено, и включит его, если это не так. Вы можете отобразить это, чтобы сказать Shift-H.
пуховик
1
@StewartJohnson делает это в моих файлах .vimrc, кажется, мешает / нарушает: set mouse = a. Есть идеи почему? Эта ошибка случается только в iTerm2
Чарли Паркер
20
@ StewartJohnson Будь осторожен! Ваш комментарий с самым высоким рейтингом с отображением вызывает ошибки и неожиданное поведение, как описано в комментариях ниже к stackoverflow.com/a/1037182/1698467
skywinder
3
nnoremap <esc> :noh<return><esc>Решение было предложено @StewartJohnson хорошо работает в GUI ВИМ, но вызывает проблемы с помощью клавиш со стрелками и другими ESC-закодированные ключи при запуске Vim в терминале. Не положить его в ~/.vimrc без упаковки его в if has('gui_running')... end.
Jbyler

Ответы:

1588

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

:noh

Или полностью отключите подсветку:

set nohlsearch

Или, чтобы переключить это:

set hlsearch!

nnoremap <F3> :set hlsearch!<CR>
Николай Голубев
источник
14
Делая set nohlsearch, подсветка возвращается при перезапуске vim. :nohработает лучше.
Дхармит
21
досадно, что поиск бессмысленной строки: / oajf3w9 может быть таким же быстрым, как и ввод: noh. Мне нравится решение @ avocade по отображению клавиши пробела на:
noh
160
Это не ясно из этого ответа и комментариев: обратите внимание, что set nohlsearchотключит подсветку для следующих поисков. Поведение :nohочень отличается: выделение будет автоматически включено, когда вы выполняете новый поиск или даже когда вы делаете что-то, связанное с текущим поиском (например, когда вы печатаете, nчтобы перейти к следующему элементу).
Скиппи ле Гран Гуру
10
Никакого объяснения того, что они на самом деле делают, и последствий. Спасибо @SkippyleGrandGourou за объяснение некоторых из них.
Джейсон С
3
Для чего это стоит, я сопоставляю это с '\/'(или с map <Leader>/ :nohlsearch<CR>
кем
689

Из документации VIM

Чтобы очистить последний использованный шаблон поиска:

:let @/ = ""

Это не установит шаблон в пустую строку, потому что это будет соответствовать везде. Шаблон действительно очищен, как при запуске Vim.

Шон Букаерт
источник
129
... что было бы лучшим решением его проблемы, насколько я понимаю.
Shaun Bouckaert
8
Это то, что я искал! Я проголосовал, вопрос немного расплывчатый. Это привело меня к мысли, что это то, что он хотел: «Я сейчас ищу другой бред, который не может быть найден». Потому что это то, что я делал, чтобы очистить поиск, но не отключить его, чтобы следующий поиск снова выделился.
Клейтрон
50
Это то, о чем я думал, вопрос был о ... вот команда, которую я сделал, чтобы ускорить очистку строки поиска (и, следовательно, удалить все основные моменты): :command C let @/=""Использование этого позволяет набирать текст, :Cчтобы очистить строку поиска ... очень быстро и не влияет на будущий поиск или выделение.
Джейсон
12
@ jcreamer898, см. справку vim по "registers" ( :he registers). Vim имеет несколько различных встроенных регистров, в которых хранится текст, иногда для восстановления данных, иногда для последнего поиска и т. Д. Когда вы выполняете поиск, vim помещает шаблон в регистр "/", на который вы ссылаетесь @/. Вы также можете присваивать значения регистрам, используя @regname=valueгде regnameэто имя регистра. Итак, @/=""просто установите регистр "/" в пустую строку (за исключением того, что для регистра "/" vim очистит последний поиск, если он содержит пустую строку).
Бен Дэвис
3
Добавьте это к вашему .vimrc, чтобы получить Ctrl + /, чтобы очистить последний поиск: noremap <silent> <c-_> :let @/ = ""<CR>
angrydust
583

Ты можешь сделать

:noh

или :nohlsearchвременно отключить подсветку поиска до следующего поиска.

Мэтт МакМинн
источник
3
спасибо, это было полезно ... любая команда для возврата основного момента?
Габриэль Соломон
17
: nohs просто отключает текущую подсветку. Если у вас есть: set hlsearch, он продолжит выделять ваши поиски.
Greyfade
6
Я думаю, что именно это искал ОП (хотя ответ Шона тоже работает). Я голосую за то, что был короче. Я знаю, что он принял ответ nohls, но его установка отключит подсветку всего поиска, даже если впоследствии будет предпринят другой поиск.
Тьяго Аррай
5
Это, вероятно, то, что ОП хотел в первую очередь, и это самый короткий, лучший ответ ИМХО.
Совершенство достижимо даже в этом царстве смертных! Я буду использовать это больше, чем: помощь, и не хочу загрязнять <esc>: nnoremap <F1>: noh <CR>
Сэм Уоткинс
305

Я нашел этот ответ несколько лет назад на vim.org:

Добавьте следующее в ваш .vimrc:

"This unsets the "last search pattern" register by hitting return
nnoremap <CR> :noh<CR><CR>

Таким образом, после поиска просто нажмите кнопку возврата еще раз в командном режиме, и подсветка исчезнет.


источник
36
Я думаю, что это гораздо лучшее решение, чем то, которое фактически было принято - либо это, либо другое, где вместо этого оно сопоставлено с <ESC>.
Стюарт Джонсон
20
Это гораздо лучший ответ для «nnoremap <esc>: noh <return> <esc>», поскольку он не вызывает странного поведения.
Деннис
19
Важно отметить, что вы не должны оставлять комментарии с правой стороны карты. Они будут интерпретироваться как команды для переназначения в отличие от комментариев.
Codybuell
13
Комментарий неправильный; команда никак не сбросить последний шаблон поиска , а просто выключает подсветку текущих результатов; Вы можете нажать, nчтобы найти следующее вхождение (которое будет выделено снова). Кстати, при написании сценариев я бы избегал сокращенной формы и вместо этого писал :nohlsearch.
Тобиас
28
Добавьте <silent>, чтобы избежать мигания дисплея и оставления noh в командной строке -: nnoremap <silent> <CR>: nohlsearch <CR> <CR>
Питер Н Льюис
137

С http://twitter.com/jonbho/status/2194406821

" Clear highlighting on escape in normal mode
nnoremap <esc> :noh<return><esc>
nnoremap <esc>^[ <esc>^[

Вторая строка необходима для сопоставления с escape-ключом, поскольку Vim внутренне использует escape для представления специальных ключей.

Барух Эвен
источник
12
Просто чтобы быть понятным, это позволяет вам очистить подсветку поиска, нажав клавишу Escape
Гэвин Миллер
7
По какой-то причине это заставляет мой терминал запускаться, как если бы была нажата "c". Любые идеи?
Джейкоб
31
Когда я попробовал, это вызвало очень странное поведение: при запуске регулярные перемещения vim (например, j, k) приводили к удалению строк. nnoremap <CR>: noh <CR> <CR> не вызывал этих проблем. Я не мог отследить первопричину.
oasisbob
9
хм, у меня была та же проблема, что и выше. Не используйте это как есть без тестирования, если вы не любите удалять свой текст случайным образом ...
Дерек Лиц
8
использование "nnoremap <esc>: noh <return> <esc>" делает vim всегда запускающимся в режиме "REPLACEMENT".
user1850133
38

Мое оригинальное решение (ниже) было грязным и расточительным. Я сейчас пользуюсь:noh

Как и многие функции в Vim, правильный путь часто нелегко обнаружить.

-

(НЕ ДЕЛАЙТЕ ЭТОГО)

Поиск маловероятной последовательности символов (нажмите клавиши в домашнем ряду):

/;alskdjf;

Это работает в vim и меньше, и его легче запомнить / напечатать, чем логически более чистое решение @ ShaunBouckaert «очистить последний использованный шаблон поиска»:

:let @/ = ""

Потенциальным недостатком является то, что он добавляет мусор в вашу историю поиска.

millerdev
источник
17
Мало того, что это грязное решение (которое я сам использовал до сих пор, без обид), еще одним недостатком является то, что он добавляет уродливый красный баннер с надписью «шаблон не найден» в нижней части окна, что почти так же раздражает, как подсветка само по себе и требует от него дальнейших действий (например, «поиск + возврат»).
Скиппи ле Гран Гуру
5
Это также может занять несколько секунд, поскольку он фактически ищет весь остальной файл. Это действительно раздражает, если файл большой. Конечно, вы можете отметить текущую позицию, перейти к началу и искать персонажа в обратном направлении, но это так же грязно.
Blacklight Shining
5
Это решение, которое большинство будет использовать перед изучением :nohlкоманды. Узнав о последнем, я немедленно прекратил эти поиски.
Тобиас
7
Это не ответ; он просто рекомендует делать то, что уже делает OP: «Я сейчас ищу другой бред, который не может быть найден».
Восстановить Монику - Нотмайнард
2
Если вы хотите надежный и короткий шаблон, просто используйте /$4. Это не просто маловероятно, чтобы соответствовать чему-либо, но на самом деле совершенно невозможно. $должен всегда сопровождаться символом новой строки или быть концом файла, а 4 не является ни новой строкой, ни концом файла. (Причина 4 именно в том, что она находится на одной и той же клавише, поэтому набрать ее очень легко)
точка с запятой
32

Повторно отображается в моем файле .vimrc.local, быстрый и грязный, но очень функциональный:

" Clear last search highlighting
map <Space> :noh<cr>
avocade
источник
32
nnoremap <cr> :noh<CR><CR>:<backspace>

Таким образом я избавляюсь от :nohпоказанного в командной строке при нажатииenter после поиска.

:это как начать ввод новой команды, Backspaceочистить ее и вернуть фокус в окно редактора.

sjas
источник
6
Спасибо. «Нет» в нижнем левом углу сводит меня с ума, черт побери.
andrewtweber
Я пытался сопоставить его со смещением cr, выполнив команду nnoremap <S-cr>: noh <CR> <CR>, но она не сработала, знаете, почему она может не работать?
Чарли Паркер
Я подозреваю, что вы не можете сочетать смену с возвратом, но я, честно говоря, понятия не имею.
sjas
@CharlieParker IIRC вы можете использовать только Shift [a-z]и такие символы.
Sjas
7
Вместо того чтобы делать :<Backspace>, вы можете просто добавить <silent>после того , как nnoremapсказать Vim , чтобы не отображать какой - либо вывод в командной области: nnoremap <silent> <cr> :noh<CR><CR>.
Сорен Бьорнстад
31

Ответы, предлагающие :nohили :nohlsearch(например, Matt McMinn's), являются правильными для временно отключения подсветки поиска - как было задано в исходном вопросе.

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

nnoremap <C-L> :nohlsearch<CR><C-L>

По умолчанию CtrlLв Vim очищает и перерисовывает экран. Некоторые программы командной строки (в основном те, которые используют библиотеку GNU Readline , например Bash) используют одну и ту же комбинацию клавиш для очистки экрана. Эта функция полезна в ситуации, когда процесс, работающий в фоновом режиме, печатает на терминал, перезаписывая части процесса переднего плана.

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

NB: noremap используется, а не mapкак иначе, отображение будет рекурсивным.

Совет: я обычно переназначаю, Caps Lockчтобы Ctrlбыло легче набирать такие комбинации клавиш; детали для этого зависят от вашего выбора ОС / оконной системы (и не по теме для этого ответа). Оба следующие советы включают информацию о отображении Caps Lockна Ctrl, а также Esc:

Энтони Геогеган
источник
26

Я обычно сопоставляю :nohс ключом обратной косой черты. Чтобы nснова включить выделение, просто нажмите , и оно снова будет выделено.

троглодит
источник
24

Отключить подсветку поиска навсегда

Матчи не будут выделены, когда вы выполняете поиск, используя /

:set nohlsearch

Очистить выделение до следующего поиска

:noh

или :nohlsearch(очищается до nили Nнажата)


Очистить подсветку при нажатии ESC

nnoremap <esc> :noh<return><esc>

Очистить подсветку при нажатии другой клавиши или пользовательской карты

  • Очистить блики при нажатии \(обратная косая черта)

    nnoremap \ :noh<return>
    
  • Четкие блики на удары в ESCдва раза

    nnoremap <esc><esc> :noh<return>
    
Sheharyar
источник
2
nnoremap <silent> <esc> :noh<return><esc>Решение хорошо работает в GUI Vim, но вызывает серьезные проблемы с клавишами со стрелками и другими ESC-закодированных ключами при запуске Vim в терминале. Не положить его в ~/.vimrc без упаковки его в if has('gui_running')... end. Также рассмотрите возможность добавления команды, <silent>которая не мигает :nohв строке состояния.
Jbyler
17

Это то, что я использую (извлечено из множества разных вопросов / ответов):

nnoremap <silent> <Esc><Esc> :let @/=""<CR>

С помощью «double» Escвы удаляете выделение, но как только вы начинаете поиск снова, выделение появляется снова.


Другая альтернатива:

nnoremap <silent> <Esc><Esc> :noh<CR> :call clearmatches()<CR>

Согласно документации vim:

clearmatches ()

    Clears all matches previously defined by |matchadd()| and the

    |:match| commands.
Пабло Олмос де Агилера С.
источник
Я столкнулся с некоторыми ошибками в лучших решениях, поэтому, чтобы сэкономить ваше время, попробовав все ответы. Используйте это решение! Отредактируйте .vimrcи вставьте в него следующую запись:nnoremap <silent> <Esc><Esc> :let @/=""<CR>
ani627
Но это то, что он говорит Оо Может быть, вы могли бы проголосовать?
Пабло Олмос де Агилера К.
Я поддерживаю ваше решение ... Это лучшее ИМО ... И я также проголосовал за него .. :)
ani627
1
Очистка регистра поиска с @/=""помощью побочного эффекта - nне работает, чтобы вернуть ваш поиск. Я предпочитаю :nohкоторый сохраняет предыдущий поиск в реестре для повторного использования.
Jbyler
11

Отключить подсветку до следующего поиска

:noh

Визуальная Иллюстрация

arcseldon
источник
10

Если у вас установлен плагин incsearch.vim , то есть настройка для автоматической очистки выделения после поиска:

let g:incsearch#auto_nohlsearch = 1

введите описание изображения здесь

Дэцин
источник
8

У Janus для VIM и GVIM есть несколько интересных вещей для таких новичков, как я, включая

<leader>hs - toggles highlight search

что именно то, что вам нужно. Просто введите \hsв обычном режиме. (Ключ лидера сопоставлен с\ по умолчанию.)

НТН.

Пол-Себастьян Маноле
источник
7

Для этого есть два «обязательных» плагина:

  1. разумно - Ctrl-lдля nohlsearch и перерисовки экрана.
  2. unimpared - [oh, ]ohи cohдля управления hlsearch.
dkiyatkin
источник
изменен coна yov2, так что это yoh. См. Github.com/tpope/vim-unimpaired/blob/v2.0/doc/unimpaired.txt и github.com/tpope/vim-unimpaired/issues/150
Myrdd
cohвсе еще работает, хотя есть сообщение, предлагающее использовать, yohесли вы используетеcoh
avinashkrsharma
7

Выключите выделение, как только вы переместите курсор:

Установите vim-cool . Он был создан для решения этой конкретной проблемы. Выключение подсветки, как только вы перемещаете курсор. Имейте в виду, что требуется последняя версия vim!

00prometheus
источник
6

Это очистит область поиска после updatetimeмиллисекунд бездействия.

updatetimeпо умолчанию 4000 мс или 4 с, но я установил свой на 10 с. Важно отметить, что updatetimeэто больше, чем просто так, поэтому прочитайте документы, прежде чем изменить его.

function! SearchHlClear()
    let @/ = ''
endfunction
augroup searchhighlight
    autocmd!
    autocmd CursorHold,CursorHoldI * call SearchHlClear()
augroup END
Кевин Кокс
источник
6

Если вы хотите быстро включить / отключить подсветку , вы можете сопоставить ключ с

" Press F4 to toggle highlighting on/off, and show current value.
:noremap <F4> :set hlsearch! hlsearch?<CR>

Просто поместите приведенный выше фрагмент в ваш файл .vimrc.

Для меня это наиболее удобный способ показать и скрыть подсветку поиска нажатием одной кнопки

Для получения дополнительной информации проверьте документацию http://vim.wikia.com/wiki/Highlight_all_search_pattern_matches

Amaynut
источник
5

Еще одно решение, объединяющее 2 главных ответа:

"To clear the last used search pattern:
nnoremap <F3> :let @/ = ""<CR>
skywinder
источник
Очистка регистра поиска с @/=""помощью побочного эффекта - nне работает, чтобы вернуть ваш поиск. Я предпочитаю :nohкоторый сохраняет предыдущий поиск в реестре для повторного использования. Вы можете связать <F3>это сnnoremap <F3> :noh<CR>
jbyler
4

Я просто использую простой nohl ниже и никаких плагинов не требуется.

:nohl

Stryker
источник
4

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

Несколько предложений, которые я нашел для добавления nnoremap ...в ~ / .vimrc, приводят к тому, что при запуске vim переводится в режим замены, а это совсем не то, что мне нужно. Самое простое решение, которое я нашел, это добавить строку

nmap <esc><esc> :noh<return>

к моему ~ / .vimrc. Это соответствует принципу KISS и не мешает клавишам со стрелками, как это делает один <esc>. Двойной <esc> требуется в командном режиме (или тройной <esc> из режима вставки или замены), чтобы очистить выделение из предыдущего поиска, но с точки зрения пользовательского интерфейса это делает операцию максимально простой.

Линдсей Хейсли
источник
Что вы подразумеваете под одиночным <esc>, взаимодействующим с клавишами со стрелками?
hansmosh
1
@hansmosh См. unix.stackexchange.com/questions/28713/… Я использую две строки в своем .vimrc следующим образом nmap <esc><esc> :noh<return> - to turn off search highlighting and nmap <esc>` :set hlsearch<return> - to turn on search highlighting
Линдсей Хейсли,
4

Я использую следующее в моем ~/.vimrc

nnoremap <Leader><space> :noh<Enter>

Это позволяет легко и быстро очистить текущий выделенный поиск. Ключ моего лидера сопоставлен, \так что это позволяет очень легко выполнить действие моим правым мизинцем.

Джон Славик
источник
3

Я думаю, что смешивание ответов @ShaunBouckaert и 19 марта 2009 г. в 16:22 - хороший компромисс:

" Reset highlighted search
nnoremap <CR> :let @/=""<CR><CR>

Нажмите, Enterи выделенный текст больше не будет выделен, а подсветка поиска все еще будет включена.

Ekans
источник
3

вы можете использовать : noremap, чтобы включить / выключить результат поиска, как это

:noremap <F3> :set hls! hls?<CR>

caopeng
источник
3

Основываясь на ответе @ baruch-even, вы можете удалить критерий поиска при ESCдвойном нажатии в обычном режиме с помощью:

nnoremap <esc> :let @/ = ""<return><esc>
nnoremap <esc>^[ <esc>^[
dinigo
источник
Я думаю, что вторая привязка в порядке, но первая опасна. Переназначение <esc>хорошо работает в GUI vim, но вызывает серьезные проблемы с клавишами со стрелками и другими ESC-кодированными клавишами при запуске vim в терминале. Не положить его в ~/.vimrc без упаковки его в if has('gui_running')... end. Также рассмотрите возможность добавления команды, <silent>которая не мигает :nohв строке состояния.
Jbyler
1

Мне это тоже не нравится. Я находил это утомительным, чтобы входить :nohlвсе время ... поэтому я поместил следующее отображение в моем.vimrc

noremap <C-_> :nohl<cr>:<backspace>

Первый бит ( :nohl<cr>) очищает подсветку; второй бит ( :<backspace>) - это трюк для очистки командной строки. Поиск все еще находится в фоновом режиме, поэтому, если вы просто нажмете, nон снова выделится и перенесет вас к следующему вхождению.

Рикарду
источник
1

Я добавил это в мой vimrcфайл.

command! H let @/=""

После того, как вы выполните поиск и хотите очистить выделенные области от вашего поиска, просто сделайте :H

67 пиксель
источник
1

В качестве альтернативы вы можете добавить сопоставление в ваш файл .vimrc как,

nmap <C-N>: nohlsearch

и тогда вы можете нажать

Ctrl + N

в любое время очистить выделенный текст

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