Як я можу додати додаткові правила виділення синтаксису у свій локальний vimrc?


11

Я встановив gvim і на Fedora, і на Win7. Я виявив, що і vim, і gvim у Fedora не виділяли ім'я функції в коді c, тоді як gvim на win7 це виділяло.

Я виявив, що на win7, vim73/syntax/c.vimв кінці є додаткові рядки:

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

Якщо я додаю ці рядки у c.vimFedora, gvim також може виділити ім'я функції.

Щоб зберегти портативність, я хочу просто змінити, .vimrcщоб виділити ім'я функції. Однак після додавання цих рядків у програму .vimrcвона не спрацювала.

Отже, чи може мені хтось допомогти? Я здійснив пошук, і існує багато рішень, щоб виділити назви функцій in vim. Але мені просто цікаво, як змусити ці рядки працювати .vimrc. Дуже дякую!


5
Спробуйте додати його ~/.vim/after/syntax/c.vimзамість цього.
муру

@muru Так, це працює. Але як щодо його додавання .vimrc?
тамлок

Вам, мабуть, доведеться використовувати щось на кшталт autocmd BufEnter *.c hl ..., але вам слід тримати це after/syntax/c.vim. Будь-яка сучасна версія Vim зрозуміє .vim/after/каталог. Для Windows шлях був би vimfiles/after/...таким, що портативність не повинна бути великою проблемою (особливо якщо ви використовуєте будь-які плагіни).
муру

Відповіді:


14

Однак після додавання цих рядків у .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, тому його можна легко відобразити на всіх машинах ).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.