Однако после добавления этих строк в .vimrc это не сработало.
Причина этого заключается в том, что Vim очищает существующие элементы синтаксиса при установке 'syntax'
параметра. Это сделано потому, что сохранение старых элементов синтаксиса может привести к некоторым странным ситуациям; если у вас есть буфер, который имеет syntax=foo
и использует, set syntax=bar
то в итоге вы получите буфер с подсветкой синтаксиса для обоих foo
и bar
.
Когда Vim запускается, он загружает ваш vimrc
один раз (при запуске), но загружает файлы типов файлов и синтаксиса каждый раз, когда задаются параметры filetype
или syntax
, что сбрасывает значения, которые вы установили в вашем vimrc.
Даже если он не сбросит его, было бы неплохо просто добавить его в vimrc, поскольку он будет применяться ко всем буферам, а не только к буферам с syntax=c
.
В приведенном ниже тексте предполагается использование Vim в системе Unix-y, но он будет работать и для пользователей Neovim и Windows:
- Пользователи Neovim должны заменить
~/.vim/
на ~/.config/nvim/
.
- Пользователи Windows должны заменить
~/.vim/
на %USERPROFILE%\vimfiles\
.
Переопределение всего файла
Самый простой способ изменить что-либо - просто переопределить это . Для этого создайте файл в ~/.vim/<file>.vim
.
<file.vim>
путь относительно $VIMRUNTIME
(включая подкаталоги). В вашем примере так и должно быть syntax/c.vim
. Он будет загружен вместо файла в $VIMRUNTIME
.
Результатом этого является то, что легче вносить изменения - внесение изменений в файлы синтаксиса может быть немного сложнее. Недостатком является то, что в будущем вы не получите никаких обновлений для общесистемного файла.
Я часто использую это в качестве отправной точки для экспериментов с файлами синтаксиса, а затем извлекаю свои локальные изменения в локальное дополнение, используя один из методов, описанных ниже.
Местные дополнения
Существует два способа добавления локальных дополнений в файлы синтаксиса, они функционально идентичны, и вы можете использовать метод, который вы предпочитаете.
Syntax
autocmd
Используйте 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
Обратите внимание, что связывание нескольких команд с этим |
здесь проблематично, поскольку они, как правило, интерпретируются как часть :syn
команды, поэтому я повторил это autocmd Syntax c
несколько раз. Альтернативой может быть использование функции:
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
Преимущество состоит в том, что все изменения могут содержаться в одном файле. Недостаток в том, что это немного некрасиво, особенно если у вас много изменений.
после каталога
Используйте после-каталога: ~/.vim/after/<file>.vim
.
Это будет загружено после <file>.vim
has, где <file.vim>
путь относительно $VIMRUNTIME
(включая подкаталоги). В вашем примере так и должно быть syntax/c.vim
.
Также см :help after-directory
.
Преимущество в том, что он немного более читабелен, чем autocmd, особенно если у вас много изменений. Недостатком является то, что вам нужно будет скопировать дополнительный файл, если вы хотите отразить настройки Vim на разных компьютерах (это важная причина, по которой многие люди хранят свои файлы Vim в репозитории GitHub, поэтому его можно легко отразить на разных компьютерах. ).
~/.vim/after/syntax/c.vim
вместо.