Как удержать 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

(из FAQ по VIM )


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

@ Бенджамин: Вы неявно искали его. Вот что делает. Ищет шаблон, а затем выполняет преобразование совпадений. Использование: nohl - правильное решение, так как оно отключает подсветку текущего шаблона поиска, пока не будет выполнен следующий поиск. Это происходит без изменения состояния опции 'hlsearch' и не влияет на сохраненное значение предыдущего поискового запроса.
Jamessan

2
@jamessan: я понимаю, что это поиск и замена. Просто мне тогда это не нужно выделять. В основном раздражение больше всего на свете.
Бенджамин Оукс

Некоторое время назад я начал отключать подсветку по умолчанию и включать ее, когда захочу, как вы и предлагали. Все еще не идеально, но лучше.
Бенджамин Оукс

9

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

  1. У меня есть следующие 2 строки в моем .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.