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=foo
và sử dụng set syntax=bar
thì bạn sẽ kết thúc với một bộ đệm có tô sáng cú pháp cho cả hai foo
và bar
.
Khi Vim khởi động, nó tải vimrc
mộ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 filetype
hoặ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 Syntax
autocmd:
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 :syn
lệnh, đó là lý do tại sao tôi đã lặp lại autocmd Syntax c
nhiề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>.vim
có, <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 ).
~/.vim/after/syntax/c.vim
thay thế.