2009-10-11 45 views
51

Tôi đã làm việc trong NetBeans và thích tính năng này: khi bạn đặt con trỏ vào một tên biến, tất cả các lần xuất hiện của biến sẽ được tô sáng. Điều này rất hữu ích để nhanh chóng tìm kiếm tất cả các lần xuất hiện của biến. Có thể thêm hành vi này vào Vim không?Đánh dấu biến dưới con trỏ trong Vim như trong NetBeans

Trả lời

81

autocommand này sẽ làm những gì bạn muốn:

:autocmd CursorMoved * exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\')) 

vi highlight current word

Edit: Tôi đã sử dụng nhóm IncSearch nổi bật trong ví dụ của tôi, nhưng bạn có thể thấy các màu khác để sử dụng bằng cách chạy này lệnh:

:so $VIMRUNTIME/syntax/hitest.vim 
+0

có cách nào để tắt tiếng các lỗi trùng khớp không? – UncleZeiv

+0

@UncleZeiv: Tôi không chắc chắn ý bạn là gì bởi lỗi –

+0

nếu tôi di chuyển con trỏ ở cuối chú thích kiểu C (dấu sao theo dấu gạch chéo), tôi nhận được 'E488: Ký tự nhân vật: khớp IncSearch/\ <*/\> ', và tôi thậm chí phải nhấn Enter trước khi tiếp tục, khá khó chịu! Tôi đoán nó nên được thoát bằng cách nào đó và/hoặc ít nhất nó sẽ là ok để tìm một cách để làm im lặng cảnh báo. Tuyệt vời tip anyway. – UncleZeiv

18

Nếu bạn đặt

:set hlsearch 

để làm nổi bật tất cả các lần xuất hiện của một mô hình tìm kiếm, và sau đó sử dụng * hoặc # để tìm lần xuất hiện của từ dưới con trỏ của bạn, mà sẽ giúp bạn có một số cách để những gì bạn muốn. Tuy nhiên tôi nghĩ rằng việc làm nổi bật biến cú pháp nhận thức nằm ngoài phạm vi của VIM.

+1

giải pháp của bạn là tuyệt vời! vấn đề duy nhất là khi tôi sử dụng * con trỏ nhảy qua kết quả tìm kiếm tiếp theo. Không phải là nó có thể giữ con trỏ trên từ hiện tại? – Meysam

+2

@Meysam - bạn có thể tạo một ánh xạ đơn giản thực hiện điều đó (chưa được kiểm tra): nmap * * N – lukaszkorecki

5

Tuyên bố này sẽ cho phép một biến để bật/tắt làm nổi bật tất cả các lần xuất hiện của từ dưới con trỏ:

:autocmd CursorMoved * exe exists("HlUnderCursor")?HlUnderCursor?printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\')):'match none':"" 

Một sẽ kích hoạt nổi bật với:

:let HlUnderCursor=1 

Và vô hiệu hóa nó với:

:let HlUnderCursor=0 

Người ta có thể dễ dàng xác định phím tắt để bật/tắt ng nổi bật:

:nnoremap <silent> <F3> :exe "let HlUnderCursor=exists(\"HlUnderCursor\")?HlUnderCursor*-1+1:1"<CR> 

Xóa biến sẽ ngăn chặn sự tuyên bố trận đấu từ thực hiện, và không rõ ràng nổi bật hiện nay:

:unlet HlUnderCursor 
2

Nếu bạn không muốn nhấn mạnh từ ngôn ngữ (báo cáo/preprocs như if, #define) khi con trỏ của bạn nằm trên những lời này, bạn có thể đặt chức năng này trong .vimrc của bạn dựa trên câu trả lời @too_much_php:

let g:no_highlight_group_for_current_word=["Statement", "Comment", "Type", "PreProc"] 
function s:HighlightWordUnderCursor() 
    let l:syntaxgroup = synIDattr(synIDtrans(synID(line("."), stridx(getline("."), expand('<cword>')) + 1, 1)), "name") 

    if (index(g:no_highlight_group_for_current_word, l:syntaxgroup) == -1) 
     exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\')) 
    else 
     exe 'match IncSearch /\V\<\>/' 
    endif 
endfunction 

autocmd CursorMoved * call s:HighlightWordUnderCursor() 
Các vấn đề liên quan