Ответы:
Вы можете добавить собственные правила синтаксиса и дать им
@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.subin: 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 будет с вами всегда!