Come posso impedire a Vim di evidenziare le partite dopo una sostituzione?


13

Ho set hlsearchnel mio ~/.vimrc. Questo è normalmente molto utile, ma è fastidioso doverlo fare :nohdopo aver sostituito un like '<,'>s/$/',/(che evidenzia la fine di ogni riga dopo averlo eseguito). Come posso vimnon evidenziare dopo aver sostituito in questo modo?

Sono su Ubuntu 9.04 con vim7.2. Ho lo stesso problema su OS X 10.6 (anche vim7.2). Qualcosa che funzionerebbe su entrambi sarebbe desiderabile.

AGGIORNAMENTO: Tutte le risposte che ho ricevuto stanno semplicemente aggiungendo una mappatura chiave da fare :noh(o un equivalente). Cerco davvero di evitare comportamenti chiave personalizzati ai quali mi sarei davvero abituato, ma poi mi fanno fallire miseramente senza di loro (ad esempio al computer di un amico, ecc.). Vorrei vimfare automaticamente :nohdopo aver effettuato una sostituzione. Cioè, voglio solo hlsearchquando uso /o *(forse alcuni altri casi), ma non altre volte.

Risposte:


7

Se non si desidera disabilitare permanentemente, è possibile associare un tasto per attivare l'evidenziazione come suggerito in questa risposta a una domanda simile su StackOverflow.

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

Se si desidera disabilitare in modo permanente l'evidenziazione:

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

(dalle FAQ VIM )


2
Ero a conoscenza di questa opzione. Il problema è che sto di solito non alla ricerca di ciò che voglio sostituire, quindi è inutile mettere in evidenza, nella maggior parte dei casi che sostituisco. Tuttavia, è molto utile quando sto cercando qualcosa, quindi non voglio che scompaia completamente .
Benjamin Oakes,

@Benjamin: l'hai cercato implicitamente. Ecco cosa: s fa. Cerca un modello e quindi esegue una trasformazione sulle corrispondenze. Utilizzando: nohl è la soluzione giusta in quanto disattiva l'evidenziazione del modello di ricerca corrente fino a quando non viene eseguita la ricerca successiva. Lo fa senza cambiare lo stato dell'opzione 'hlsearch' o influenzare il valore memorizzato del termine di ricerca precedente.
Jamessan,

2
@jamessan: capisco che si tratta di una ricerca e sostituzione. È solo che non ho bisogno che sia evidenziato allora. Principalmente un fastidio più di ogni altra cosa.
Benjamin Oakes,

Qualche tempo fa, ho iniziato a disattivare l'evidenziazione per impostazione predefinita e ad attivarlo quando lo desidero, come mi hai suggerito. Non è ancora perfetto, ma è meglio.
Benjamin Oakes,

9

Ho due soluzioni diverse, entrambe abbastanza buone, ognuna con un comportamento diverso sfumato. La mia preferita è l'opzione 2:

  1. Ho le seguenti 2 righe nel mio .vimrc:

    autocmd cursorhold * set nohlsearch
    autocmd cursormoved * set hlsearch
    

    Il primo attende un timeout (non configurabile) se il cursore non si sposta e disattiva hlsearch. Il secondo lo riattiva se il cursore si sposta di nuovo.

    Non è una soluzione perfetta, ma funziona per me (e sarà vicino alla perfezione quando il timeout è configurabile - per ora, il timeout è legato a un timer incorporato per vim.)

  2. Oppure puoi provare queste linee:

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

Questo disattiva hlsearch dopo un breve timeout senza movimento del cursore e lo riattiva per i comandi di ricerca standard. Non copre tutte le possibilità di riaccendere hlsearch, ma è sufficiente un antipasto per la prova del concetto.


Grazie per l'aggiornamento - non l'ho visto fino ad ora. (Sembra che tu l'abbia appena aggiunto anche tu? Divertente.) Questo è un concetto interessante; Dovrò giocarci un po '.
Benjamin Oakes,

L'avvertimento del 2. è che rende la ricerca con modalità visiva Vnon lavoro
Bryce Guinta

Ho modificato la prima riga nell'opzione 1 con il seguente autocmd cursorhold * set nohlsearch | let @/ = "" Questo cancellerà il registro di ricerca e rimuoverà l'evidenziazione. Non ho trascorso molto tempo con questo set ma ho voluto metterlo lì fuori per quelli che finiscono qui.
Berkeley Martinez,

2

Digito semplicemente "/ asdf" (supponendo che "asdf" non sia presente nel file) per eliminare l'evidenziazione. So che è piuttosto semplicistico, ma funziona per me.


2
È la stessa idea di :noh, ma non sempre funziona. :) Divertente che dici, però: un tempo avevo un amico che scriveva sempre il suo nome perché usciva meno spesso di qualcosa come "asdf" in quello che ha scritto. (Kinda divertente, credo.)
Benjamin Oakes,

Vero. Forse mi ricorderò: noh la prossima volta.
Greg Graham,

1

Inserisci quanto segue nel tuo file .vimrc:

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

Ciò nasconderà silenziosamente il termine di ricerca evidenziato ma non disabiliterà la :set hlsearchfunzione. Si riattiva nuovamente alla ricerca successiva.


È meglio semplicemente usare il comando incorporato progettato per questo scopo: nohl. Quindi non spazzare via il contenuto del registro di ricerca, che viene utilizzato per cose come saltare alla corrispondenza successiva, il valore predefinito di un modello quando non viene specificato nessuno, ecc.
Jamessan,

Sì, ma mi ha infastidito il fatto che la mia prossima ricerca non sia stata evidenziata come supposto. Quindi mi viene in mente questa rapida soluzione. Potrebbe anche essere sporco ma funziona. Penso che questo sia accettabile per Vim, anche se non userei cose "sporche" in un codice sorgente di un grande progetto reale.
Gregor Müllegger,

1

Un'altra possibilità è reimpostare il @/registro (che in realtà è un registro di lettura-scrittura) dopo aver effettuato la sostituzione. Ciò ripristina il momento saliente precedente:

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

Tuttavia, ciò presenta ancora alcuni problemi:
- invece di modificare :s, definisce un nuovo comando. Mentre è possibile utilizzare cabbrevper mappare :sa :S, so che non c'è modo di catturare tutte le costruzioni, come :<range>s.
- se hai usato in :nohlprecedenza per nascondere una sola ricerca, questo evidenzierà nuovamente la ricerca precedente. Non conosco alcun modo per scoprire se è :nohlstato chiamato in precedenza. (Potrebbe essere possibile aggirare questo e anche sovrascrivere il :nohlcomando, ma ciò richiederebbe anche l'override di tutti i comandi di ricerca, che potrebbe essere troppo ...).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.