Ignorer les URL et les adresses e-mail dans le fichier orthographique

12

Existe-t-il un moyen pour que vim ne marque pas les URL HTTP et les adresses e-mail comme des fautes d'orthographe? Ou, plus généralement, un moyen de répertorier les expressions rationnelles d'orthographes valides?

noffle
la source

Réponses:

16

Vous pouvez ajouter des règles de syntaxe personnalisées et leur donner le @nospellmot - 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 pythonfichiers, 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' UrlNoSpellexpression régulière dans les pythonCommentcorrespondances.

Nous devons également utiliser highlightpour 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/*.vimdevrait 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.

Martin Tournoij
la source
3

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-modediraol 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.vimfichier 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:

  • Le transparentmot-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 linkpour chaque groupe de syntaxe enfant.
  • Le containedmot-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).
  • Tous les groupes de syntaxe parent délimités par des virgules au containedinmot 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.

Améliorations non demandées pour Great Glory

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:

  • URI (comme ci-dessus).
  • 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`).
  • `sous-chaînes délimitées (par exemple, le re.subin: func:` re.sub`).

Ajoutez une partie ou la totalité des éléments suivants à votre ~/.vim/after/syntax/python.vimfichier 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!

Cecil Curry
la source
2
J'ai un peu compris toute cette chose mettant en évidence la syntaxe Vim lors de l'écriture des réponses ici. Pour être honnête, je ne savais pas toujours ce que je faisais, donc certaines des réponses plus anciennes peuvent être moins qu'optimales optimal
Martin Tournoij
Tu es trop modeste, Martin. Sans votre réponse "briser la glace", moi et beaucoup d'autres n'aurions même pas su par où commencer. Merci d'avoir démarré cette soirée éditeur! Rome n'a peut-être pas été construite en un jour, mais au moins nous pouvons vérifier l'orthographe en un seul maintenant.
Cecil Curry