Làm cách nào tôi có thể thêm các quy tắc tô sáng cú pháp bổ sung trong vimrc cục bộ của mình?


10

Tôi đã cài đặt gvim trên cả Fedora và Win7. Tôi thấy rằng cả vim và gvim trên Fedora đều không làm nổi bật tên hàm trong mã c trong khi gvim trên win7 đã làm nổi bật nó.

Tôi thấy rằng trên win7, vim73/syntax/c.vimcó các dòng bổ sung ở cuối:

syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
hi cFunction gui=NONE guifg=#B5A1FF

Nếu tôi thêm các dòng này vào c.vimFedora, gvim cũng có thể làm nổi bật tên hàm.

Để duy trì tính di động, tôi muốn chỉ sửa đổi .vimrcđể làm nổi bật tên hàm. Tuy nhiên, sau khi thêm các dòng này vào .vimrc, nó không hoạt động.

Có ai có thể giúp tôi không? Tôi đã thực hiện một tìm kiếm và có nhiều giải pháp để làm nổi bật các tên hàm trong vim. Nhưng tôi chỉ tò mò về cách làm cho các dòng này hoạt động .vimrc. Cảm ơn rất nhiều!


5
Hãy thử thêm nó vào ~/.vim/after/syntax/c.vimthay thế.
muru

@muru Vâng, nó hoạt động. Nhưng làm thế nào về việc thêm nó vào .vimrc?
tamlok

Bạn có thể phải sử dụng một cái gì đó như autocmd BufEnter *.c hl ..., nhưng bạn nên giữ nó trong after/syntax/c.vim. Bất kỳ phiên bản hiện đại nào của Vim sẽ hiểu .vim/after/thư mục. Trên Windows, đường dẫn sẽ là vimfiles/after/..., do đó tính di động không phải là vấn đề lớn (đặc biệt là nếu bạn sử dụng bất kỳ plugin nào).
muru

Câu trả lời:


13

Tuy nhiên, sau khi thêm các dòng này vào .vimrc, nó không hoạt động.

Lý do cho điều này là Vim xóa các mục cú pháp hiện có khi đặt 'syntax'tùy chọn. Điều này được thực hiện bởi vì việc giữ các mục cú pháp cũ sẽ dẫn đến một số tình huống lạ; nếu bạn có một bộ đệm có syntax=foovà sử dụng set syntax=barthì bạn sẽ kết thúc với một bộ đệm có tô sáng cú pháp cho cả hai foobar.

Khi Vim khởi động, nó tải vimrcmột lần (khi khởi động), nhưng nó tải các tệp cú pháp và tệp cú pháp mỗi khi tùy chọn filetypehoặc syntaxđược đặt, sẽ đặt lại các giá trị bạn đã đặt trong vimrc.

Ngay cả khi nó sẽ không thiết lập lại nó, thì cũng không nên thêm nó vào vimrc của bạn, vì nó sẽ áp dụng cho tất cả các bộ đệm, và không chỉ bộ đệm với syntax=c.


Văn bản dưới đây giả sử Vim trên hệ thống Unix-y, nhưng nó cũng sẽ hoạt động cho cả người dùng Neovim và Windows:

  • Người dùng Neovim nên thay thế ~/.vim/bằng ~/.config/nvim/.
  • Người dùng Windows nên thay thế ~/.vim/bằng %USERPROFILE%\vimfiles\.

Ghi đè toàn bộ tệp

Cách dễ nhất để thay đổi một cái gì đó là chỉ ghi đè lên nó . Để làm như vậy tạo một tập tin trong ~/.vim/<file>.vim.

<file.vim>là đường dẫn liên quan đến $VIMRUNTIME(bao gồm cả thư mục con). Trong ví dụ của bạn, nó nên được syntax/c.vim. Nó sẽ được tải thay vì các tập tin trong $VIMRUNTIME.

Kết quả cuối cùng là việc thực hiện các thay đổi dễ dàng hơn - việc sửa đổi các tệp cú pháp thoát đôi khi có thể hơi khó khăn. Nhược điểm là bạn sẽ không nhận được bất kỳ bản cập nhật nào trong tương lai được thực hiện cho tệp toàn hệ thống.

Tôi thường sử dụng điều này như một điểm khởi đầu để thử nghiệm các tệp cú pháp và sau đó trích xuất các thay đổi cục bộ của tôi thành một bổ sung cục bộ bằng một trong các phương pháp được mô tả dưới đây.

Bổ sung địa phương

Có hai cách để thêm các bổ sung cục bộ vào các tệp cú pháp, chúng giống nhau về mặt chức năng và bạn có thể sử dụng phương pháp bạn thích.

Syntax tự động

Sử dụng Syntaxautocmd:

augroup ft_c
    autocmd!
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end

Lưu ý rằng việc xâu chuỗi một số lệnh có |vấn đề ở đây, vì chúng có xu hướng được hiểu là một phần của :synlệnh, đó là lý do tại sao tôi đã lặp lại autocmd Syntax cnhiều lần. Một thay thế sẽ là sử dụng một chức năng:

fun s:c()
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    hi cFunction gui=NONE guifg=#B5A1FF
endfun

augroup ft_c
  autocmd!
  autocmd Syntax c call s:c()
augroup end

Ưu điểm là tất cả các thay đổi có thể được chứa trong một tệp duy nhất. Nhược điểm là nó hơi xấu, đặc biệt nếu bạn có nhiều thay đổi.

sau thư mục

Sử dụng thư mục sau : ~/.vim/after/<file>.vim.

Điều này sẽ được tải sau khi <file>.vimcó, <file.vim>đường dẫn liên quan đến $VIMRUNTIME(bao gồm các thư mục con). Trong ví dụ của bạn, nó nên được syntax/c.vim.

Cũng thấy :help after-directory.

Ưu điểm là nó dễ đọc hơn một chút so với autocmd, đặc biệt nếu bạn có nhiều thay đổi. Nhược điểm là bạn sẽ cần sao chép một tệp bổ sung nếu bạn muốn phản chiếu thiết lập Vim của mình sang các máy khác nhau (đây là lý do quan trọng khiến nhiều người giữ các tệp Vim của họ trong repo GitHub, vì vậy nó có thể dễ dàng được nhân đôi trên các máy ).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.