2014-04-01 23 views
5

我知道:nohl和使用它的時候,我也用簡單的運動,從而亮點是不是在我的方式時,只需移動到搜索位置。在按nN之後,它會按我的方式進入。VIM:如何超時(X秒)後關閉搜索突出

我正在尋找一種方法來禁用按nN後,爲了完整起見,我也想在搜索後禁用它。 /search_word<CR>

最後,它必須是一個無阻塞命令。

謝謝,我慢慢進入vim腳本,但是這個人是我的聯賽,因爲我還沒有看到命令的例子很多與超時那裏。

編輯:

後的一些評論和在線研究有很多跡象也沒有用vim腳本來做到這一點的好辦法。

我正在尋找一種方式用任何語言,如要做到這一點以穩定的方式Perl,Python,Ruby。

編輯2:

這是基於@德魯瓦 - 薩格爾的迴應我的解決方案: (我標誌着他的答案正確的,因爲他給我的骨架吧)。

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

多線程是棘手的,很難在vimscript中完成。你可以創建':noh'的地圖,這將是最簡單的解決方案。你知道,在'/ foo'之後''foo'被存儲在'/'reg中,不管你是否執行了noh,下次按下'n或N'時,匹配的文本都會被高亮顯示,方便,對我來說相當好。 – Kent

回答

6

如果檢查:h :nohl,你會看到該命令:nohl不會自動命令內工作,在於VIM的原因節省&恢復搜索&搜索執行的自動命令後,高亮狀態。因此從技術上講,這樣做是不可行的。最好的方法是創建一個像nnoremap <C-l> :nohlsearch<CR>的映射,並在想要暫時禁用搜索高亮顯示時使用它。

但是,我想證明,使用set nohlsearch而不是nohlsearch可以像您期望的那樣工作,但缺點是它會完全關閉搜索高亮顯示,您需要重新設置 - 使用set hlsearch來啓用它,所以它不是一個真正的解決方案,但它是一個很好的例子來演示如何在vim中執行基於時間的操作。

注意:這是更多的教育目的,以證明你如何能在vim做基於時間的非阻塞任務。這些表現可能會因事件觸發功能的不同而有所不同。

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感謝您的分享,並向我展示如何使用自動命令。我也喜歡你如何檢查時間。不幸的是,這並沒有回答我的問題,或者給了我一個工作解決方法(它真的減慢了我的工作)。我對nohl信息也感到不好,但也許有人會再給我一個黑客! – DavidG

+0

如果我將'set nohlsearch'更改爲':nohlsearch |重繪'它正常工作,因爲我期待。你看到有什麼缺點嗎? – DavidG

+0

不,應該沒有缺點,但它很奇怪,如果它的工作,也許它只是'重繪'這樣做 –

0

以下操作將清除「更新時間」毫秒的非活動狀態後的搜索高亮顯示。 'updatetime'默認爲4000ms或4s,但我已經設定爲10s。需要注意的是'updatetime'不僅僅是這樣,所以在更改之前閱讀文檔。

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

這將清除搜索寄存器,我希望在突出顯示被清除後能夠使用'n'。如果我使用'n',我希望突出顯示在那裏幾秒鐘然後消失,而不是放鬆我的搜索模式。 – DavidG

+0

是的。我不知道是否有其他方法。 (除了禁用和重新啓用搜索突出顯示,它有其不同的缺點) –

+0

更改'v:hlsearch'會是更好的方法。 '讓v:hlsearch = 0' – jamessan

2

恕我直言,更簡單,更可預見的技術如下:

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

你總是擊中逃跑,無論如何,所以這是一個沒有腦子打它,當你想清楚hlsearch。另外,如果您希望在正常模式下不擊中額外的選項,您可以選擇突出顯示比賽。

0

巫術的一點點,但我希望這是有用的:

我調整@ DhruvaSagar的回答通過在不需要的時候停用自動命令來提高性能。我還刪除了CursorHold事件:我喜歡看我的和平結果。

我一起使用這個從here第二答案一段時間後自動關閉的亮點,當我搜索(通過/n)。

我的代碼:

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

這不適合我。 – user1685095

0

凱文·考克斯的答案是正確的軌道上,除了一對夫婦的問題。

  1. 修改@/是禁用突出了現有的搜索
  2. Vim的保存/恢復搜索之前高亮狀態/調用一個函數後,所以試圖改變這種狀況的功能還不是很沉重的霸道做法有用。

解決方案是簡化。不需要函數調用。

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