Як утримати vim від виділення матчів після заміни?


13

Я маю set hlsearchв своєму ~/.vimrc. Це, як правило, дуже корисно, але це прикро, що потрібно робити :nohпісля того, як я виконую заміну '<,'>s/$/',/(яка підкреслює кінець кожного рядка після запуску). Як зробити, vimщоб не виділити після заміни так?

Я на Ubuntu 9.04 з vim7.2. У мене така ж проблема в OS X 10.6 (також vim7.2). Щось, що працювало б на обох, було б бажано.

ОНОВЛЕННЯ: Усі відповіді, які я отримав, - лише додавання ключового відображення для виконання :noh(або еквівалента). Я дійсно намагаюся уникати нестандартних ключових поведінок, до яких я б справді звик, але потім змушую мене збиватися без них (наприклад, за комп'ютером друга тощо). Я хотів би vimзробити це автоматично :nohпісля заміни. Тобто я хочу лише hlsearchпри використанні /або *(можливо, декількох інших випадках), але не в інших випадках.

Відповіді:


7

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

map  <F12> :set hls!<CR>
imap <F12> <ESC>:set hls!<CR>a
vmap <F12> <ESC>:set hls!<CR>gv

Якщо ви хочете остаточно відключити підсвітку:

11.1. After I searched for a text with a pattern, all the matched text
      stays highlighted. How do I turn off the highlighting
      temporarily/permanently?

The 'hlsearch' option controls whether all the matches for the last
searched pattern are highlighted or not. By default, this option is not
enabled. If this option is set in a system-wide vimrc file, then you can
turn off the search highlighting by using the following command:

    :set nohlsearch

(із поширених запитань про VIM )


2
Я знав про цей варіант. Проблема полягає в тому, що я зазвичай не шукаю того, що хочу замінити, тому безглуздо виділяти в більшості випадків, які я замінюю. Тим НЕ менше, це дуже корисно, коли я буду шукати що - то, так що я не хочу, щоб це повністю геть.
Бенджамін Оукс

@ Бенджамін: Ви це неявно шукали. Ось що: s робить. Шукає шаблон, а потім виконує перетворення на відповідності. Використання: nohl - це правильне рішення, оскільки воно вимикає підсвічування поточного шаблону пошуку до наступного пошуку. Це робиться, не змінюючи стан опції 'hlsearch' або не впливаючи на збережене значення попереднього пошукового терміна.
Jamessan

2
@jamessan: Я розумію, що це пошук і заміна. Просто мені тоді це не потрібно. Здебільшого це дратує більше за все.
Бенджамін Оукс

Нещодавно я почав вимикати підсвічування за замовчуванням і вмикати її, коли я хочу, як ви запропонували. Ще не ідеально, але краще.
Бенджамін Оукс

9

У мене є два різних рішення, обидва досить гарні, кожне з нюансованою різною поведінкою. Мій улюблений варіант 2:

  1. У моєму .vimrc є два рядки:

    autocmd cursorhold * set nohlsearch
    autocmd cursormoved * set hlsearch
    

    Перший чекає тайм-аут (не настроюється), якщо курсор не переміститься та вимкне hlsearch. Другий вмикає його, якщо курсор рухається знову.

    Це не ідеальне рішення, але воно працює для мене (і буде близьким до ідеального, коли тайм-аут налаштовується - поки що тайм-аут прив’язаний до вбудованого таймера для vim.)

  2. Або ви можете спробувати ці рядки:

    autocmd cursorhold * set nohlsearch
    noremap n :set hlsearch<cr>n
    noremap N :set hlsearch<cr>N
    noremap / :set hlsearch<cr>/
    noremap ? :set hlsearch<cr>?
    

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


Дякуємо за оновлення - не бачив його досі. (Схоже, що ви його теж додали? Смішно, що це.) Це класна концепція; Мені доведеться пограти з цим.
Бенджамін Оукс

Застереження 2. полягає в тому, що змушує пошук у візуальному режимі Vне працювати
Брайс Гінта

Я змінив перший рядок у варіанті 1 із наступним. autocmd cursorhold * set nohlsearch | let @/ = "" Це очистить реєстр пошуку, а також видалить підсвітку. Я не проводив багато часу з цим налаштуванням, але я хотів викласти його для тих, хто опинився тут.
Берклі Мартінес

2

Я просто наберіть "/ asdf" (припустимо, що "asdf" відсутній у файлі), щоб позбутися виділення. Я знаю, що це досить спрощено, але це працює для мене.


2
Це та ж ідея :noh, що і вона, але не завжди працює. :) Смішно, про це ти згадуєш: Раніше я мав товариша, який завжди вводив його ім'я, тому що він з’являвся рідше, ніж щось на зразок "asdf" у тому, що він писав. (Якесь смішне, я думаю.)
Бенджамін Оукс

Правда. Можливо, я згадаю: ні наступного разу.
Грег Грем

1

Помістіть у файл .vimrc наступне:

nnoremap <silent> <F11> :exe ":silent! normal /$^\r"<CR>

Це мовчки приховає виділений пошуковий термін, але не вимкне :set hlsearchфункцію. Він знову активується при наступному пошуку.


Краще просто використовувати вбудовану для цього команду -: nohl. Тоді ви не видуваєте вміст свого реєстру пошуку, який використовується для таких речей, як перехід до наступного матчу, значення за замовчуванням шаблону, коли його не вказано тощо.
jamessan

Так, але це мене дратувало, що наступний пошук не був висвітлений так, як передбачалося. Тому я придумав це швидке рішення. Це також може бути брудно, але це працює. Я думаю, що це є прийнятним для vim - навіть якщо я б не використовував "брудні" речі у вихідному коді реального великого проекту.
Грегор Мюллегер

1

Іншою можливістю є скидання @/регістра (який фактично є регістром читання-запису) після заміни. Це відновлює попередню родзинку:

command! -nargs=* -range S
\ let atslash=@/|exe ':'.<line1>.','.<line2>.'s'.<q-args>|let @/=atslash

Однак у цьому все ще є кілька проблем:
- замість модифікації :sвін визначає нову команду. Незважаючи на те , що можна використовувати cabbrevдля зіставлення :sз :S, я не знаю , як зловити всі конструкції , такі як :<range>s.
- якщо :nohlраніше ви ховали лише один пошук, то це повторно виділить попередній пошук. Я не знаю, як знайти, чи :nohlтелефонували раніше. (Можливо, можна обійти це питання, а також змінити :nohlкоманду, але це також вимагатиме перевизначення всіх команд пошуку, що може бути занадто багато ...).

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