2014-04-01 17 views
5

Conosco lo :nohl e lo uso sempre, inoltre utilizzo il movimento facile in modo che l'evidenziazione non sia a mio favore quando ci si sposta nella posizione di ricerca. Si mette sulla mia strada dopo aver premuto n o N.VIM: Come disattivare l'evidenziazione della ricerca dopo il timeout (X secondi)

Sto cercando un modo per disattivare l'evidenziazione di ricerca dopo 3 seconds di premere n o N, anche per completezza vorrei un modo per disattivare anche dopo la ricerca per esempio /search_word<CR>.

Infine, deve essere un comando non bloccante.

Grazie, sto lentamente entrando in vimscript ma questo è fuori dal mio campionato poiché non ho visto molti esempi di comandi con timeout.

EDIT:

Dopo alcuni commenti e le ricerche on-line ci sono un sacco di indicazioni non v'è un buon modo per fare questo con vimscript.

Sto cercando un modo per farlo in modo stabile con qualsiasi lingua, ad es. Perl, Python, Ruby.

EDIT 2:

Questa è la mia soluzione basata sulla risposta di @ dhruva-Sagar: (ho segnato la sua risposta come corretta perché mi ha dato lo scheletro per esso).

augroup NoHLSearch 
    au! 
    autocmd CursorHold,CursorMoved * call <SID>NoHLAfter(4) 
augroup END 

function! s:NoHLAfter(n) 
    if !exists('g:nohl_starttime') 
    let g:nohl_starttime = localtime() 
    else 
    if v:hlsearch && (localtime() - g:nohl_starttime) >= a:n 
     :nohlsearch 
     redraw 
     unlet g:nohl_starttime 
    endif 
    endif 
endfunction 
+0

multi-threading è difficile e difficile da eseguire in vimScript. puoi creare una mappa per ': noh', sarebbe la soluzione più semplice. Sai che dopo/foo' il 'foo' è stato memorizzato in'/'reg, non importa se hai eseguito' noh' o no, la prossima volta che hai premuto 'n o N', il testo corrispondente sarebbe stato evidenziato, è a portata di mano e abbastanza bene per me. – Kent

risposta

6

Se si seleziona :h :nohl, si vedrà che il comando :nohl non funziona all'interno di un autocmd, il motivo è che Vim salva & ripristina la ricerca & di ricerca mettendo in evidenza lo stato dopo l'esecuzione di autocmd. Quindi tecnicamente non è fattibile farlo. Il modo migliore è creare una mappatura come nnoremap <C-l> :nohlsearch<CR> e usarla quando si desidera disattivare temporaneamente l'evidenziazione della ricerca.

Tuttavia c'è un leggero trucco che mi piacerebbe dimostrare che funziona in un modo come ci si aspetta utilizzando set nohlsearch invece nohlsearch, il rovescio della medaglia, naturalmente, è che si spegne di ricerca evidenziando completamente ed è necessario ri -consente di utilizzare set hlsearch, quindi non è davvero una soluzione ma costituisce un buon esempio per dimostrare come si possano eseguire operazioni basate sul tempo all'interno di vim.

NOTA: Questo è più a scopo didattico per dimostrare come è possibile eseguire attività non bloccanti basate sul tempo in vim. Le prestazioni di questi potrebbero variare a seconda di ciò che si fa all'interno della funzione attivata dall'evento.

augroup NoHLSearch 
    au! 

    autocmd CursorHold,CursorMoved * call <SID>NoHLAfter(3) 
augroup END 

function! s:NoHLAfter(n) 
    if !exists('g:nohl_starttime') 
    let g:nohl_starttime = localtime() 
    else 
    if v:hlsearch && (localtime() - g:nohl_starttime) >= a:n 
     set nohlsearch 
     unlet g:nohl_starttime 
    endif 
    endif 
endfunction 
+0

+1 Grazie per la condivisione e per avermi mostrato come accedere ai comandi automatici. Mi piace anche come controlli per tempo. Sfortunatamente questo non risponde alla mia domanda o mi dà una soluzione funzionante (rallenta davvero le cose per me). Mi sento anche male per le informazioni: nohl, ma forse qualcuno mi darà un altro trucco! – DavidG

+0

Se cambio il tuo 'set nohlsearch' per': nohlsearch | ridisegna' funziona come mi aspetto. Vedi qualche svantaggio di questo? – DavidG

+0

No, non ci dovrebbero essere aspetti negativi, ma è strano, se funziona forse è solo 'redraw' che lo sta facendo –

0

Di seguito cancellerà il punto culminante di ricerca dopo millisecondi 'UpdateTime' di inattività. 'updatetime' si imposta automaticamente su 4000ms o 4s ma ho impostato il mio su 10s. È importante notare che "updatetime" fa molto più di questo, quindi leggi i documenti prima di cambiarlo.

function! SearchHlClear() 
    let @/ = '' 
endfunction 
autocmd CursorHold,CursorHoldI * call SearchHlClear() 
+0

Questo cancella il registro di ricerca, voglio poter usare 'n' dopo che l'evidenziazione è stata cancellata. Se uso 'n', vorrei che il momento saliente fosse lì per un paio di secondi e poi scomparire, non solo perdere il mio schema di ricerca. – DavidG

+0

Sì, sì. Non so se c'è un altro modo. (eccetto disabilitare e riattivare l'evidenziazione della ricerca che ha il suo diverso insieme di aspetti negativi) –

+0

Cambiare 'v: hlsearch' sarebbe l'approccio migliore qui. 'let v: hlsearch = 0' – jamessan

2

IMHO, una tecnica più semplice e prevedibile, è la seguente:

noremap <silent><esc> <esc>:noh<CR><esc>

Sei sempre colpendo sfuggire in ogni caso, quindi è un gioco da ragazzi per colpire quando si desidera cancellare hlsearch. Inoltre, è possibile scegliere di lasciare le partite evidenziate se si desidera non colpendo un extra in modalità normale.

0

Un po 'di necromanzia, ma spero che sia utile:

ho ottimizzato @ risposta di DhruvaSagar per migliorare le prestazioni disattivando l'autocmd quando non è necessario. Inoltre ho rimosso l'evento CursorHold: mi piace guardare i miei risultati in pace.

Sto usando questo insieme alla seconda risposta da here per disattivare automaticamente il punto culminante dopo un po 'quando sono non ricerca (tramite / o n).

Il mio codice: risposta di

function! s:NoHLAfter(n) 
    if (localtime() - g:nohl_starttime) >= a:n 
    call <SID>Onnohl() 
    endif 
endfunction 

function! s:Onnohl() 
    set nohlsearch 
    augroup AutoNohl 
    au! 
    augroup END 
endfunction 

function! s:Onsearch() 
    set hlsearch 
    nohlsearch 
    let g:nohl_starttime = localtime() 
    augroup AutoNohl 
    au! 
    " autocmd CursorHold,CursorMoved * call <SID>NoHLAfter(4) 
    " only do it on CursorMoved: We sometimes 'hold' and look at the 
    " findings. 
    autocmd CursorMoved * call <SID>NoHLAfter(4) 
    augroup END 
endfunction 

noremap n :call <SID>Onsearch()<cr>n 
noremap N :call <SID>Onsearch()<cr>N 
noremap/:call <SID>Onsearch()<cr>/ 
noremap ? :call <SID>Onsearch()<cr>? 
+0

Questo non funziona per me. – user1685095

0

Kevin Cox era sulla strada giusta ad eccezione di un paio di problemi.

  1. Modifica @/ è un approccio mano pesante per disattivare l'evidenziazione della ricerca esistente
  2. Vim salva/ripristina la ricerca evidenziando stato prima/dopo la chiamata di una funzione, in modo da cercare di cambiare la situazione in una funzione non è molto utile.

La soluzione è semplificare. Non c'è bisogno di una chiamata di funzione.

autocmd CursorHold,CursorHoldI * let v:hlsearch = 0 | redraw 
Problemi correlati