Como evito que o vim destaque as partidas após uma substituição?


13

Eu tenho set hlsearchno meu ~/.vimrc. Isso normalmente é muito útil, mas é irritante ter que fazer :nohdepois de fazer uma substituição como '<,'>s/$/',/(que destaca o final de cada linha depois de executá-la). Como faço vimpara não destacar depois de substituir assim?

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

ATUALIZAÇÃO: Todas as respostas que recebi estão apenas adicionando um mapeamento de chave :noh(ou equivalente). Eu realmente tento evitar comportamentos de teclas personalizados com os quais realmente me acostumei, mas depois me faço falhar miseravelmente sem eles (por exemplo, no computador de um amigo, etc.). Eu gostaria vimde fazer automaticamente :nohdepois de fazer uma substituição. Ou seja, eu só quero hlsearchusar /ou *(talvez alguns outros casos), mas não outras vezes.

Respostas:


7

Se você não deseja desativar permanentemente, pode vincular uma chave para alternar o destaque, conforme sugerido nesta resposta, para uma pergunta semelhante sobre o fluxo de pilha.

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

Se você deseja 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

(nas Perguntas frequentes do VIM )


2
Eu estava ciente dessa opção. O problema é que geralmente não estou procurando o que quero substituir, por isso é inútil destacar na maioria dos casos que o substituo. No entanto, é muito útil para quando estou procurando algo, por isso não quero que ele desapareça completamente .
22411 Benjamin Oakes

@ Benjamin: Você o procurou implicitamente. É o que: s faz. Procura um padrão e, em seguida, executa uma transformação nas correspondências. Usar: nohl é a solução certa, pois desativa o realce do padrão de pesquisa atual até a próxima pesquisa ser realizada. Isso é feito sem alterar o estado da opção 'hlsearch' ou afetar o valor armazenado do termo de pesquisa anterior.
jamessan

2
@jamessan: Entendo que é uma pesquisa e substituição. É só que eu não preciso disso destacado então. Principalmente um aborrecimento mais do que tudo.
Benjamin Oakes

Há pouco tempo, comecei a desativar o destaque por padrão e ativá-lo quando quiser, como você sugeriu. Ainda não é perfeito, mas é melhor.
Benjamin Oakes

9

Eu tenho duas soluções diferentes, ambas muito boas, cada uma com um comportamento diferente matizado. O 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 desligar o hlsearch. O segundo liga novamente se o cursor se mover novamente.

    Não é uma solução perfeita, mas funciona para mim (e estará quase perfeita quando o tempo limite for configurável - por enquanto, o tempo limite está associado a um timer 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 tempo limite 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 é suficiente para começar como prova de conceito.


Obrigado pela atualização - não a vi até agora. (Parece que você acabou de adicionar também? Engraçado isso.) Esse é um conceito interessante; Vou ter que brincar com isso.
Benjamin Oakes

A ressalva de 2. é que faz a pesquisa com modo visual Vnão trabalho
Bryce Guinta

Modifiquei a primeira linha na opção 1 com o seguinte autocmd cursorhold * set nohlsearch | let @/ = "" Isso limpará o registro de pesquisa e removerá o destaque. Não gastei muito tempo com essa configuração, mas eu queria divulgá-la para aqueles que terminam aqui.
Berkeley Martinez

2

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


2
Essa é a mesma idéia que :noh, mas nem sempre funciona. :) Engraçado você mencionar isso: eu costumava ter um amigo que sempre digitava o nome dele, porque ele aparecia com menos frequência do que algo como "asdf" no que ele escrevia. (Tipo de engraçado, eu acho.)
Benjamin Oakes

Verdade. Talvez eu me lembre: não da próxima vez.
Greg Graham

1

Coloque o seguinte no seu arquivo .vimrc:

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

Isso ocultará silenciosamente o termo de pesquisa destacado, mas não desabilitará o :set hlsearchrecurso. É ativado novamente na próxima pesquisa.


É melhor simplesmente usar o comando interno projetado para esse fim -: nohl. Então você não soprar o conteúdo de sua pesquisa registo, que é usado para coisas como saltar para o próximo jogo, o valor padrão de um padrão quando nenhum é especificado, etc.
jamessan

Sim, mas me incomodou o fato de minha próxima pesquisa não ter sido destacada como deveria. Então, eu venho com essa solução rápida. Também pode estar sujo, mas funciona. Eu acho que isso é aceitável para o vim - mesmo se eu não usasse coisas "sujas" no código fonte de um projeto grande e real.
Gregor Müllegger 18/01/10

1

Outra possibilidade é redefinir o @/registro (que na verdade é um registro de leitura e gravação) após 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 o cabbrevmapeamento :spara :S, não sei como capturar todas as construções, como :<range>s.
- se você costumava :nohlocultar apenas uma pesquisa, isso realçará a pesquisa anterior. Não sei como descobrir se :nohlfoi chamado anteriormente. (Pode ser possível contornar isso e também substituir o :nohlcomando, mas isso também exigiria a substituição de todos os comandos de pesquisa, o que pode ser muito ...).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.