Vim очистити підсвічування останнього пошуку


1904

Здійснивши пошук у Vim, я виявляю всі події. Як я можу це відключити? Зараз я ще раз шукаю щось гнучко, яке неможливо знайти.

Чи є спосіб просто тимчасово відключити підсвітку, а потім знову ввімкнути її за потреби знову?


197
Я думаю, що рішення "nnoremap <esc>: noh <return> <esc>" є більш повною відповіддю на питання - додавши це у свій .vimrc, ви можете просто натиснути <esc> після пошуку, щоб очистити виділення з попереднього пошуку (але не вимикати виділення назавжди).
Стюарт Джонсон

5
: set invhlsearch відключить підсвічування, якщо її вже виділено, і включить її, якщо її немає. Можна нанести на карту, щоб сказати Shift-H.
puffadder

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

Відповіді:


1586

Щоб вимкнути підсвічування до наступного пошуку:

:noh

Або повністю вимкніть підсвічування:

set nohlsearch

Або переключити його:

set hlsearch!

nnoremap <F3> :set hlsearch!<CR>

14
Виконуючи встановлення nohlsearch, підсвічування повертається при перезапуску vim. :nohпрацює краще.
Дхарміт

21
прикро, що це може бути так само швидко, як шукати гібридну рядок: / oajf3w9, як і для введення: noh. Мені подобається рішення @ avocade про відображення клавіші пробілу на:
noh

160
Це не зрозуміло з цієї відповіді та коментарів: зауважте, що set nohlsearchтакож вимкне підсвічування для наступних пошуків. Поведінка :nohдуже відрізняється: підсвічування буде автоматично ввімкнено під час нового пошуку або навіть коли ви робите щось, що стосується поточного пошуку (наприклад, коли ви вводите nперехід до наступного пункту).
Skippy le Grand Gourou

10
Ніякого пояснення того, що це насправді робить, та наслідків. Дякуємо @SkippyleGrandGourou за пояснення деяких з них.
Джейсон S

3
Для чого це варто, я '\/'map <Leader>/ :nohlsearch<CR>
позначаю

689

З документації VIM

Щоб очистити останній використаний шаблон пошуку:

:let @/ = ""

Це не встановить шаблон для порожнього рядка, оскільки це буде відповідати всюди. Шаблон дійсно очищений, як при запуску Vim.


129
... що було б кращим рішенням його проблеми, наскільки я це розумію.
Шон Буккаерт

8
Це те, що я шукав! Я проголосував за це, питання трохи розпливчасте. Це змусило мене подумати, що саме цього він хотів: "Я зараз роблю інший пошук чогось гнучка, якого неможливо знайти". Тому що це я робив, щоб очистити пошук, але не відключити його, щоб наступний пошук знову виділився.
claytron

50
Це те, про що я думав, з приводу цього питання ... ось команда, яку я зробив, щоб пришвидшити очищення рядка пошуку (і, отже, видалити всі основні моменти): :command C let @/=""Використання цього дозволяє вводити текст, :Cщоб очистити рядок пошуку ... дуже швидко і не впливає на майбутнє пошук чи виділення.
Джейсон

12
@ jcreamer898, див. довідку vim на "регістри" ( :he registers). Vim має декілька різних вбудованих регістрів, які містять текст, іноді для витягнутих даних, іноді для останнього пошуку і т. Д. Коли ви здійснюєте пошук, vim ставить шаблон у реєстр "/", на який ви посилаєтесь @/. Ви також можете призначити значення регістрам, використовуючи, @regname=valueде regnameє ім'я регістра. Отже, @/=""просто встановити регістр "/" на порожню рядок (за винятком того, що "/" регістр vim очистить останній пошук, якщо він містить порожню рядок).
Бен Девіс

3
Додайте це до свого .vimrc, щоб отримати Ctrl + /, щоб очистити останній пошук: noremap <silent> <c-_> :let @/ = ""<CR>
goldendust

583

Ви можете зробити

:noh

або :nohlsearchтимчасово відключити підсвічування пошуку до наступного пошуку.


3
дякую, це було корисно ... будь-яка команда для повернення родзинки?
Габріель Соломон

17
: nohs просто відключає поточне виділення. Якщо у вас є: встановіть 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>
Peter N Lewis

137

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

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

Другий рядок потрібен для відображення ключа втечі, оскільки Vim внутрішньо використовує escape для представлення спеціальних ключів.


12
Щоб зрозуміти, це дозволяє очистити підсвічування пошуку натисканням клавіші Escape
Гевін Міллер

7
Чомусь це змушує запустити мій термінальний vim так, ніби натиснуто "c". Будь-які ідеї?
Яків

31
Це спричинило дуже дивну поведінку, коли я спробував це: при запуску регулярні рухи vim (наприклад, j, k) призведуть до видалення ліній. nnoremap <CR>: noh <CR> <CR> не викликав цих проблем. Я не міг віднайти першопричину.
oasisbob

9
хм, у мене була така ж проблема, як у вищезгаданих. Не використовуйте це як без тестування, якщо вам не подобається видалення тексту випадковим чином ...
Дерек Літц

8
використання "nnoremap <esc>: noh <return> <esc>" робить vim завжди запущеним у режимі "ЗАМІНА".
користувач1850133

38

Моє оригінальне рішення (нижче) було брудним та марнотратним. Я зараз користуюся:noh

Як і багато можливостей у Vim, правильний шлях часто не легко знайти.

-

(НЕ РОБИ ЦЬОГО)

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

/;alskdjf;

Це працює в vim і менше, і його легше запам’ятати / набрати, ніж логічно чистіше рішення @ ShaunBouckaert ", щоб очистити останній використаний шаблон пошуку":

:let @/ = ""

Потенційний мінус полягає в тому, що це додає мотлоху в історію пошуку.


17
Мало того, що це брудне рішення (яким я сам користувався дотепер, без образи), ще один недолік полягає в тому, що він додає потворний червоний банер із написом "шаблон не знайдено" внизу вікна, що майже так само дратує, як і підсвічування і вимагає відхилення подальших дій (наприклад, "пошук + повернення назад").
Skippy le Grand Gourou

5
Це також може зайняти кілька секунд, оскільки воно фактично шукає весь решта файлу. Це дійсно дратує, якщо файл великий. Звичайно, ви можете відзначити свою поточну позицію, перейти до початку та шукати персонажа назад, але це аналогічно брудно.
Blacklight Shining

5
Це рішення, яке більшість використовуватиметься перед тим, як дізнатися про :nohlкоманду. Як тільки я дізнався про останнє, одразу зупинився робити ці обшуки.
Тобіас

7
Це не відповідь; просто рекомендую робити те, що вже робить ОП: "Зараз я ще раз шукаю щось гнучко, чого неможливо знайти".
Відновіть Моніку - немайнар

2
Якщо ви хочете безглуздий і короткий візерунок, просто використовуйте /$4. Це не просто навряд чи що-небудь відповідати, але насправді абсолютно НЕМОВНО. $завжди повинен супроводжуватися новим рядком або бути кінцем файлу, а 4 - це ні новий рядок, ні кінець файлу. (Причина для 4 конкретно полягає лише в тому, що він знаходиться на одній клавіші, тому його дуже просто швидко набрати)
крапка з комою

32

У моєму файлі .vimrc.local, швидко і брудно, але дуже функціонально:

" Clear last search highlighting
map <Space> :noh<cr>

32
nnoremap <cr> :noh<CR><CR>:<backspace>

Таким чином я позбуваюсь :nohпоказаного в командному рядку під час натискання enterпісля пошуку.

:це як почати введення нової команди, Backspaceочищає її і повертає фокус назад у вікно редактора.


6
Дякую. Показ ": noh" внизу ліворуч зводив мене з розуму, проклятий OCD.
andrewtweber

Я намагався відобразити це на зміщений cr, роблячи nnoremap <S-cr>: noh <CR> <CR>, але це не спрацювало, ви знаєте, чому це може не працювати?
Чарлі Паркер

Я підозрюю, що ви не можете поєднати зміну із поверненням, але я, чесно кажучи, поняття не маю.
sjas

@CharlieParker IIRC ви можете використовувати лише зміни [a-z]та такі символи.
sjas

7
Замість того щоб робити :<Backspace>, ви можете просто додати <silent>після того , як nnoremapсказати Vim , щоб не відображати який - або висновок в командному області: nnoremap <silent> <cr> :noh<CR><CR>.
Сорен Бьорнстад

31

Відповіді, що пропонують :nohабо :nohlsearch(наприклад, Метт Макмін), є правильними для тимчасового вимкнення підсвічування пошуку - як це було задано в оригінальному запитанні.

Я подумав, що я буду сприяти картографуванню, яке вважаю корисним у звичайному режимі:

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

За замовчуванням CtrlLу Vim очищає та перерисовує екран. Кілька програм командного рядка (в основному ті, які використовують бібліотеку Readline GNU , наприклад, Bash) використовують одну і ту ж комбінацію клавіш для очищення екрана. Ця функція корисна в тих випадках, коли процес, запущений у фоновому режимі, друкує на термінал, перезаписуючи частини переднього плану.

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

Примітка: 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>
    

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>

Якщо "подвоїти", 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>
user1336087

Але це те, що говорить Оо Можливо, ви могли б проголосувати?
Пабло Олмос де Агілера C.

Я підтримую ваше рішення ... Це найкращий ІМО ... І я також схвалив це ... :)
user1336087

1
Очищення реєстру пошуку за @/=""допомогою побічного ефекту nне дає змоги відновити пошук. Я вважаю за краще те, :nohщо зберігає попередній пошук у реєстрі для повторного використання.
jbyler



8

Янус для VIM та GVIM пропонує ряд речей для новонароджених, як я, в тому числі

<leader>hs - toggles highlight search

що саме те, що вам потрібно. Просто введіть \hsу звичайному режимі. (Клавіша лідера \за замовчуванням відображається.)

HTH.


7

Для цього є два плагіни "must have":

  1. розумний - Ctrl-lдля екрана nohlsearch та перемальовування.
  2. unimpared - [oh, ]ohі cohдля управління hlsearch.

невпорядкований змінився coна yov2, так що це yoh. Дивіться github.com/tpope/vim-unimpaired/blob/v2.0/doc/unimpaired.txt та github.com/tpope/vim-unimpaired/isissue/150
myrdd

cohвсе ще працює, хоча є повідомлення, яке пропонує використовувати, yohякщо ви користуєтесьcoh
avinashkrsharma

7

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

Встановіть vim-cool . Він був створений для вирішення цієї конкретної проблеми. Вимикання вимикається, як тільки ви переміщуєте курсор. Але будьте попереджені, для цього потрібна остання версія vim!


6

Це очистить підсвітку пошуку після updatetimeмілісекунд бездіяльності.

updatetimeза замовчуванням до 4000ms або 4s, але я встановив значення 10s. Важливо зауважити, що 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


5

Ще одне рішення, поєднуючи 2 найкращих відповіді:

"To clear the last used search pattern:
nnoremap <F3> :let @/ = ""<CR>

Очищення реєстру пошуку за @/=""допомогою побічного ефекту nне дає змоги відновити пошук. Я вважаю за краще те, :nohщо зберігає попередній пошук у реєстрі для повторного використання. Ви можете пов'язувати <F3>це зnnoremap <F3> :noh<CR>
jbyler


4

Я просто використовую простий nohl нижче і плагіни не потрібні.

:nohl


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 березня '09 о 16:22 є гарним компромісом:

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

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


3

ви можете використовувати : noremap, щоб увімкнути / вимкнути результат пошуку, як це

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


3

Виходячи з @ baruch-even відповіді, ви можете видалити пошуковий термін ESCподвійним натисканням у звичайному режимі за допомогою:

nnoremap <esc> :let @/ = ""<return><esc>
nnoremap <esc>^[ <esc>^[

Я думаю, що друге зв’язування нормально, але перше небезпечне. Перероблення <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


1

Ви також можете додати відображення у файлі .vimrc як,

nmap <C-N>: nohlsearch

і тоді ви можете натиснути

Ctrl + N

в будь-який час, щоб очистити виділений текст


Будь ласка, відредагуйте свою відповідь, щоб переконатися, що вона покращилася стосовно інших відповідей, вже наявних у цьому запитанні.
hongsy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.