Как изменить распознавание слов в заклинании vim?


Мне нравится, что vim 7.0 поддерживает проверку орфографии через: set spell, и мне нравится, что по умолчанию он проверяет только комментарии и текстовые строки в моем C-коде. Но я хотел найти способ изменить поведение, чтобы vim знал, что когда я пишу слова, содержащие подчеркивания, я не хочу, чтобы это слово проверялось по буквам.

Проблема в том, что я часто буду ссылаться на имена переменных или функций в своих комментариях, и поэтому прямо сейчас vim думает, что каждый фрагмент текста, который не является полным правильным словом, является орфографическая ошибка. Напр..

/* The variable proj_abc_ptr is used in function do_func_stuff' */

В большинстве случаев фрагменты, разделенные подчеркиванием, являются полными словами, но в других случаях это аббревиатуры, которые я предпочел бы не добавлять в список слов. Есть ли какой-нибудь глобальный способ сказать vim, чтобы включить _ ' s в состав слова при проверке орфографии?
2 8

2 ответа:

Вам нужно будет переместить его в свою собственную группу. Что-то вроде этого:

hi link cCommentUnderscore cComment
syn match cCommentUnderscore display '\k\+_\w\+'
syn cluster cCommentGroup add=cCommentUnderscore

В некоторых маркерах вам может понадобиться contains=@NoSpell в конце строки соответствия, но в C по умолчанию используется @NoSpell, поэтому это должно быть нормально.

Вот еще несколько общих правил проверки орфографии, которые нужно поместить в файлы .vim/after/syntax/{LANG}.vim:

" Disable spell-checking of bizarre words:
"  - Mixed alpha / numeric
"  - Mixed case (starting upper) / All upper
"  - Mixed case (starting lower)
"  - Contains strange character
syn match spellingException "\<\w*\d[\d\w]*\>"      transparent contained containedin=pythonComment,python.*String contains=@NoSpell
syn match spellingException "\<\(\u\l*\)\{2,}\>"    transparent contained containedin=pythonComment,python.*String contains=@NoSpell
syn match spellingException "\<\(\l\+\u\+\)\+\l*\>" transparent contained containedin=pythonComment,python.*String contains=@NoSpell
syn match spellingException "\S*[/\\_`]\S*"         transparent contained containedin=pythonComment,python.*String contains=@NoSpell

Измените pythonComment,python.*String для вашего языка.

  • transparent означает, что соответствие наследует свои свойства подсветки от содержащего блока (т. е. эти правила не изменяют способ отображения текста).
  • contained предотвращает распространение этих совпадений за пределы содержащего блока (последнее правило заканчивается на \S*, которое, вероятно, будет совпадать с концом блока)
  • containedin имеет список существующих синтаксических групп для добавления этих новых правил.
  • contains=@NoSpell переопределяет любые и все унаследованные группы, тем самым приказывая проверяющему орфографию пропустить соответствующий текст.