12

Я set hlsearch в моем ~/.vimrc . Обычно это очень полезно, но раздражает необходимость делать :noh после того, как я произвожу замену вроде '<,'>s/$/',/ (которая выделяет конец каждой строки после того, как я ее запустил). Как заставить vim не выделяться после такой замены?

Я на Ubuntu 9.04 с vim 7.2. У меня та же проблема на OS X 10.6 (также vim 7.2). То, что будет работать на обоих, было бы желательным.

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

5 ответов5

8

У меня есть два разных решения, оба довольно хороших, каждое с разным поведением. Мой любимый вариант 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, но этого достаточно для подтверждения концепции.

6

Если вы не хотите навсегда отключить, вы можете привязать клавишу, чтобы переключить подсветку, как предложено в этом ответе на аналогичный вопрос по 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

Я просто набираю «/asdf» (при условии, что "asdf" отсутствует в файле), чтобы избавиться от выделения. Я знаю, что это довольно упрощенно, но это работает для меня.

1

Другая возможность - сброс регистра @/ (который на самом деле является регистром чтения-записи) после выполнения подстановки. Это восстанавливает предыдущий основной момент:

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

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

1

Поместите следующее в ваш файл .vimrc:

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

Это автоматически скрывает выделенный поисковый запрос, но не отключает функцию :set hlsearch . Он активируется снова при следующем поиске.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .