Réponses:
Vous pouvez ajouter des règles de syntaxe personnalisées et leur donner le @nospell
mot -
clé, cela indiquera à Vim de ne pas appliquer la vérification orthographique à cette correspondance de syntaxe. Par exemple:
:syn match UrlNoSpell "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell
Ce qui précède fonctionnera pour les fichiers texte et certains types de fichiers (comme le démarque), mais pas pour tous les types de fichiers.
Notez que j'ai utilisé une expression régulière assez simple ici; voir Comment analyser les URL du texte pour des alternatives.
Pour les autres types de fichiers, vous devez faire un peu plus de travail. Par exemple, pour les python
fichiers, les commentaires sont contenus dans un pythonComment
groupe, à partir de /usr/share/vim/vim74/syntax/python.vim
:
syn match pythonComment "#.*$" contains=pythonTodo,@Spell
Pour contourner cela, nous devons faire:
:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment
L'astuce consiste à ajouter une liste de correspondances de syntaxe précédemment mises en correspondance dans lesquelles notre correspondance de syntaxe personnalisée peut être contenue avec containedin=
Ceci indique à Vim de rechercher l'
UrlNoSpell
expression régulière dans les pythonComment
correspondances.
Nous devons également utiliser highlight
pour définir les couleurs correctes, car elles ne sont pas héritées.
Vous devez le faire à plusieurs endroits, par exemple pour les chaînes Python:
:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String
Nous avons besoin de 2 groupes de correspondance de syntaxe différents afin de pouvoir appliquer la mise en évidence de la syntaxe correcte.
Bien sûr, pour d'autres types de fichiers, vous devez utiliser d'autres containedin=
correspondances de syntaxe ... Il n'y a pas, AFAIK, de solution "universelle", mais la recherche des bonnes ne /usr/share/vim/vim74/syntax/*.vim
devrait pas être trop difficile.
Notez que toutes les commandes ci-dessus doivent être exécutées après les fichiers de syntaxe; il y a 2 façons de procéder:
À partir d'un mappage de commande ou de clé, cela doit être appelé manuellement à chaque fois. par exemple
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()
Mettez les commandes dans le ~/.vim/after/syntax/[filetype].vim
. Vim récupérera ces fichiers et les exécutera après les fichiers de syntaxe par défaut (voir:)
:help after-directory
.
La réponse par ailleurs excellente de Martin Tournoij ne se comporte pas comme prévu pour moi - probablement en raison de mon effet de levier sur le plugin phénoménal de python-mode
diraol plutôt que sur le fichier de syntaxe par défaut de Vim pour Python.
Pour éviter de mettre en surbrillance les URI dans les commentaires, les chaînes ou les docstrings Python sous python-mode
, ajoutez la ligne concise suivante à votre ~/.vim/after/syntax/python.vim
fichier spécifique à l' utilisateur:
syntax match NoSpellUriPython '\w\+:\/\/[^[:space:]]\+' transparent contained containedin=pythonComment,python.*String contains=@NoSpell
C'est ça. Il est important de noter que cela comprime ce qui aurait été douze lignes distinctes dans la réponse de Martin en une seule ligne. Comment? Élémentaire, mon cher Watson basé à Vim. Nous ajoutons:
transparent
mot-clé, demandant à Vim d'hériter des propriétés de surbrillance pour cette syntaxe enfant de sa syntaxe parent (par exemple, commentaires, chaînes). Cela nous permet d'éviter de reformuler explicitement highlight def link
pour chaque groupe de syntaxe enfant.contained
mot-clé, empêchant cette syntaxe enfant de s'étendre au-delà des limites de sa syntaxe parent (par exemple, EOL pour les commentaires, délimiteurs de chaîne pour les chaînes).containedin
mot clé. L' .*
opérateur regex nous permet de faire correspondre intelligemment tous les groupes de syntaxe de chaîne Python (c. -à- pythonString
, pythonUniString
, pythonRawString
, pythonUniRawString
, pythonDocstring
) avec un minimum de douleur et compatibilité maximale.Bien que techniquement valide, le vimscript intégré dans la réponse de Martin viole le principe DRY (Don't Repeat Yourself). Voir également cette réponse similaire pour plus de détails .
Mais attendez ... il y a plus.
Je suis suffisamment ennuyé par la vérification orthographique par défaut trop naïve de Vim et les plugins tiers (par exemple, Spelunker , qui vérifie inconditionnellement la totalité du tampon plutôt que de simplement coder les commentaires et les chaînes) que j'ai décidé ... de réellement faire quelque chose à propos de ça. </gasp>
L' extrait de test Vim bien testé ci-dessous évite intelligemment la vérification orthographique de tous les éléments suivants dans les commentaires et les chaînes Python:
CamelCase
identifiants.snake_case
identifiants.UPPERCASE
identifiants.@
-identifiants préfixés (par exemple, @muhdecorator
)."
-nom de fichier de type fichier délimité (par exemple, "muh_module.py"
).:
sous-chaînes délimitées (par exemple, le :func:
in: func: `re.sub`).re.sub
in: func:` re.sub`).Ajoutez une partie ou la totalité des éléments suivants à votre ~/.vim/after/syntax/python.vim
fichier spécifique à l' utilisateur et haletez avec plaisir alors que Vim vérifie l'orthographe de RightStuff ™ une fois:
" 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
Bien sûr, tout ce qui précède pourrait (et devrait peut-être) être réduit à une seule ligne correspondant à une expression régulière semblable à Godzilla que personne, y compris moi-même, ne pourrait jamais maintenir ou même lire. Pour la raison de tous, je ne l'ai pas fait.
Si quelqu'un qui n'est pas moi aimerait créer un plugin Vim hébergé par GitHub et étendre ce qui précède à d'autres langues populaires, ce serait génial. L'implémentation de vérification orthographique par défaut de Vim est presque là, les amis; il a juste besoin d'un coup de main de la communauté open-source.
D'ici là, que StackOverflow soit toujours avec vous!