Come disattivare automaticamente "hlsearch" dopo aver terminato la ricerca?


19

Adoro l'impostazione "hlsearch", ma dopo aver terminato la ricerca, la trovo odiosa. Soprattutto se cerco qualcosa che ha molte corrispondenze. So che posso disattivarlo con

:set nohlsearch

Ma questo richiede un totale di 16 tasti e, ancora più fastidiosamente, devo riaccenderlo per la mia prossima ricerca con

:set hlsearch    

C'è un modo in cui posso attivare automaticamente hlsearch quando inizio la ricerca e disattivarlo quando ho terminato la ricerca? Ad esempio, se accedo alla modalità di inserimento o modifico il testo, hlsearch viene disattivato senza ulteriori tasti?


3
Definisci automaticamente.
Antony,

@Antony Come in, se sto apportando modifiche o in modalità inserimento, si spegnerà senza che sia necessario premere alcun pulsante. Se inizio a cercare con /o ?, o se premo no N, si accenderà senza che sia necessario premere altri pulsanti.
DJMcMayhem

1
Oh, e definisci la ricerca "fatta"
Christian Brabandt,

1
:nno <BS> :set hls!\|set hls?<CR>- una riga, una pressione di un tasto, feedback di stato e non provare a indovinare di nuovo quando potresti o non vuoi evidenziare. A volte voglio evidenziare a sinistra sullo schermo durante la modifica. A volte no, ad es. Usare /come movimento con un operatore.
Antony,

nnoremap <M-\> :set hlsearch!<CR><Bar>:echo 'hlsearch: ' . ['Off', 'On'][&hlsearch]<CR>
Sato Katsura,

Risposte:


26

C'è un modo molto più conveniente. Invece di usare

:set nohlsearch

che in realtà disattiva l'impostazione hlsearch, usare

:nohls

Questo disattiverà hlsearch solo fino a quando non effettuerai nuovamente la ricerca. A partire dal:help nohls

                 *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
'hlsearch' 'hls'    boolean (default off)
            global
            {not in Vi}
            {not available when compiled without the
            |+extra_search| feature}

    ...

    When you get bored looking at the highlighted matches, you can turn it
    off with |:nohlsearch|.  This does **not change the option value**, as
    soon as you use a search command, the highlighting comes back.

Tuttavia, questa soluzione non è perfetta, dal momento che devi ancora scrivere :nohlsquale è il dolore da fare dopo ogni ricerca. Puoi aggirare questo problema con una mappatura, ad es

nnoremap <esc><esc> :silent! nohls<cr>

Ma c'è una soluzione ancora migliore ! haya14busa / incsearch.vim . Questo è, almeno secondo me, un plugin vim essenziale . La caratteristica principale è che tutte le corrispondenze di ricerca sono evidenziate in tempo reale, mentre stai digitando la tua regex. Per esempio:

inserisci qui la descrizione dell'immagine

Tuttavia, una funzione secondaria fornita è anche l'opzione per attivare e disattivare immediatamente hlsearch quando si avvia / interrompe la ricerca. Per abilitare questa funzione, dovrai aggiungere

set hlsearch
let g:incsearch#auto_nohlsearch = 1
map n  <Plug>(incsearch-nohl-n)
map N  <Plug>(incsearch-nohl-N)
map *  <Plug>(incsearch-nohl-*)
map #  <Plug>(incsearch-nohl-#)
map g* <Plug>(incsearch-nohl-g*)
map g# <Plug>(incsearch-nohl-g#)

al tuo .vimrc.

Se hai altre nmappature, dovrai disattivarle. Ad esempio, avevo

nnoremap n nzz
nnoremap N Nzz

Queste due mappature non sono compatibili tra loro!


Dal momento che stai rispondendo da solo, vorrei suggerirti di aggiungere anche un altro problema set hlsearch. Se lo hai definito vimrc, lo sovrascriverà :nohogni volta che lo procedi vimrc. Per risolvere questo ho if !&hlsearch | set hlsearch | endifnel mio vimrc. (E questo è un altro problema risolto dal plugin.)
Grochmal

Non so, sembra un mucchio di codice e configura per non guadagnare molto per me. In effetti rende più difficile individuare l'obiettivo della tua ricerca incrementale, rendendolo meno utile per la navigazione rapida.
Antony,

+1 per un ottimo plugin che risponde alla domanda e fa molto di più!
RichVel,

7

vim-cool è un semplice plugin che fa proprio questo.

Vim-cool disabilita l'evidenziazione della ricerca quando hai terminato la ricerca e la riattiva quando esegui di nuovo la ricerca.

Funziona senza rimappatura dal utilizzando l' CursorMovede InsertEnterautocomandi.


Questa tecnica (usando i autocomandi) è molto meglio della mia risposta, e non posso credere di non averci pensato quando ho scritto il mio. Upvote.
Ricco

5

Uso <Leader><Enter>come scorciatoia per :noh. (Il mio capo è ,, quindi è abbastanza vicino)

Ciò disattiverà i momenti salienti fino alla tua prossima ricerca.


3

Come hai già notato nella tua risposta , è molto più efficiente disattivare l'evidenziazione con il :nohlsearchcomando (che può essere abbreviato :noh) piuttosto che disattivare l'intera funzionalità e riaccenderla alla successiva ricerca.

Se si desidera disattivare l'evidenziazione ogni volta che si utilizza iper accedere alla modalità di inserimento, è possibile creare una semplice mappatura per farlo:

:nnoremap i :noh<cr>i

È lasciato come esercizio per il lettore creare mappature simili per altri comandi in cui desiderano evidenziare disattivato.


1

Potrebbe sembrare stupido o ingenuo, ma quello che faccio quando voglio fermare l'evidenziazione è che cerco una stringa casuale che (quasi certamente) non è presente nel documento. Qualcosa come questo:

/skljdfhadhfs

Certo, ci vogliono alcuni tasti, ma sono davvero casuali, quindi possono essere digitati in pochissimo tempo.


1
Ma questo fa ne Nnon funziona più, e anche cose come :%s//somethingo :g//something. Inoltre, ingombra la cronologia delle ricerche
DJMcMayhem

Sì, ma la mia ipotesi (probabilmente errata) è che dal momento che non hai più bisogno di evidenziarlo, non ti interessa nemmeno quella particolare ricerca. Disordinare la cronologia delle ricerche è un vero problema, se uno si basa su di essa.
Kostas,

1

Ho trovato più intuitivo rimappare il Ctrl- Lridipingere per includere :nohls:

nnoremap <C-L> :nohls<cr><C-L>

Benvenuti in Vi e Vim ! Grazie per aver condiviso le tue conoscenze su quella che è certamente una vecchia domanda. Le risposte di alta qualità, come avrai notato, in genere vengono fornite con una spiegazione di ciò che il codice sta facendo (questo è particolarmente utile per i nuovi vimmers che potrebbero atterrare qui senza molta conoscenza). Può anche essere una buona idea per le :helpsezioni pertinenti !
D. Ben Knoble,

0

Uso <Leader><Enter>come scorciatoia :hlse ho il mio leader impostato come spazio.

let mapleader = "\<Space>"
nmap <silent> <leader><Esc> :set hls!<cr>

Dopo aver cercato un elemento verrà evidenziato, per disattivarlo, premi <Space><Esc>. E se decidi di voler visualizzare nuovamente i risultati della ricerca, premi <Space><Esc>. I hls!mezzi associano questa associazione di tasti per attivare / disattivare l'impostazione hls(scorciatoia hlsearch, ovvero l'evidenziazione dei risultati della ricerca) (quindi !attiva o disattiva l'impostazione immediatamente prima di essa).


-1

Aggiungi questa macro al tuo .vimrc

map #h :set hls!<CR>

Questo ti permetterà di attivare / disattivare l'hilighting con #h


Questo non è diverso dalla risposta di James Affleck.
Jamessan,

Il mio sembra più conciso.
Darrel Lee,

Perché la concisione è rilevante? L'altro post fornisce ulteriori informazioni sul significato delle parti del comando e questo post non fornisce alcun contenuto aggiuntivo.
Jamessan,
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.