2009-07-31 22 views
12

Trong VIM, tôi cần thực hiện một nhiệm vụ đơn giản - làm nổi bật "(" và ")". Tôi có thể làm điều này một cách dễ dàng bằng cách phát hành hai lệnh:Làm cách nào để ghi đè cú pháp mặc định trong vim?

:syn match really_unique_name display "[()]" 
:hi really_unique_name guifg=#FF0000 

Nhưng nếu tôi thêm cùng một lệnh (không có ':' tất nhiên) để trống vimrc và khởi động lại VIM - "(" và ")" không được nhấn mạnh nữa trong tệp .cpp. Có vẻ như nếu tôi tạo/tải tập tin .cpp, VIM tải tập tin cú pháp cho nó để ghi đè các điểm nổi bật tùy chỉnh của tôi. Làm thế nào tôi có thể cấu hình nổi bật trong tập tin .vimrc của tôi để nó sẽ diễn ra sau khi định nghĩa cú pháp chuẩn hoặc sẽ không bị ảnh hưởng bởi định nghĩa cú pháp chuẩn?

Trả lời

24

Có bốn lựa chọn (hai trong số đó đã được đề xuất bởi những người khác):

  1. Sử dụng cấu trúc after trong vimfiles (~/.vim/sau/cú pháp/cpp.vim):

    :help after-directory 
    
  2. Sử dụng phù hợp cho cửa sổ hiện hành:

    :match really_unique_name "[()]" 
    
  3. Sử dụng matchadd(), một lần nữa cho cửa sổ hiện hành, nhưng điều này cho phép bạn xóa các trận đấu cá nhân nếu sau đó bạn cần phải:

    :call matchadd('really_unique_name', "[()]") 
    " Or 
    :let MyMatchID = matchadd('really_unique_name', "[()]") 
    " and then if you want to switch it off 
    :call matchdelete(MyMatchID) 
    
  4. Install rainbow.vim Plugin Dr Chip để có được cú đúp nổi bật trong khác nhau màu sắc tùy thuộc vào mức thụt lề.

Trong trường hợp này, tôi khuyên bạn nên chọn tùy chọn 1 vì có vẻ như bạn muốn làm cho nó trở thành một phần của cú pháp chung. Nếu bạn muốn sử dụng trận đấu và bạn muốn họ được đệm cụ thể (chứ không phải cửa sổ cụ thể), bạn sẽ cần một cái gì đó như:

function! CreateBracketMatcher() 
    call clearmatches() 
    call matchadd('really_unique_name', "[()]") 
endfunc 
au BufEnter <buffer> call CreateBracketMatcher() 

Để biết thêm thông tin, xem:

:help after-directory 
:help :match 
:help matchadd() 
:help matchdelete() 
:help clearmatches() 
:help function! 
:help autocmd 
:help autocmd-buffer-local 
:help BufEnter 

Bạn có thể cũng được quan tâm trong câu trả lời của tôi cho this question, bao gồm đánh dấu tổng thể của nhà khai thác tổng quát hơn.

+0

Cảm ơn bạn đã "au BufEnter", hoạt động hoàn hảo trên cả Windows và Macos box (hi không làm việc trên hộp macos - nó được xóa bằng cách nào đó sau khi .vimrc được xử lý). – grigoryvp

+0

Tự động tạo bộ đệm cục bộ chỉ được tạo sau khi bộ đệm đã được mở. Không có gợi ý nào mà tôi liệt kê nên có trong .vimrc: hoặc sử dụng vimfiles/after/syntax/cpp.vim hoặc một trong các tùy chọn tương tự. Ngoài ra, bạn có thể fudge nó với "au BufEnter, BufNew, BufReadPost * .cpp gọi CreateBracketMatcher()", nhưng nó là một chút của một fudge. – DrAl

+0

@DrAl Tôi vừa viết một đoạn mã http://vimrcfu.com dựa trên câu trả lời của bạn: http://vimrcfu.com/snippet/197 Cảm ơn! –

4

Thay vì sử dụng đối sánh đồng bộ, chỉ cần sử dụng kết hợp. ví dụ:

hi really_unique_name guifg=#FF0000 
match really_unique_name "[()]" 

match có độ ưu tiên cao hơn syn-match (ví dụ: làm nổi bật của nó sẽ ghi đè lên làm nổi bật được tạo ra bởi syn-match), và (well-behaved) các tập tin cú pháp không nên gây rối với nó.

Thông báo trước với kết quả phù hợp là mỗi cửa sổ, thay vì mỗi bộ đệm.

Nếu bạn cần thêm các kết quả phù hợp, bạn có thể sử dụng 2match và 3match.

Xem :help :match trong Vim để biết thêm thông tin.

+0

Cảm ơn. Nó hoạt động ok trên hộp cửa sổ của tôi. Nhưng trên MacOS BOX "hi really_unique_name guifg = # FF0000" không hoạt động. Ngay cả khi đó là một dòng duy nhất trong một .vimrc, sau khi bắt đầu vim và làm "hi really_unique_name" tôi thấy "really_unique_name xxx xóa". Tại sao nó "xóa"? – grigoryvp

9

Đặt các thiết lập trong ~/.vim/sau/cú pháp/cpp.vim

+0

Hmmm, có vẻ như là một giải pháp tốt. Nhưng không làm việc cho tôi ... http://stackoverflow.com/questions/2464593/custumizing-syntax-highlighting-in-vim – sixtyfootersdude

2

Tôi thường làm điều đó như thế này:

:hi really_unique_name guifg=#FF0000 
:au BufNewFile,BufRead * :syn match really_unique_name display "[()]" 

au là viết tắt của autocmd. Trợ giúp sẽ nói nhiều hơn.

+0

xin lỗi, trong hai dòng ... đối với một số lời reasone, nó đã xóa mục nhập của tôi ... – Peter

Các vấn đề liên quan