Como evito que o vim realce as correspondências após uma substituição?

12

Eu tenho set hlsearch no meu ~/.vimrc . Isso normalmente é muito útil, mas é chato ter que fazer :noh depois que eu fizer uma substituição como '<,'>s/$/',/ (que destaca o final de cada linha depois de executá-la). Como obtenho o vim para não destacar depois de substituir assim?

Estou no Ubuntu 9.04 com vim 7.2. Eu tenho o mesmo problema no OS X 10.6 (também vim 7.2). Algo que funcionaria em ambos seria desejável.

UPDATE: Todas as respostas que recebi estão apenas adicionando um mapeamento de chave para fazer :noh (ou um equivalente). Eu realmente tento evitar comportamentos-chave personalizados com os quais eu realmente me acostumo, mas depois me fazem falhar miseravelmente sem eles (por exemplo, no computador de um amigo, etc.). Eu gostaria que vim fizesse automaticamente :noh depois de fazer uma substituição. Ou seja, eu só quero hlsearch ao usar / ou * (talvez alguns outros casos), mas não outras vezes.

    
por Benjamin Oakes 27.10.2009 / 16:52

5 respostas

6

Se você não quiser desabilitar permanentemente, pode vincular uma chave para alternar o realce, conforme sugerido em esta resposta para uma pergunta semelhante em stackoverflow.

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

Se você quiser desativar permanentemente o destaque:

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

(da FAQ do VIM )

    
por 27.10.2009 / 17:00
7

Eu tenho duas soluções diferentes, ambas muito boas, cada uma com um comportamento diferente. Meu favorito é a opção 2:

  1. Eu tenho as seguintes 2 linhas no meu .vimrc:

    autocmd cursorhold * set nohlsearch
    autocmd cursormoved * set hlsearch
    

    O primeiro aguarda um tempo limite (não configurável) se o cursor não se mover e desativa o hlsearch. O segundo liga-o novamente se o cursor se mover novamente.

    Não é uma solução perfeita, mas funciona para mim (e estará próxima da perfeição quando o tempo limite for configurável - por enquanto, o tempo limite está vinculado a um temporizador interno para o vim.)

  2. Ou você pode tentar estas linhas:

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

Isso desativa o hlsearch após um breve intervalo sem movimento do cursor e o ativa novamente para os comandos de pesquisa padrão. Ele não cobre todas as possibilidades de reativar o hlsearch, mas é o suficiente para uma prova de conceito.

    
por 02.12.2009 / 20:27
2

Eu apenas digite "/ asdf" (assumindo que "asdf" não está no arquivo) para se livrar do realce. Eu sei que é bem simplista, mas funciona para mim.

    
por 02.12.2009 / 21:46
1

Coloque o seguinte no seu arquivo .vimrc:

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

Isso ocultará silenciosamente o termo de pesquisa realçado, mas não desativará o recurso :set hlsearch . É ativado novamente na próxima pesquisa.

    
por 30.10.2009 / 19:11
1

Outra possibilidade é redefinir o @/ register (que na verdade é um registrador de leitura-gravação) depois de fazer a substituição. Isso restaura o destaque anterior:

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

No entanto, isso ainda tem alguns problemas:
 - em vez de modificar :s , define um novo comando. Embora seja possível usar cabbrev para mapear :s para :S , não sei como capturar todas as construções como :<range>s .
 - Se você usou :nohl anteriormente para ocultar apenas uma pesquisa, isso realçará novamente a pesquisa anterior. Não sei como encontrar se :nohl foi chamado anteriormente. (Pode ser possível contornar isso e também sobrescrever o comando :nohl , mas isso também requer a substituição de todos os comandos de pesquisa, o que pode ser muito ...).

    
por 20.04.2015 / 10:43

Tags