Come posso correggere l'evidenziazione della sintassi "mancante" per le parole chiave di Python come "self"?


12

Sto cercando di correggere l'evidenziazione della sintassi per Python; i miei colori sono diversi da quelli degli screenshot di come "dovrebbero" apparire in diverse combinazioni di colori. E puoi vedere la differenza nel confrontare .rb (che viene visualizzato correttamente) con .py, che sembra spento:

inserisci qui la descrizione dell'immagine

Ad esempio, notare come selfnon è evidenziato. (Questo è in base16, ma il confronto sarebbe simile in altre combinazioni di colori). In generale, sembra che l'evidenziazione della sintassi dell'oggetto sia errata.

Alcune cose che ho provato:

  1. Guardando gli script di sintassi carichi di vim; l'unica differenza tra .py e .rb nell'esempio di seguito è che, naturalmente, ruby ​​ottiene indent / ruby.vim e sintassi / ruby.vim mentre python ottiene indent / python.vim e syntax / python.vim. Questi sono i file forniti con homebrew vim.
  2. Caricamento degli stessi file in macvim anziché in terminal (iterm2) vim; stesso problema, i file sembrano esattamente gli stessi dell'immagine.
  3. Aggiunta del nuovo file python.vim . Non risolve il problema, anche se usato come .vim/afterscript.

Eventuali suggerimenti sono benvenuti; Ci sto sbattendo la testa da ore e non riesco a capire perché l'evidenziazione non funzioni come previsto.


Nota che Python non ha simboli e ti consiglio vivamente di usare la sintassi di Python 3 per il nuovo codice.
Martin Tournoij,

Risposte:


12

Come funziona l'evidenziazione della sintassi in breve:

  • Nella syntax/<filetype>.vimsintassi le regole sono definite con il :syntaxcomando. Questo comando definisce, bene, la sintassi. Dice "se il testo corrisponde a questa espressione regolare, è una stringa" e così via. Per fare ciò, assegna un gruppo di evidenziazione . Essa non dice nulla circa i colori in quanto tali.

  • :highlightdice "evidenzia questo gruppo con questi colori". Questo viene fatto nella combinazione di colori , non nel file di sintassi. Ci sono un sacco di gruppi Evidenziare predefiniti ( String, Function, Speciale così via), che tutte le combinazioni di colori dovrebbero definire.

    Tuttavia, non sei assolutamente limitato a questi gruppi predefiniti e puoi creare tutti i gruppi che desideri (ma i file di sintassi predefiniti in genere non lo fanno).

  • Il indent/<filetype>.vimfile controlla il rientro automatico. Ad esempio per Ruby dice "la riga dopo defdovrebbe aumentare il livello di rientro" e "la riga dopo enddovrebbe diminuire il livello di rientro di un livello". Non fa nulla con l'evidenziazione dei colori o della sintassi.


Perché diversi linguaggi di programmazione vengono evidenziati in modo diverso? In parte a causa dell'estetica personale e delle opinioni di chi l'ha scritto. Ad esempio in Ruby il Typegruppo di evidenziazione viene utilizzato per i nomi delle classi. Ma potrebbe anche essere stato Functiono qualcos'altro. Perché è Type? Probabilmente perché l'autore ha pensato che avesse un aspetto migliore nella sua combinazione di colori.

Ma soprattutto, le lingue hanno semantica e sensibilità diverse. In Ruby, selfè una parola chiave speciale. Non puoi fare self = "foo"o def self(). Questi sono errori. Ma questo non è il caso di Python. È solo un'altra variabile senza proprietà speciali. fare:

x = Object()
x.foo()

è veramente "tradotto" da Python in:

Object.foo(x)

Il nome selfè solo convenzione (adottato quasi universalmente) ma puoi nominarlo come preferisci; def x(this):o def x(xxx):sono ugualmente validi. Puoi anche usare il nome selfovunque tu voglia; self = 'foo'e def self():stanno perfettamente bene.

Direi che selfnon dovrebbe essere evidenziato, in quanto non è né una parola chiave speciale, né una variabile predefinita (come str). Non c'è traccia della parola selfnel file di sintassi, quindi sembra che l'autore abbia ragionato lo stesso :-)


Se si desidera selfevidenziare, è necessario creare una regola di sintassi per esso:

:syn keyword pythonBuiltin self

Il pythonBuiltinnome del gruppo è già definito nel file di sintassi predefinito e collegato al Functiongruppo di evidenziazione. Per utilizzare un nuovo gruppo di evidenziazione, utilizzare qualcosa del tipo:

:syn keyword pythonSelf self
:highlight def link pythonSelf Special

Per apportare queste modifiche non puoi semplicemente inserirle nel tuo file vimrc. Il file di sintassi lo sovrascriverà. Invece dovrai eseguirlo dopo il caricamento del file di sintassi, cosa che puoi fare in due modi:

  1. Usa un FileTypeautocmd:

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

    syn keyword pythonSelf self
    highlight def link pythonSelf Special
    

Entrambi i metodi sono effettivamente gli stessi. Usa quello che preferisci.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.