2014-04-01 10 views
5

Wiem o :nohl i używam go cały czas, używam również łatwego ruchu, więc wyróżnienie nie jest na mojej drodze, gdy po prostu przenosimy się do lokalizacji wyszukiwania. To wchodzi mi w drogę po naciśnięciu klawisza n lub N.VIM: Jak wyłączyć podświetlenie wyszukiwania po upływie czasu (X sekund)?

szukam sposobu, aby wyłączyć podświetlenie wyszukiwarki po 3 seconds prasowania n lub N, również przez wzgląd na kompletność Chciałbym sposób również wyłączyć go po wyszukaniu na przykład /search_word<CR>.

Wreszcie, musi to być polecenie bez blokowania.

Dzięki, powoli dostaję się do vimscript, ale ten jest poza moją ligą, ponieważ nie widziałem wielu przykładów poleceń z timeoutami.

EDIT:

Po niektórych komentarzach i badań online istnieje wiele wskazań nie jest dobrym sposobem, aby to zrobić z vimscript.

Szukam sposobu na zrobienie tego w stabilny sposób z dowolnym językiem, np. Perl, Python, Ruby.

EDIT 2:

To jest moje rozwiązanie na podstawie odpowiedzi @ Dhruvę-Sagar za: (I oznaczony jako swoją odpowiedź prawidłowa, ponieważ dał mi szkielet dla niego).

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

Wielowątkowość jest trudna i trudna do zrobienia w vimscript. możesz stworzyć mapę dla ': noh', byłoby to najłatwiejsze rozwiązanie. Wiesz, że po '/ foo'' foo' był zapisany w '/' reg, nie ważne czy wykonałeś 'noh' czy nie, następnym razem gdy naciśniesz' n lub N', dopasowany tekst zostanie podświetlony, to poręczny i całkiem w porządku dla mnie. – Kent

Odpowiedz

6

Jeśli zaznaczysz :h :nohl, widać, że polecenie :nohl nie działa w obrębie autocmd, dlatego że vim oszczędza & przywraca wyszukiwarki & przeszukiwanie podkreślając stan po wykonaniu się autocmd. Dlatego technicznie nie jest to możliwe. Najlepszym sposobem jest utworzenie mapowania, takiego jak nnoremap <C-l> :nohlsearch<CR> i użycie go, gdy chcesz tymczasowo wyłączyć podświetlanie wyszukiwania.

Istnieje jednak niewielki hack, który chciałbym zademonstrować, że działa w sposób, jakiego oczekujesz, używając set nohlsearch zamiast nohlsearch, wadą jest oczywiście całkowite wyłączenie podświetlania wyszukiwania i musisz ponownie -włącz go używając set hlsearch, więc nie jest to właściwie rozwiązanie, ale daje dobry przykład, aby pokazać, jak można wykonywać operacje oparte na czasie w vimie.

UWAGA: Jest to bardziej przydatne do celów edukacyjnych w celu zademonstrowania, w jaki sposób można wykonywać nielimitowane zadania oparte na czasie w vim. Ich działanie może się różnić w zależności od tego, co robisz w funkcji wyzwalania zdarzenia.

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 Dziękujemy za udostępnienie i pokazanie, jak korzystać z automatycznych poleceń. Podoba mi się też, jak sprawdzasz czas. Niestety to nie odpowiada na moje pytanie lub daje mi obejście problemu (naprawdę spowalnia to dla mnie). Czuję się też źle z powodu: nohl info, ale może ktoś da mi kolejny hack! – DavidG

+0

Jeśli zmienię twój 'set nohlsearch' dla': nohlsearch | przerysuj "działa tak, jak się spodziewam. Czy widzisz jakieś wady? – DavidG

+0

Nie, nie powinno być żadnych wad, ale to dziwne, jeśli działa, może to jest tylko "przerysowanie", które to robi. –

0

Następujące wyczyści podświetlenie wyszukiwania po "updatetime" milisekundach braku aktywności. "updatetime" domyślnie wynosi 4000ms lub 4s, ale ustawiłem minę na 10s. Ważne jest, aby pamiętać, że "updatetime" robi więcej niż tylko to, więc przeczytaj dokumenty, zanim je zmienisz.

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

Spowoduje to wyczyszczenie rejestru wyszukiwania, chcę móc użyć 'n' po usunięciu zaznaczenia. Jeśli użyję 'n', chciałbym, aby podświetlenie znalazło się tam przez kilka sekund, a następnie zniknęło, a nie tylko utracił mój wzór wyszukiwania. – DavidG

+0

Tak, to prawda. Nie wiem, czy jest jakakolwiek inna droga. (z wyjątkiem wyłączania i ponownego włączania podświetlania wyszukiwania, które ma inny zestaw wad). –

+0

Zmiana 'v: hlsearch' byłaby lepszym rozwiązaniem. 'let v: hlsearch = 0' – jamessan

2

IMHO, prostsze i bardziej przewidywalne techniki jest następujący:

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

Ty zawsze trafiając uciec tak, więc to nie myślenia uderzyć go, gdy chcemy wyczyścić hlsearch. Ponadto można pozostawić podświetlone mecze, jeśli nie chcesz, aby w normalnym trybie nie trafiały dodatkowe.

0

Trochę nekromancji, ale mam nadzieję, że to przydatne:

I manipulowane @ odpowiedź DhruvaSagar do poprawy wydajności poprzez wyłączanie autocmd gdy nie jest potrzebny. Usunąłem też zdarzenie CursorHold: lubię patrzeć na wyniki w spokoju.

Używam tego razem z drugą odpowiedź od here automatycznie wyłącza podświetlenie po jakimś czasie, kiedy jestem nie poszukiwania (przez / lub n).

Mój kod: odpowiedź

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

To nie działa dla mnie. – user1685095

0

Kevin Cox był na dobrej drodze z wyjątkiem paru problemów.

  1. Modyfikowanie @/ jest ciężki ręką podejście wyłączyć podświetlanie istniejącego poszukiwaniu
  2. Vim zapisuje/przywraca przeszukiwanie podkreślając stan przed/po wywołaniu funkcji, więc starają się zmienić w zależności nie jest bardzo przydatny.

Rozwiązaniem jest uproszczenie. Nie ma potrzeby wywoływania funkcji.

autocmd CursorHold,CursorHoldI * let v:hlsearch = 0 | redraw 
Powiązane problemy