Однак після додавання цих рядків у .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
Використовуйте 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
Зауважте, що поєднання декількох команд |тут є проблематичним, оскільки вони, як правило, інтерпретуються як частина :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>.vimhas, де <file.vim>є шлях відносно $VIMRUNTIME(включаючи підкаталоги). У вашому прикладі так і має бути syntax/c.vim.
Також див :help after-directory.
Перевага полягає в тому, що він трохи легше читається, ніж autocmd, особливо якщо у вас багато змін. Недоліком є те, що вам потрібно буде скопіювати додатковий файл, якщо ви хочете відобразити інсталяцію Vim на різних машинах (це важлива причина, коли багато людей зберігають свої файли Vim у репортажі GitHub, тому його можна легко відобразити на всіх машинах ).
~/.vim/after/syntax/c.vimзамість цього.