Есть ли способ, чтобы vim не отмечал URL-адреса HTTP и адреса электронной почты как орфографические ошибки? Или, в более общем смысле, способ перечислить регулярные выражения правильных написаний?
Есть ли способ, чтобы vim не отмечал URL-адреса HTTP и адреса электронной почты как орфографические ошибки? Или, в более общем смысле, способ перечислить регулярные выражения правильных написаний?
Вы можете добавить собственные правила синтаксиса и дать им
@nospell
ключевое слово, это скажет Vim не применять проверку орфографии к этому совпадению синтаксиса. Например:
:syn match UrlNoSpell "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell
Выше будет работать для текстовых файлов и некоторых типов файлов (например, уценка), но не для всех типов файлов.
Обратите внимание, что здесь я использовал довольно простое регулярное выражение; Посмотрите, как я могу разобрать URL-адреса из текста для некоторых альтернатив.
Для других типов файлов вам нужно проделать немного больше работы. Например, для python
файлов комментарии содержатся в pythonComment
группе из /usr/share/vim/vim74/syntax/python.vim
:
syn match pythonComment "#.*$" contains=pythonTodo,@Spell
Чтобы переопределить это, нам нужно сделать:
:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment
Хитрость заключается в том, чтобы добавить список ранее согласованных синтаксических матчей , в которых наш пользовательский матч синтаксис может содержаться с containedin=
Это говорит Vim искать
UrlNoSpell
регулярное выражение в тех pythonComment
матчах.
Нам также нужно использовать highlight
для установки правильных цветов, так как они не наследуются.
Это нужно сделать в нескольких местах, например, для строк Python:
:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String
Нам нужны 2 разные группы соответствия синтаксиса, чтобы мы могли применить правильную подсветку синтаксиса.
Конечно, для других типов файлов вам нужно использовать другие containedin=
синтаксические совпадения ... AFAIK не существует "универсального" решения, но поиск правильных вариантов не /usr/share/vim/vim74/syntax/*.vim
должен быть слишком сложным.
Обратите внимание, что все вышеперечисленные команды должны выполняться после файлов синтаксиса; Есть 2 способа сделать это:
Из команды или сопоставления клавиш это должно вызываться каждый раз вручную. например
fun! NoUrlSpell()
if &filetype == 'python'
:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment
:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String
elseif &filetype == 'ruby'
" ...
else
syn match pythonComment "#.*$" contains=pythonTodo,@Spell
endif
endfun
command NoUrlSpell :call NoUrlSpell()
Вставьте команды в ~/.vim/after/syntax/[filetype].vim
. Vim подберет эти файлы и выполнит их после файлов синтаксиса по умолчанию (см .
:help after-directory
:).
Martin Tournoij «S в противном случае отличный ответ не может вести себя , как ожидается , для меня - вероятно , из - за моего левереджа diraol » s феноменальный python-mode
плагин , а не файл синтаксиса Vim по умолчанию для Python.
Чтобы не выделять URI в комментариях, строках или строках документов Python python-mode
, добавьте следующую краткую однострочную ~/.vim/after/syntax/python.vim
строку в свой пользовательский файл:
syntax match NoSpellUriPython '\w\+:\/\/[^[:space:]]\+' transparent contained containedin=pythonComment,python.*String contains=@NoSpell
Вот и все. Важно отметить, что это сжимает то, что было бы двенадцатью отдельными строками в ответе Мартина, в одну строчку. Как? Элементарно, мой дорогой Вим из Ватсона. Мы добавляем:
transparent
Ключевое слово, поручив Vim наследовать свойство выделения для этого ребенка синтаксиса из родительского синтаксиса (например, комментарии, строка). Это позволяет нам избежать явного перезапуска highlight def link
для каждой дочерней синтаксической группы.contained
Ключевое слово, предотвращая этот дочерний синтаксис от расширения мимо границ родительского синтаксиса (например, EOL для комментариев, разделители строк для строк).containedin
ключевого слова. .*
Регулярное выражение оператор позволяет нам разумно соответствовать всем синтаксическим группам строк Python (т.е. pythonString
, pythonUniString
, pythonRawString
, pythonUniRawString
, pythonDocstring
) с минимальной болью и максимальной прямой совместимостью.Хотя vimscript, встроенный в ответ Мартина, хотя и технически действителен, нарушает принцип СУХОГО (не повторяй себя). Смотрите также этот аналогичный ответ для получения дополнительной информации .
Но подождите ... это еще не все.
Я достаточно раздражен как чрезмерно наивной проверкой орфографии Vim по умолчанию, так и сторонними плагинами (например, Spelunker , который безоговорочно проверяет орфографию всего буфера, а не просто кодовые комментарии и строки), что я решил ... на самом деле сделать что-то об этом. </gasp>
Испытанный Vim фрагмент кода ниже разумно избегает проверки орфографии все следующие в комментариях Python и строки:
CamelCase
идентификаторы.snake_case
идентификаторы.UPPERCASE
идентификаторы.@
идентификаторы с префиксом (например, @muhdecorator
)."
-лимит файловых файлов (например, "muh_module.py"
).:
-ограниченные подстроки (например, :func:
in: func: `re.sub`).re.sub
in: func:` re.sub`).Добавьте некоторые или все из следующего к вашему пользовательскому ~/.vim/after/syntax/python.vim
файлу и задохнитесь от восторга, когда Vim фактически проверяет RightStuff ™ на этот раз:
" Avoid spell checking URIs.
syntax match NoSpellPythonUri /\v\w+:\/\/[^[:space:]]+/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking both CamelCase-formatted identifiers and uppercase
" identifiers. Since most languages (excluding Raku) prohibit Unicode in
" identifiers, these matches are intentionally confined to ASCII codepoints
" (e.g., "[A-Z]" rather than "[[:upper:]]").
syntax match NoSpellPythonCaps /\v<[A-Z]([A-Z0-9]{-1,}|[a-z0-9]+[A-Z0-9].{-})>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking snake_case-formatted identifiers.
syntax match NoSpellPythonSnake /\v<\w+_.{-1,}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking "@"-prefixed identifiers.
syntax match NoSpellPythonDecorator /\v\@[a-zA-Z].{-}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking ":"-delimited substrings.
syntax match NoSpellPythonColons /\v:[^:]+:/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking "`"-delimited substrings.
syntax match NoSpellPythonTicks /\v`[^`]+`/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
" Avoid spell checking '"'-delimited filetyped filenames matched as a
" double-quoted substring containing a filename prefix, a period, and one to
" four characters comprising a filetype.
syntax match NoSpellPythonPath /\v"[^"]+.[^"]{1,4}"/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell
Конечно, все вышеперечисленное можно (и, возможно, следует) свести к одной строчке, соответствующей одному регулярному выражению, похожему на Годзиллу, которое никто, включая меня, никогда не сможет поддерживать или даже читать. Для здравомыслия каждого я этого не делал.
Если кто-то, кто не я, хотел бы создать плагин Vim для GitHub, расширяющий вышеперечисленное на другие популярные языки, это было бы просто замечательно. Осуществление проверки орфографии по умолчанию Vim является почти там, люди; это просто нуждается в руке помощи от сообщества открытого источника.
До тех пор, пусть StackOverflow будет с вами всегда!