Vim cancella l'evidenziazione dell'ultima ricerca


1904

Dopo aver effettuato una ricerca in Vim, ricevo tutte le occorrenze evidenziate. Come posso disabilitarlo? Ora faccio un'altra ricerca di qualcosa di incomprensibile che non può essere trovato.

C'è un modo per disabilitare temporaneamente l'evidenziazione e quindi riattivarlo quando necessario di nuovo?


197
Penso che la soluzione "nnoremap <esc>: noh <return> <esc>" sia una risposta più completa alla domanda - inserendola nel tuo .vimrc puoi semplicemente premere <esc> dopo aver cercato per cancellare l'evidenziazione dalla ricerca precedente (ma non disabilitare per sempre l'evidenziazione).
Stewart Johnson,

5
: set invhlsearch disabiliterà l'evidenziazione se è già evidenziato e lo abiliterà se non lo è. Puoi mapparlo per dire Shift-H.
puffadder

1
@StewartJohnson nel farlo nei miei file .vimrc sembra interferire / rompersi con: set mouse = a. Qualche idea sul perché? Questo errore si verifica solo in iTerm2
Charlie Parker il

20
@StewartJohnson Stai attento! Il tuo commento top-rated con errori di mappatura causa e un comportamento imprevisto come descritto nei commenti qui sotto per stackoverflow.com/a/1037182/1698467
skywinder

3
La nnoremap <esc> :noh<return><esc>soluzione suggerita da @StewartJohnson funziona bene in GUI vim, ma causa problemi con i tasti freccia e altri tasti con codifica ESC quando si esegue vim in un terminale. Non mettere nel vostro ~/.vimrc senza avvolgendolo in if has('gui_running')... end.
jbyler,

Risposte:


1588

Per disattivare l'evidenziazione fino alla ricerca successiva:

:noh

O disattiva completamente l'evidenziazione:

set nohlsearch

Oppure, per attivarlo:

set hlsearch!

nnoremap <F3> :set hlsearch!<CR>

14
Effettuando set nohlsearch, l'evidenziazione ritorna al riavvio di vim. :nohfunziona meglio.
Dharmit,

21
è fastidioso che sia altrettanto veloce cercare una stringa incomprensibile: / oajf3w9 come digitare: noh. Mi piace la soluzione di @ avocade di mappare la chiave spaziale su: noh
nnyby

160
Questo non è chiaro da questa risposta e commenti: nota che set nohlsearchdisabiliterà l'evidenziazione anche per le ricerche successive. Il comportamento di :nohè molto diverso: l'evidenziazione verrà automaticamente riattivata quando si esegue una nuova ricerca o anche quando si esegue qualcosa relativo alla ricerca corrente (ad esempio quando si digita nper passare all'elemento successivo).
Skippy le Grand Gourou,

10
Nessuna spiegazione di ciò che effettivamente fanno e delle conseguenze. Grazie a @SkippyleGrandGourou per averne spiegato alcune.
Jason S,

3
Per quanto valga, lo '\/'map <Leader>/ :nohlsearch<CR>
associo

689

Dalla documentazione VIM

Per cancellare l'ultimo modello di ricerca utilizzato:

:let @/ = ""

Questo non imposterà il modello su una stringa vuota, perché corrisponderebbe ovunque. Il modello è davvero chiaro, come quando si avvia Vim.


129
... quale sarebbe una soluzione migliore al suo problema come lo capisco.
Shaun Bouckaert,

8
Questo è quello che stavo cercando! Ho votato a favore, la domanda è leggermente vaga. Questo mi ha portato a pensare che questo è quello che voleva: "Ora faccio un'altra ricerca di qualcosa di incomprensibile che non può essere trovato". Perché è quello che stavo facendo per cancellare la ricerca, ma non disabilitarla, in modo che la ricerca successiva venga evidenziata di nuovo.
Claytron,

50
Questo è ciò su cui pensavo fosse la domanda ... ecco un comando che ho fatto per accelerare la cancellazione della stringa di ricerca (e quindi rimuovere tutti i punti salienti): :command C let @/=""Usando questo ti permette di digitare :Cper cancellare la stringa di ricerca ... molto veloce e non influisce sulla ricerca o sull'evidenziazione futura.
Jason

12
@ jcreamer898, vedere la guida di vim su "registers" ( :he registers). Vim ha diversi registri integrati che contengono testo, a volte per i dati strappati, a volte per l'ultima ricerca, ecc. Quando si esegue una ricerca, vim inserisce il modello nel registro "/", a cui si fa riferimento @/. È inoltre possibile assegnare valori ai registri utilizzando @regname=valuedove regnameè il nome del registro. Quindi, @/=""sta semplicemente impostando il registro "/" su una stringa vuota (tranne che per il registro "/" vim cancellerà l'ultima ricerca se contiene una stringa vuota).
Ben Davis,

3
Aggiungi questo al tuo .vimrc per ottenere Ctrl + / per cancellare l'ultima ricerca: noremap <silent> <c-_> :let @/ = ""<CR>
angrydust

583

Tu puoi fare

:noh

o :nohlsearchper disabilitare temporaneamente l'evidenziazione della ricerca fino alla ricerca successiva.


3
grazie, questo è stato utile ... qualche comando per restituire l'evidenziazione?
Gabriel Solomon,

17
: nohs interrompe solo l'evidenziazione corrente. Se hai: imposta hlsearch quindi continuerà a evidenziare le tue ricerche.
Greyfade,

6
Penso che questo sia ciò che l'OP stava cercando (anche se la risposta di Shaun funziona anche). Sto votando questo per essere più breve. So che ha accettato la risposta nohls, ma l'impostazione disabiliterà l'evidenziazione di tutte le ricerche, anche se in seguito viene tentata un'altra ricerca.
Thiago Arrais,

5
Questo è probabilmente ciò che l'OP ha voluto in primo luogo ed è la risposta più breve e migliore IMHO.

La perfezione è raggiungibile anche in questo regno mortale! Lo userò più di: aiuto e non voglio inquinare <esc>: nnoremap <F1>: noh <CR>
Sam Watkins,

305

Ho trovato questa risposta anni fa su vim.org:

Aggiungi quanto segue al tuo .vimrc:

"This unsets the "last search pattern" register by hitting return
nnoremap <CR> :noh<CR><CR>

Quindi, dopo la tua ricerca, premi di nuovo Invio in modalità comando e l'evidenziazione scompare.


36
Penso che questa sia una soluzione molto migliore di quella che è stata effettivamente accettata - o questa o l'altra in cui è invece mappata su <ESC>.
Stewart Johnson,

20
Questa è una risposta molto migliore a "nnoremap <esc>: noh <return> <esc>" perché non causa comportamenti strani.
Dennis,

19
Una cosa importante da notare, assicurati di non inserire commenti sul lato destro di una rimappatura. Saranno interpretati come comandi per il rimappare rispetto ai commenti.
codybuell,

13
Il commento è sbagliato; il comando non non disinserito l'ultimo modello di ricerca ma semplicemente disattiva l'evidenziazione dei risultati attuali; puoi premere nper trovare la prossima occorrenza (che verrà nuovamente evidenziata). A proposito, durante lo scripting, eviterei la forma abbreviata, e invece scrivo :nohlsearch.
Tobias,

28
Aggiungi <silent> per evitare che il display lampeggi e non lasci nulla nella riga di comando -: nnoremap <silent> <CR>: nohlsearch <CR> <CR>
Peter N Lewis,

137

Da http://twitter.com/jonbho/status/2194406821

" Clear highlighting on escape in normal mode
nnoremap <esc> :noh<return><esc>
nnoremap <esc>^[ <esc>^[

La seconda riga è necessaria per mapping alla chiave di escape poiché Vim utilizza internamente Esc per rappresentare chiavi speciali.


12
Per essere chiari, questo ti consente di cancellare l'evidenziazione della ricerca premendo il tasto Esc
Gavin Miller,

7
Per qualche ragione, questo fa in modo che il mio terminale vim si avvii come se "c" fosse premuto. Qualche idea?
Jacob,

31
Ciò ha causato un comportamento molto strano quando l'ho provato: all'avvio, i movimenti regolari di VIM (ad es. J, k) causavano la rimozione delle linee. nnoremap <CR>: noh <CR> <CR> non ha causato questi problemi. Non sono riuscito a rintracciare la causa principale.
oasisbob,

9
hmm, ho avuto lo stesso problema di quelli sopra. Non usarlo così com'è senza test a meno che non ti piaccia cancellare il tuo testo in modo casuale ...
Derek Litz,

8
usando "nnoremap <esc>: noh <return> <esc>" si avvia sempre la modalità vim in modalità "SOSTITUZIONE".
user1850133

38

La mia soluzione originale (sotto) era sporca e dispendiosa. Adesso uso:noh

Come molte funzionalità di Vim, il modo giusto spesso non è facilmente individuabile.

-

(NON FARLO)

Cerca una sequenza di caratteri improbabile (schiaccia i tasti nella riga home):

/;alskdjf;

Funziona in modo vim e meno ed è più facile da ricordare / digitare rispetto alla soluzione logicamente più pulita di @ ShaunBouckaert "per cancellare l'ultimo modello di ricerca utilizzato":

:let @/ = ""

Un potenziale svantaggio è che aggiunge spazzatura alla cronologia delle ricerche.


17
Non solo questa è una soluzione sporca (che ho usato fino ad ora, senza offesa), un altro aspetto negativo è che aggiunge un brutto banner rosso che dice "modello non trovato" nella parte inferiore della finestra, che è quasi fastidioso come l'evidenziazione stesso e richiede ulteriori azioni da scartare (ad es. "ricerca + backspace").
Skippy le Grand Gourou,

5
Può anche richiedere alcuni secondi, in quanto cerca effettivamente tutto il resto del file. È davvero fastidioso se il file è di grandi dimensioni. Ovviamente, potresti segnare la tua posizione attuale, saltare all'inizio e cercare un personaggio all'indietro, ma è altrettanto sporco.
Blacklight Shining

5
Questa è la soluzione che la maggior parte avrà usato prima di conoscere il :nohlcomando. Una volta appreso di quest'ultimo, mi sono immediatamente fermato a fare quelle ricerche.
Tobias,

7
Questa non è una risposta; mi sta solo raccomandando di fare ciò che OP già fa: "Ora faccio un'altra ricerca di qualcosa di incomprensibile che non può essere trovato."
Ripristina Monica - notmaynard,

2
Se vuoi un motivo infallibile e corto, basta usare /$4. Non è improbabile che corrisponda a nulla ma in realtà completamente IMPOSSIBILE. $deve sempre essere seguito da una nuova riga o essere la fine del file e 4 non è né una nuova riga né la fine del file. (La ragione per 4 in particolare è solo che è sulla stessa chiave, quindi è davvero facile digitare rapidamente)
punto

32

Rimappato nel mio file .vimrc.local, veloce e sporco ma molto funzionale:

" Clear last search highlighting
map <Space> :noh<cr>

32
nnoremap <cr> :noh<CR><CR>:<backspace>

In questo modo mi sbarazzo di :nohmostrato nella riga di comando, quando colpisco enterdopo la ricerca.

:è come iniziare a immettere un nuovo comando, a Backspacecancellarlo e a riportare lo stato attivo nella finestra dell'editor.


6
Grazie. Il ": noh" mostrato in basso a sinistra mi stava facendo impazzire, maledetto disturbo ossessivo compulsivo.
andrewtweber,

Stavo cercando di mapparlo su cr spostato facendo nnoremap <S-cr>: noh <CR> <CR> ma non ha funzionato, sai perché potrebbe non funzionare?
Charlie Parker,

Sospetto che tu non possa combinare il turno con il ritorno, ma sinceramente non ne ho idea.
sjas,

@CharlieParker IIRC puoi usare solo il cambio attivo [a-z]e tali personaggi.
sjas,

7
Invece di fare :<Backspace>, si può semplicemente aggiungere <silent>dopo il nnoremapa dire a Vim di non visualizzare qualsiasi uscita nella zona di comando: nnoremap <silent> <cr> :noh<CR><CR>.
Soren Bjornstad,

31

Le risposte che propongono :noho :nohlsearch(ad esempio, di Matt McMinn) sono corrette per temporaneamente disabilitare evidenziazione della ricerca, come richiesto nella domanda originale.

Ho pensato di contribuire con una mappatura che trovo utile in modalità normale:

nnoremap <C-L> :nohlsearch<CR><C-L>

Per impostazione predefinita, CtrlLin Vim cancella e ridisegna lo schermo. Un certo numero di programmi a riga di comando (principalmente quelli che usano la libreria GNU Readline , come Bash) usano la stessa combinazione di tasti per cancellare lo schermo. Questa funzione è utile nella situazione in cui un processo in esecuzione in background viene stampato sul terminale, sovrascrivendo parti del processo in primo piano.

Questa mappatura in modalità normale cancella anche l'evidenziazione del termine di ricerca più recente prima di ridisegnare lo schermo. Trovo che le due funzioni si completino a vicenda ed è conveniente usarne una CtrlLper entrambe le azioni insieme anziché creare una mappatura separata per disabilitare l'evidenziazione della ricerca.

NB: noremap viene utilizzato piuttosto che mapdiversamente, la mappatura sarebbe ricorsiva.

Suggerimento: di solito rimappo Caps Lockper Ctrlsemplificare la digitazione di tali combinazioni di tasti; i dettagli per farlo dipendono dalla scelta del sistema operativo / sistema di finestre (e sono fuori tema per questa risposta). Entrambi i seguenti suggerimenti includono informazioni sulla mappatura Caps Lockdi Ctrloltre Esc:


26

In genere, :noheseguo il mapping al tasto barra rovesciata. Per riattivare l'evidenziazione, basta premere ne verrà nuovamente evidenziato.


24

Disattiva in modo permanente l'evidenziazione della ricerca

Le corrispondenze non verranno evidenziate ogni volta che esegui una ricerca utilizzando /

:set nohlsearch

Cancella evidenziazione fino alla prossima ricerca

:noh

o :nohlsearch(cancella fino a quando non viene premuto no N)


Evidenziare l'evidenziazione premendo ESC

nnoremap <esc> :noh<return><esc>

Evidenzia l'evidenziazione premendo un altro tasto o una mappa personalizzata

  • Evidenzia evidenzia premendo \(barra rovesciata)

    nnoremap \ :noh<return>
    
  • Evidenzia i punti salienti colpendo ESCdue volte

    nnoremap <esc><esc> :noh<return>
    

2
La nnoremap <silent> <esc> :noh<return><esc>soluzione funziona bene in GUI vim, ma causa gravi problemi con i tasti freccia e altri tasti con codifica ESC quando si esegue vim in un terminale. Non mettere nel vostro ~/.vimrc senza avvolgendolo in if has('gui_running')... end. Considera anche di aggiungere il <silent>che evita di far lampeggiare il :nohcomando nella barra di stato.
jbyler,

17

Questo è quello che uso (estratto da molte domande / risposte diverse):

nnoremap <silent> <Esc><Esc> :let @/=""<CR>

Con "doppio" Escrimuovi l'evidenziazione, ma non appena esegui nuovamente la ricerca, l'evidenziazione ricompare.


Un'altra alternativa:

nnoremap <silent> <Esc><Esc> :noh<CR> :call clearmatches()<CR>

Secondo la documentazione di Vim:

clearmatches ()

    Clears all matches previously defined by |matchadd()| and the

    |:match| commands.

Ho riscontrato alcuni bug nelle migliori soluzioni, in modo da risparmiare tempo cercando tutte le risposte. Usa questa soluzione! Modifica il tuo .vimrce inserisci la seguente voce:nnoremap <silent> <Esc><Esc> :let @/=""<CR>
ani627

Ma è quello che dice Oo Forse potresti votare?
Pablo Olmos de Aguilera C.

Sto supportando la tua soluzione ... È la migliore IMO ... E l'ho anche votata .. :)
ani627

1
Cancellare il registro di ricerca con @/=""ha l'effetto collaterale di nnon funzionare per riavere la ricerca. Preferisco :nohche mantiene la ricerca precedente nel registro per il riutilizzo.
jbyler,

11

Per disattivare l'evidenziazione fino alla ricerca successiva

:noh

Illustrazione visiva


10

Se hai installato il plugin incsearch.vim , allora c'è un'impostazione per cancellare automaticamente l'evidenziazione dopo la ricerca:

let g:incsearch#auto_nohlsearch = 1

inserisci qui la descrizione dell'immagine


8

Janus per VIM e GVIM ha un certo numero di cose cotte per i neofiti come me, incluso

<leader>hs - toggles highlight search

che è esattamente ciò di cui hai bisogno. Basta digitare \hsin modalità normale. (La chiave principale è mappata per \impostazione predefinita.)

HTH.



7

Disattiva l'evidenziazione non appena sposti il ​​cursore:

Installa vim-cool . È stato creato per risolvere questo problema specifico. Disattiva l'evidenziazione non appena si sposta il cursore. Attenzione però, richiede una versione vim recente!


6

Ciò eliminerà l'evidenziazione della ricerca dopo updatetimemillisecondi di inattività.

updatetimeil valore predefinito è 4000ms o 4s ma ho impostato il mio su 10s. È importante notare che updatetimefa molto di più di questo, quindi leggi i documenti prima di cambiarli.

function! SearchHlClear()
    let @/ = ''
endfunction
augroup searchhighlight
    autocmd!
    autocmd CursorHold,CursorHoldI * call SearchHlClear()
augroup END

6

Se si desidera poter abilitare / disabilitare l' evidenziazione rapidamente , è possibile mappare una chiave

" Press F4 to toggle highlighting on/off, and show current value.
:noremap <F4> :set hlsearch! hlsearch?<CR>

Inserisci lo snippet sopra nel tuo file .vimrc.

Questo è il modo più conveniente per me per mostrare e nascondere l'evidenziazione della ricerca con un colpo di tasto cantare

Per ulteriori informazioni, consultare la documentazione http://vim.wikia.com/wiki/Highlight_all_search_pattern_matches


5

Un'altra soluzione combinando 2 risposte principali:

"To clear the last used search pattern:
nnoremap <F3> :let @/ = ""<CR>

Cancellare il registro di ricerca con @/=""ha l'effetto collaterale di nnon funzionare per riavere la ricerca. Preferisco :nohche mantiene la ricerca precedente nel registro per il riutilizzo. Puoi vincolarlo <F3>connnoremap <F3> :noh<CR>
jbyler,


4

Uso solo il semplice nohl di seguito e non sono necessari plug-in.

:nohl


4

La mia ipotesi è che la domanda originale riguardasse la disabilitazione evidenziazione della ricerca ma semplicemente cancellare l'evidenziazione dall'ultima ricerca. La soluzione di cercare una stringa incomprensibile, menzionata nel poster originale, è quella che sto usando da tempo per cancellare l'evidenziazione da una ricerca precedente, ma è brutta e ingombrante.

Diversi suggerimenti che ho trovato per aggiungere nnoremap ...a ~ / .vimrc hanno l'effetto di mettere vim in modalità di sostituzione all'avvio, che non è affatto quello che voglio. La soluzione più semplice che ho trovato è quella di aggiungere la linea

nmap <esc><esc> :noh<return>

al mio ~ / .vimrc. Questo rispetta il principio KISS e non interferisce con i tasti freccia, cosa che fa usando un singolo <esc>. È necessario un doppio <esc> in modalità comando (o un triplo <esc> dalla modalità inserimento o sostituzione) per cancellare l'evidenziazione da una ricerca precedente, ma dal punto di vista dell'interfaccia utente ciò rende l'operazione il più semplice possibile.


Cosa intendi con il singolo <esc> che interferisce con i tasti freccia?
Hansmosh,

1
@hansmosh Vedi unix.stackexchange.com/questions/28713/… Uso due righe nel mio .vimrc come segue nmap <esc><esc> :noh<return> - to turn off search highlighting and nmap <esc>` :set hlsearch<return> - to turn on search highlighting
Lindsay Haisley

4

Uso quanto segue nel mio ~/.vimrc

nnoremap <Leader><space> :noh<Enter>

Questo rende molto facile e veloce cancellare l'attuale ricerca evidenziata. La chiave del mio leader è mappata in \modo da rendere l'azione molto semplice da eseguire con il mignolo e il pollice destro.


3

Penso che mescolare le risposte di @ShaunBouckaert e del 19 marzo 2009 alle 16:22 sia un buon compromesso:

" Reset highlighted search
nnoremap <CR> :let @/=""<CR><CR>

Premere Entere il testo evidenziato non viene più evidenziato, mentre l'evidenziazione della ricerca è ancora abilitata.


3

puoi usare : noremap per attivare / disattivare il risultato della ricerca, in questo modo

:noremap <F3> :set hls! hls?<CR>


3

Basato sulla risposta @ baruch-even, puoi eliminare il termine di ricerca ESCpremendo due volte mentre sei in modalità normale con:

nnoremap <esc> :let @/ = ""<return><esc>
nnoremap <esc>^[ <esc>^[

Penso che il secondo legame sia OK, ma il primo è pericoloso. Il rimappamento <esc>funziona bene in GUI vim, ma causa gravi problemi con i tasti freccia e altri tasti con codifica ESC quando si esegue vim in un terminale. Non mettere nel vostro ~/.vimrc senza avvolgendolo in if has('gui_running')... end. Considera anche di aggiungere il <silent>che evita di far lampeggiare il :nohcomando nella barra di stato.
jbyler,

1

Neanche a me piace. Ho trovato noioso entrare :nohltutto il tempo ... quindi ho inserito la seguente mappatura nel mio.vimrc

noremap <C-_> :nohl<cr>:<backspace>

Il primo bit ( :nohl<cr>) cancella l'evidenziazione; il secondo bit ( :<backspace>) è un trucco per pulire la riga di comando. La ricerca è ancora lì in background, quindi se si preme semplicemente nverrà nuovamente evidenziata e ti porterà alla ricorrenza successiva.


1

Ho aggiunto questo al mio vimrcfile.

command! H let @/=""

Dopo aver fatto una ricerca e vuoi cancellare i momenti salienti dalla tua ricerca, fallo e basta :H


1

In alternativa puoi aggiungere il mapping sul tuo file .vimrc come,

nmap <C-N>: nohlsearch

e quindi è possibile premere

Ctrl + N

in qualsiasi momento per cancellare il testo evidenziato


Si prega di modificare la risposta per garantire che essa migliora altre risposte già presenti in questa domanda.
hongsy,
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.