Как я могу проверить орфографию в атрибутах HTML?

9

Функция проверки орфографии Vim в большинстве случаев прекрасно работает - она ​​даже достаточно умна, чтобы отличать код от литералов и комментариев на большинстве языков. Однако у меня есть проблемы с проверкой орфографии HTML:

  <div title="text with mistaek #1" data-text="text with mistaek #2">text with mistaek #3</div>

В приведенном выше примере divвыделена только ошибка внутри (# 3). Было бы здорово проверить все соответствующие атрибуты - по крайней мере titleи data-*, в идеале - настраиваемый список атрибутов.

Это достижимо с помощью конфигурации или VimScript? Плагин тоже подойдет, но в идеале он должен быть настраиваемым для HTMLфайлов различных типов (например, cshtmlфайлов ASP .NET MVC ).

Jarlax
источник

Ответы:

5

Элементы синтаксиса , внутри которого Вим будет выделить орфографические ошибки определены с использованием @Spellи @NoSpellкластеров. Смотрите :help spell-syntax(и остальные :help spellи :help syntaxфайлы) для получения полной информации.

Быстрое и грязное решение для получения желаемого результата - создать новый файл в вашем каталоге конфигурации Vim: .vim/after/syntax/html.vimс содержимым:

syn region htmlString contained start=+"+ end=+"+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc,@Spell
syn region htmlString contained start=+'+ end=+'+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc,@Spell

Эти строки определяют подсветку синтаксиса для атрибутов HTML и были скопированы из файла html.vim, который включен в стандартные файлы синтаксиса Vim. Затем я добавил @Spellкластер в containsполе, чтобы включить проверку орфографии в каждом элементе синтаксиса.

Чтобы применить это только к атрибутам «title» и «data- *», требуется точная настройка регулярного выражения, используемого для сопоставления элементов, и немного более обширное редактирование работы подсветки HTML. Вот решение, которое работает только для атрибутов "title":

syn region htmlStringSpell contained start=+title=["']+hs=s+6 end=+["']+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc,@Spell containedin=htmlTag,ScriptTag
hi def link htmlStringSpell String

NB

  1. Регулярное выражение теперь включает имя titleатрибута и смещение, так что эта часть элемента синтаксиса не включена в выделение. (См. :help syn-pattern-offset)
  2. Элемент синтаксиса теперь имеет свое собственное имя и поэтому должен (i) быть containedinвсеми элементами синтаксиса, в которых содержатся htmlStrings, через их соответствующие containsнастройки. (ii) применяется своя подсветка.
Богатые
источник
1
Спасибо! Обновил мой ответ, добавив в него одинарные кавычки. (Работает над полным исправлением)
Rich
3

От /usr/share/vim/vim74/syntax/html.vim:

syn region  htmlString   contained start=+"+ end=+"+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc
syn region  htmlString   contained start=+'+ end=+'+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc

Чтобы добавить поддержку правописания, нам нужно добавить @Spellключевое слово (см. :help spell-syntax) Следующим образом:

syn region  htmlString   contained start=+"+ end=+"+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc,@Spell
syn region  htmlString   contained start=+'+ end=+'+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc,@Spell

Вам нужно вставить это, ~/.vim/after/syntax/html.vimчтобы оно переопределило правила синтаксиса по умолчанию.

Дополнительный совет:
первая строка предназначена для атрибутов в строках с двойными кавычками attr="value", а вторая - для строк в одинарных кавычках ( attr='value'). Вы также можете переопределить только один из них, чтобы вы могли выбрать, есть ли у вас проверка орфографии.

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