Ігноруйте URL-адреси та адреси електронної пошти у файлі заклинань


12

Чи може спосіб vim не позначити HTTP-адреси та адреси електронної пошти як орфографічні помилки? Або, загалом, спосіб перерахувати регулярні вирази дійсних написань?

Відповіді:


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не повинно бути надто складно.


Зауважте, що всі вищезазначені команди повинні бути виконані після файлів синтаксису; Є два способи зробити це:

  • У зіставленні команд або ключів це потрібно викликати вручну кожного разу. напр

    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, вкладений у відповідь Мартіна, порушує принцип DRY (не повторюй себе). Дивіться також цю подібну відповідь для отримання детальної інформації .

Але зачекайте ... є ще.

Бездоганний - за покращення для великої слави

Мене досить дратують як надмірно наївні перевірки орфографії за замовчуванням, так і сторонні плагіни (наприклад, Spelunker , який беззастережно заклинання перевіряє весь буфер, а не просто кодує коментарі та рядки), що я вирішив ... насправді щось зробити про те, що. </gasp>

Випробуваний Vim фрагмент коду нижче розумно уникає перевірки орфографії все наступні в коментарях Python і рядки:

  • URI (як вище).
  • CamelCase ідентифікатори.
  • snake_case ідентифікатори.
  • UPPERCASE ідентифікатори.
  • @-попередньо встановлені ідентифікатори (наприклад, @muhdecorator).
  • "-делімітовані файлові типи файлів (наприклад, "muh_module.py").
  • :-делімітовані підрядки (наприклад, :func:in: func: `re.sub`).
  • `-розмежовані підрядки (наприклад, re.subв: 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, розширивши вищевказане на інші популярні мови, це було б просто чудово. Реалізація правопису перевірки орфографії за замовчуванням майже є, люди; йому просто потрібна допомога від спільноти з відкритим кодом.

До цього часу, нехай StackOverflow буде завжди з вами!


2
Я якось розібрався з цією річчю, що виділяє синтаксис Vim, під час написання відповідей тут. Я не завжди знав, що роблю, щоб бути чесним, тому особливо деякі старі відповіді можуть бути менш оптимальними 😅
Мартін Турной

Ти занадто скромний, Мартіне. Без вашої відповіді "зламати лід" я та багато інших навіть не знали б з чого почати. Дякуємо, що розпочали роботу з цією редакторською партією! Рим, можливо, не був побудований за день, але, принаймні, ми можемо перевірити його в одному.
Сесіль Карі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.