Как я могу добавить дополнительные правила подсветки синтаксиса в моем локальном 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, это не сработало.

Итак, кто-нибудь может мне помочь? Я сделал поиск, и есть много решений, чтобы выделить имена функций в vim. Но мне просто интересно, как заставить эти строки работать .vimrc. Огромное спасибо!

tamlok
источник
5
Попробуйте добавить его ~/.vim/after/syntax/c.vimвместо.
Муру
@ Муру Да, это работает. Но как насчет его добавления .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, поэтому его можно легко отразить на разных компьютерах. ).

Мартин Турной
источник