Comment puis-je corriger la coloration syntaxique «manquante» pour les mots clés Python tels que «self»?

12

J'essaie de corriger la coloration syntaxique pour python; mes couleurs sont différentes de celles des captures d'écran de ce à quoi cela "devrait" ressembler dans différents schémas de couleurs vim. Et vous pouvez voir la différence en comparant .rb (qui s'affiche correctement) à .py, qui semble être désactivé:

entrez la description de l'image ici

Par exemple, remarquez comment selfn'est pas mis en surbrillance. (C'est en base16, mais la comparaison serait similaire dans d'autres schémas de couleurs). Généralement, il semble que la mise en évidence de la syntaxe de l'objet soit incorrecte.

Certaines choses que j'ai essayées:

  1. En regardant les scripts de syntaxe, les charges vim; la seule différence entre .py et .rb dans l'exemple ci-dessous est que, bien sûr, ruby ​​obtient indent / ruby.vim et syntaxe / ruby.vim tandis que python obtient indent / python.vim et syntax / python.vim. Ce sont les fichiers fournis avec homebrew vim.
  2. Charger les mêmes fichiers dans macvim plutôt que sur terminal (iterm2) vim; même problème, les fichiers sont exactement les mêmes que dans l'image.
  3. Ajout du nouveau fichier python.vim . Ne résout pas le problème, même s'il est utilisé comme .vim/afterscript.

Toutes les suggestions sont les bienvenues; Je me suis cogné la tête pendant des heures et je n'arrive pas à comprendre pourquoi la mise en évidence ne fonctionne pas comme prévu.

sl8r000
la source
Notez que Python n'a pas de symboles, et je vous recommande fortement d'utiliser la syntaxe Python 3 pour le nouveau code.
Martin Tournoij

Réponses:

12

Comment fonctionne la coloration syntaxique en bref:

  • Dans syntax/<filetype>.vimla syntaxe, les règles sont définies avec la :syntaxcommande. Cette commande définit, eh bien, la syntaxe. Il dit "si le texte correspond à cette expression régulière, c'est une chaîne", etc. Pour ce faire, il attribue un groupe de surbrillance . Il ne pas dire quoi que ce soit sur les couleurs en tant que telles.

  • :highlightdit "surlignez ce groupe avec ces couleurs". Cela se fait dans le jeu de couleurs , pas dans le fichier de syntaxe. Il y a un tas de groupes de surbrillance par défaut ( String, Function, Special, et ainsi de suite) que tous les schémas de couleurs devraient définir.

    Vous n'êtes cependant pas limité à ces groupes par défaut, et vous pouvez créer autant de groupes que vous le souhaitez (mais les fichiers de syntaxe par défaut ne le font généralement pas).

  • Le indent/<filetype>.vimfichier contrôle l'indentation automatique. Par exemple, pour Ruby, il est indiqué que "la ligne après defdevrait augmenter le niveau d'indentation" et "la ligne après enddevrait diminuer l'indentation d'un niveau". Il ne fait rien avec les couleurs ou la coloration syntaxique.


Pourquoi différents langages de programmation sont-ils mis en évidence différemment? En partie à cause de l'esthétique personnelle et des opinions de celui qui l'a écrit. Par exemple, dans Ruby, le Typegroupe de surbrillance est utilisé pour les noms de classe. Mais ça aurait pu l'être aussi Functionou autre chose. Pourquoi Type? Probablement parce que l'auteur pensait que cela semblait mieux dans sa palette de couleurs.

Mais plus important encore, les langues ont des sémantiques et des sensibilités différentes. En Ruby, selfest un mot-clé spécial. Vous ne pouvez pas faire self = "foo"ou def self(). Ce sont des erreurs. Mais ce n'est pas le cas en Python. C'est juste une autre variable sans propriétés spéciales. Faire:

x = Object()
x.foo()

est vraiment "traduit" par Python en:

Object.foo(x)

Le nom selfest juste une convention (presque universellement adopté) mais vous pouvez le nommer comme bon vous semble; def x(this):ou def x(xxx):sont également valables. Vous pouvez également utiliser le nom selfoù vous le souhaitez; self = 'foo'et def self():sont parfaitement bien.

Je dirais que cela selfne devrait pas être mis en évidence, car ce n'est ni un mot-clé spécial, ni une variable prédéfinie (comme str). Il n'y a aucune trace du mot selfdans le fichier de syntaxe, il semble donc que son auteur ait raisonné de la même manière :-)


Si vous voulez selfmettre en évidence, vous devrez créer une règle de syntaxe pour cela:

:syn keyword pythonBuiltin self

Le pythonBuiltinnom du groupe est déjà défini dans le fichier de syntaxe par défaut et lié au Functiongroupe de surbrillance. Pour utiliser un nouveau groupe de surbrillance, utilisez quelque chose comme:

:syn keyword pythonSelf self
:highlight def link pythonSelf Special

Pour effectuer ces modifications, vous ne pouvez pas simplement les coller dans votre fichier vimrc. Le fichier de syntaxe le remplacera. Au lieu de cela, vous devrez l'exécuter après le chargement du fichier de syntaxe, ce que vous pouvez faire de deux manières:

  1. Utilisez un FileTypeautocmd:

    augroup python
        autocmd!
        autocmd FileType python
                    \   syn keyword pythonSelf self
                    \ | highlight def link pythonSelf Special
    augroup end
    
  2. Utilisez le after-directory, ~/.vim/after/syntax/python.vim:

    syn keyword pythonSelf self
    highlight def link pythonSelf Special
    

Les deux méthodes sont effectivement les mêmes. Utilisez celui que vous préférez.

Martin Tournoij
la source