Qual'è la differenza funzionale tra: nohlsearch e: set nohlsearch?


13

Ho notato che quando lo uso :nohlsearchin realtà non fa la stessa cosa di :set nohlsearch.

In particolare, l' hlsearchimpostazione non è effettivamente disattivata (che è ciò che :set hlsearch) esegue.

Per dimostrare cosa intendo:

:set hlsearch
:nohlsearch
:echo &hlsearch

Questo stampa 1( hlsearch è ancora impostato! )

:set hlsearch
:set nohlsearch
:echo &hlsearch

Ciò viene stampato 0perché abbiamo disattivato hlsearch utilizzando il modo standard per disattivare un'impostazione in vim.

Quindi mi chiedo perché ci deve essere una vera ragione per l' :nohlsearchesistenza dell'ex comando.

Il motivo per cui mi interessa è che ora ho bisogno del mio scripting VIM per verificare se il momento saliente della ricerca è attivo e dato che stavo usando :nohlsearchinvece di ": set nohlsearch" negli altri script, il mio &hlsearchtest ritorna sempre 1. Quindi mi chiedo cosa sto cambiando non usando più il nohlsearchcomando ex.

Risposte:


15

A partire dal :h :nohlsearch

                                                        : noh: nohlsearch
: noh [lsearch] Ferma l'evidenziazione per l'opzione "hlsearch". esso
                        viene riattivato automaticamente quando si utilizza una ricerca
                        comando o impostando l'opzione 'hlsearch'.
                        Questo comando non funziona in un autocomando, perché
                        lo stato di evidenziazione viene salvato e ripristinato quando
                        esecuzione di autocommands autocmd-searchpat.
                        Stessa cosa quando si richiama una funzione utente.

Il punto chiave è che riattiva automaticamente l'evidenziazione quando si avvia una nuova ricerca. :set nohlsearchin realtà si hlsearchspegne, il che significa che la prossima volta che cerchi qualcosa che non viene evidenziato.

Esempio: Supponiamo hlsearchche sia attivo, se stai cercando "ciao" in un buffer, tutti gli "ciao" saranno evidenziati. Se si utilizza :nohlsearchnulla verrà evidenziato. Ma se poi cerchi "mondo", tutti i "mondo" verranno evidenziati. Se set nohlsearchinvece avessi usato "mondo" non verrebbe evidenziato.


Si noti inoltre che questo comando praticamente non fa nulla all'interno di una funzione utente. Per esempio,

function! NoHlsearch()
    nohlsearch
endfunction

non ha alcun effetto visibile quando eseguito.


Per vedere se hlsearch è effettivamente attivo, si desidera controllare la variabile v:hlsearch. Quando l' v:hlsearch = 0evidenziazione è disattivata e quando l' v:hlsearch = 1evidenziazione è attivata. Probabilmente dovresti assicurarti di &hlsearch = 1prima di controllare v:hlsearch.

A partire dal :h v:hlsearch

                                        v: hlsearch hlsearch-variabile
v: hlsearch Variabile che determina se l'evidenziazione della ricerca è attiva.
                Ha senso solo se è abilitato 'hlsearch' che richiede
                + Extra_search. L'impostazione di questa variabile su zero agisce allo stesso modo
                : comando nohlsearch, impostandolo su uno si comporta come
                        let & hlsearch = & hlsearch

Puoi chiarire cosa intendi con "praticamente nulla" all'interno di una funzione? Fa la cosa standard (smette temporaneamente di evidenziare la ricerca fino a quando non viene invocata la ricerca successiva).
Steven Lu,

Spero anche di trovare un modo per accedere alla bandiera che controlli se il transitorio :nohlsearchè attivo o no ... Penso che in sua assenza devo ricorrere al tracciamento di tutte le :nohlsearchchiamate con una variabile.
Steven Lu,

@StevenLu vedi le modifiche.
FDinoff,

Grazie. Sembra che il codice che ho usato con gli hacker sia "sostanzialmente non facendo nulla" facendolo: nnoremap <silent> <expr> <boundkey> SearchHighlight()dove SearchHighlight()può restituire una stringa ":silent nohlsearch\<CR>". Grazie anche per il v:hlsearchsuggerimento, proprio quello di cui avevo bisogno.
Steven Lu,

1

La tua sceneggiatura richiede che sia noto l'attuale stato di evidenziazione?

Per disattivare hlsearchsolo la ricerca corrente, io uso Ctrl-l, con questo nel mio .vimrc:

nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>

L'evidenziazione della ricerca ritorna con la ricerca successiva quando si utilizza il comando precedente. Ctrl-lè conveniente perché l'uso normale è quello di cancellare e ridisegnare lo schermo.

Per cambiare permanentemente lo stato di evidenziazione della ricerca, uso F3 come interruttore:

nnoremap <F3> :set hlsearch! hlsearch?<CR>
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.