Відповіді:
Ви можете додати спеціальні правила синтаксису та надати їм
@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
:).
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 і рядки:
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 буде завжди з вами!