Pattern di sintassi di Vim per evidenziare l'argomento della parola chiave python


17

Sto lottando con l'apprendimento di vim regexps (non conosco molto bene neanche un'altra regexp), quindi il problema principale è definire regexp che corrisponderebbe

some_function_call(simple_value, keyword=value)

parola chiave in questo esempio.

Quindi dovrebbe corrispondere a una parola se è all'interno di parentesi e ha un segno uguale dopo di essa.

Il prossimo problema è come definire i file di sintassi in vim. Gradirei aiuto con questo, ma non dovrebbe essere così difficile da imparare, quindi posso farlo da solo, probabilmente.

EDIT basato sulla risposta Ho creato il mio script di sintassi per Python. Sentiti libero di provarlo. inserisci qui la descrizione del link


Esiste un problema aperto su Github per l'evidenziazione delle parole chiave da includere nel file di sintassi Python più aggiornato che conosco: github.com/hdima/python-syntax/issues/44 Potresti voler controllare più tardi. Se scopri come farlo, per favore fai sapere alle persone lì (o inviami un messaggio in modo che io possa creare una richiesta pull) affinché questa funzione sia disponibile per tutti.
cbaumhardt,

1
Sì, sono io quello che l'ha aperto.
user1685095

Risposte:


12

Con queste impostazioni:

syn region FCall start='[[:alpha:]_]\i*\s*(' end=')' contains=FCall,FCallKeyword
syn match FCallKeyword /\i*\ze\s*=[^=]/ contained
hi FCallKeyword ctermfg=yellow

Ottengo:

inserisci qui la descrizione dell'immagine

Qui:

  1. Definisco una regione di sintassi all'interno della quale è possibile trovare argomenti di parole chiave, che sarebbe la chiamata di funzione. L' containsopzione mi consente di annidare le chiamate di funzione.
  2. All'interno di quella regione, ho abbinato qualsiasi stringa composta da caratteri identificativi validi ( \i*) seguita da =, ma non ==, in modo che i test di uguaglianza non vengano abbinati.

Usando le regioni, riesco a nidificare le partite di cui ho bisogno, il che sarebbe molto complicato (impossibile?) Se avessi scelto solo un matchcon espressioni regolari.

Credo che le espressioni regolari utilizzate per abbinare la chiamata di funzione e la parola chiave possano essere perfezionate, ma considerando ciò che è valido in Python 3 , non è un compito che sono disposto a svolgere.

Opzionalmente, penso che puoi usarlo per evidenziare le chiamate di funzione, usando un matchgroup:

syn region FCall matchgroup=FName start='[[:alpha:]_]\i*\s*(' end=')' contains=FCall,FCallKeyword
syn match FCallKeyword /\i*\ze\s*=[^=]/ contained
hi FCallKeyword ctermfg=yellow
hi FName ctermfg=blue

inserisci qui la descrizione dell'immagine


Probabilmente dovrei creare un'altra domanda, ma hai idee su come evidenziare solo le funzioni integrate?
user1685095

@ user1685095 Le funzioni predefinite sono elencate nel pythonBuiltingruppo di sintassi per impostazione predefinita syntax/python.vim. Tuttavia, non distingue tra le funzioni e le variabili incorporate ( True, Falsee Nonesono anche in pythonBuiltin). Probabilmente potresti copiare le definizioni per il tuo uso.
Muru,

Bene, ho usato una sintassi più raffinata di vim default come hdima / python e vim-polyglot. Tutti definiscono le funzioni integrate come una parola chiave che ha conseguenze importanti. Non solo le funzioni integrate sono evidenziate, ma solo le variabili con gli stessi nomi e le funzioni in altri moduli con lo stesso nome sono evidenziate. Come il query(...).***filter***()filtro è evidenziato mentre non ha nulla a che fare con le funzioni di filtro integrate.
user1685095

@ user1685095 il valore predefinito syntax.vimli rende parole chiave. Vedi github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184
muru

1
@ user1685095 Odd. Non ho syntax/python.vimfile aggiuntivi (solo quelli predefiniti e non vedo il comportamento che fai: i.stack.imgur.com/LgF6F.png e sono d'accordo con la definizione della parola chiave: è la soluzione più vicina, e io non credo che le parole chiave sono abbinati in casi come nonkeyword.keyword. come per le variabili, si noti che questi comandi incorporati sono variabili, sono variabili contenenti oggetti funzione, e possono essere assegnati a come qualsiasi altra variabile. nulla vieta di fare sorted = filtere quindi utilizzando sortedcome filter.
Muru

8

Ecco da dove puoi iniziare:

/([^,]\+,\s\(\w\+\)=.*)

decomposizione:

/(       start matching a (
[^,]\+   match multiple characters that are not ,
,\s      match a , and a space
\(       start a matching group
\w\+     match word characters
\)       end the matching group
=.*)      match an = and anything until the closing )

Ciò richiede miglioramenti, ma offre una panoramica di come è possibile farlo.


6

Oltre alla risposta di @ Nobe4, è possibile effettuare le seguenti operazioni:

  • Crea il file ~/.vim/after/syntax/python.vim
  • Inserisci la linea di tesi nel file:

    syntax match PythonArg /(.*\,\s*\zs\w\+\ze\s*=.*)/
    hi PythonArg guibg=blue
    
  • Adatta il secondo con i tuoi valori preferiti.

Questo creerà un file di sintassi che aggiungerà una corrispondenza di sintassi per i tuoi argomenti seguita da a =e imposterà lo stile da usare. Questo argomento :h mysyntaxfile-adddovrebbe essere interessante per te.

Inoltre ho usato una regex diversa dall'altra risposta, ecco il dettaglio (non so quale funzioni meglio quindi probabilmente dovresti provare):

(      Begin the pattern with a bracket
.*,    Look for any number of any character before a ,
\s*    Zero or more white spaces after the ,
\zs    Start the matching group (what will be highlighted)
\w\+   Match one or more word characters
\ze    End the matching group
\s*    Zero or more white spaces between your argument and the = sign
=      A literal = sign after your argument
.*)    Any number of any characters between your = sign and the closing bracket

Grazie per il tuo aiuto. Non sapevo di poter aggiungere la mia sintassi personalizzata senza modificare le regole esistenti. Il tuo modello non corrisponde all'argomento della parola chiave se è un primo argomento in funzione. Proverò a risolverlo da solo (sto imparando regexps adesso per farlo). Non appena imparerò a farlo, posterò un commento.
user1685095

Sto provando questo regexp tramite vim search e penso che corrisponda a una sola parola chiave nella chiamata di funzione. Ho bisogno che corrisponda a tutti loro '
user1685095

@ user1685095: Sì, hai ragione, il mio modello non è buono. Proverò a migliorarlo e a modificare la mia risposta.
statox

3

Ho scoperto che la risposta di @ Wolfie cattura lo scartamento di una tupla come parola chiave e ha anche avuto problemi con l'acquisizione di argomenti di parole chiave interrotte.

Ispirato dalla sua regex, ho pensato a quanto segue per inserire il mio python.vimfile di sintassi. (Ricorda che in origine sto usando il python.vimfile di sintassi di sheerun / vim-polyglot )

syn match pythonFunctionKeyword "\v\s{-}\zs\w+\ze\=(\=)@!(\_s)@!" display
syn cluster pythonExpression add=pythonFunctionKeyword
syn region pythonFunctionKwargs start=+(+ end=+)+ contains=@pythonExpression

E la scomposizione regex è molto simile alla risposta di @ Wolfie :

\v      set to very magic mode
\s{-}   capture whitespace, nongreedy
\zs     start of the match (what to actually highlight)
\w+     one or more alphanumeric character, underscore included
\ze     stop matching; anything after this is delimiting only
\=      one single equal sign
(\=)@!  ...not followed by another equal sign
(\_s)@! ...not followed by any whitespace or newline character

Si noti che questo non sarà il colore un argomento parola chiave scritto come: key = value. Che considero una buona cosa, poiché ciò va contro la raccomandazione ufficiale dello spazio bianco PEP-8 per gli argomenti delle parole chiave .


2

La risposta accettata per iscritto ha interrotto l'evidenziazione delle stringhe all'interno degli elenchi di argomenti delle funzioni per me (con quale alchimia non conosco), quindi ecco una versione speranzosamente più sicura, basata su quella di Statox .

syntax match PythonArg "\v[\(\,]\s{-}\zs\w+\ze\s{-}\=(\=)@!"
hi PythonArg ctermfg = 214 guifg = #ffaf00

ctermfgè per terminale console, guifgè per gui. Ovviamente sei libero di cambiare i colori in qualsiasi cosa tu trovi di fantasia. Ecco un utile elenco .

Come sempre, fai del tuo meglio per metterlo dentro ~/.vim/after/syntax/python.vim

Per una ripartizione regex, ecco qui:

\v      set to very magic mode
[\(\,]  capture either a ( or a ,
\s{-}   capture whitespace, nongreedy
\zs     start of the match (what to actually highlight)
\w+     one or more alphanumeric character, underscore included
\ze     stop matching; anything after this is delimiting only
\s{-}   once again, capture whitespace.
\=      one single equal sign
(\=)@!  ...not followed by another equal sign

Il controllo finale interrompe l'evidenziazione dai condizionali coloranti. Puoi rimuoverlo se lo desideri.


Scusa, sei in ritardo. Ho pulito il file di sintassi per me stesso.
user1685095,

Va bene; se qualcun altro incontra lo stesso problema che ho fatto, possono dare un'occhiata qui, si spera.
Wolfie,
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.