2014-04-01 10 views
5

Tôi biết về :nohl và sử dụng mọi lúc, tôi cũng sử dụng chuyển động dễ dàng để không làm nổi bật khi di chuyển đến vị trí tìm kiếm. Nó theo cách của tôi sau khi nhấn n hoặc N.VIM: Cách tắt đánh dấu tìm kiếm sau khi hết giờ (X giây)

Tôi đang tìm kiếm một cách để vô hiệu hóa nổi bật tìm kiếm sau khi 3 seconds của nhấn n hoặc N, cũng cho đầy đủ vì tôi muốn một cách để cũng vô hiệu hóa nó sau khi tìm kiếm ví dụ /search_word<CR>.

Cuối cùng, đó phải là lệnh không chặn.

Cảm ơn, tôi đang dần dần đi vào vimscript nhưng điều này là ra khỏi giải đấu của tôi kể từ khi tôi đã không nhìn thấy nhiều ví dụ về lệnh với timeout ra khỏi đó.

EDIT:

Sau khi một số ý kiến ​​và nghiên cứu trực tuyến có rất nhiều dấu hiệu cho thấy không có một cách tốt để làm điều này với vimscript.

Tôi đang tìm cách để làm điều này một cách ổn định với bất kỳ ngôn ngữ nào, ví dụ: Perl, Python, Ruby.

EDIT 2:

này được giải pháp của tôi dựa trên phản ứng @ dhruva-sagar của: (Tôi đánh dấu câu trả lời của mình như là đúng vì ông đã cho tôi bộ xương cho nó).

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

đa luồng là khó khăn và khó thực hiện trong vimscript. bạn có thể tạo một bản đồ cho ': noh', nó sẽ là giải pháp đơn giản nhất. Bạn biết rằng sau khi bạn '/ foo'' foo' được lưu trữ trong '/' reg, không có vấn đề gì nếu bạn thực hiện 'noh' hay không, lần sau bạn nhấn' n hoặc N', văn bản phù hợp sẽ được đánh dấu, nó là tiện dụng và khá ok cho tôi. – Kent

Trả lời

6

Nếu bạn kiểm tra :h :nohl, bạn sẽ thấy rằng lệnh :nohl không hoạt động trong một autocmd, lý do là vim mà tiết kiệm & phục hồi tìm kiếm & tìm kiếm nổi bật trạng thái sau khi thực hiện một autocmd. Do đó về mặt kỹ thuật nó không phải là khả thi để làm như vậy. Cách tốt nhất là tạo một ánh xạ như nnoremap <C-l> :nohlsearch<CR> và sử dụng nó khi bạn muốn tạm thời tắt đánh dấu tìm kiếm.

Tuy nhiên, có một chút hack mà tôi muốn chứng minh rằng nó hoạt động theo cách bạn mong đợi bằng cách sử dụng set nohlsearch thay vì nohlsearch, nhược điểm của khóa học là nó tắt tìm kiếm làm nổi bật hoàn toàn và bạn cần phải - có thể sử dụng nó set hlsearch, vì vậy nó không thực sự là một giải pháp nhưng nó làm cho một ví dụ tốt để chứng minh làm thế nào người ta có thể thực hiện các hoạt động dựa trên thời gian trong vòng vim.

LƯU Ý: Điều này là nhiều hơn cho mục đích giáo dục để chứng minh cách bạn có thể làm thời gian dựa trên các tác vụ không chặn trong vim. Hiệu suất của những điều này có thể khác nhau tùy thuộc vào những gì bạn làm trong chức năng kích hoạt sự kiện.

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 Cảm ơn bạn đã chia sẻ và cho tôi biết cách khai thác các lệnh tự động. Tôi cũng thích cách bạn kiểm tra thời gian. Thật không may điều này không trả lời câu hỏi của tôi hoặc cung cấp cho tôi một workaround làm việc (nó thực sự làm chậm những thứ xuống cho tôi). Tôi cũng cảm thấy xấu về thông tin: nohl, nhưng có thể ai đó sẽ cho tôi một hack nữa! – DavidG

+0

Nếu tôi thay đổi 'set nohlsearch' thành': nohlsearch | vẽ lại nó hoạt động như tôi mong đợi. Bạn có thấy bất kỳ nhược điểm nào không? – DavidG

+0

Không nên có nhược điểm nào, nhưng thật kỳ lạ, nếu nó hoạt động có thể nó chỉ 'vẽ lại' đang thực hiện nó –

0

Sau đây sẽ xóa đánh dấu tìm kiếm sau 'mili giây' không hoạt động. 'updatetime' mặc định là 4000ms hoặc 4s nhưng tôi đã đặt giá trị của tôi là 10 giây. Điều quan trọng cần lưu ý là 'updatetime' không chỉ làm việc này để đọc tài liệu trước khi bạn thay đổi nó.

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

Thao tác này sẽ xóa thanh ghi tìm kiếm, tôi muốn có thể sử dụng 'n' sau khi đánh dấu đã bị xóa. Nếu tôi sử dụng 'n' tôi muốn làm nổi bật ở đó trong một vài giây và sau đó biến mất, không chỉ mất mẫu tìm kiếm của tôi. – DavidG

+0

Có. Tôi không biết có cách nào khác không. (ngoại trừ vô hiệu hóa và kích hoạt lại tìm kiếm làm nổi bật trong đó có bộ khác nhau của các nhược điểm) –

+0

Thay đổi 'v: hlsearch' sẽ là cách tiếp cận tốt hơn ở đây. 'let v: hlsearch = 0' – jamessan

2

IMHO, một kỹ thuật đơn giản hơn và dễ dự đoán hơn như sau:

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

Bạn tôi luôn đánh thoát dù sao, do đó, nó không có trí tuệ để đánh nó khi bạn muốn xóa hlsearch. Ngoài ra, bạn có thể chọn để lại các trận đấu được đánh dấu nếu bạn muốn bằng cách không đánh thêm ở chế độ bình thường.

0

Một chút gọi hồn, nhưng tôi hy vọng nó hữu ích:

tôi chỉnh @ câu trả lời DhruvaSagar để cải thiện hiệu suất bằng cách khử hoạt các autocmd khi nó không cần thiết. Ngoài ra tôi đã xóa sự kiện CursorHold: Tôi muốn xem kết quả của mình trong hòa bình.

Tôi đang sử dụng này cùng với câu trả lời thứ hai từ here để tự động tắt nổi bật sau một thời gian khi tôi không tìm kiếm (thông qua / hay n).

Mã của tôi: Câu trả lời

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

Điều này không hiệu quả đối với tôi. – user1685095

0

Kevin Cox là đi đúng hướng ngoại trừ một vài vấn đề.

  1. Sửa đổi @/ là một cách tiếp cận thuận tay nặng để vô hiệu hóa nổi bật của việc tìm kiếm hiện
  2. Vim lưu/khôi phục việc tìm kiếm nổi bật trạng thái trước/sau khi gọi một hàm, vì vậy cố gắng để thay đổi điều đó trong một chức năng không phải là rất hữu ích.

Giải pháp là đơn giản hóa. Không cần gọi hàm.

autocmd CursorHold,CursorHoldI * let v:hlsearch = 0 | redraw 
Các vấn đề liên quan