Игнорировать URL-адреса и адреса электронной почты в файле заклинания

12

Есть ли способ, чтобы vim не отмечал URL-адреса HTTP и адреса электронной почты как орфографические ошибки? Или, в более общем смысле, способ перечислить регулярные выражения правильных написаний?

noffle
источник

Ответы:

16

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

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

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 и строки:

  • URI (как указано выше).
  • 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 будет с вами всегда!

Сесил Карри
источник
2
Я как-то разобрался во всей этой подсветке синтаксиса Vim при написании ответов здесь. Я не всегда знал, что я делал, чтобы быть честным, поэтому особенно некоторые из старых ответов могут быть неоптимальными 😅
Мартин Турной
Ты слишком скромен, Мартин. Без твоего ответа «разбить лед» я и многие другие даже не знали бы, с чего начать. Спасибо за начало этой вечеринки в редакции! Рим, возможно, не был построен за один день, но по крайней мере мы можем проверить его по буквам сейчас.
Сесил Карри