Vim-Syntaxmuster zum Hervorheben des Python-Schlüsselwortarguments

17

Ich kämpfe mit dem Erlernen von regulären Ausdrücken (ich kenne auch keine anderen regulären Ausdrücke sehr gut), daher besteht das Hauptproblem darin, reguläre Ausdrücke zu definieren, die übereinstimmen würden

some_function_call(simple_value, keyword=value)

Schlüsselwort in diesem Beispiel.

Es sollte also mit einem Wort übereinstimmen, wenn es sich innerhalb von Parens befindet und ein Gleichheitszeichen dahinter steht.

Das nächste Problem ist das Definieren von Syntaxdateien in vim. Ich würde mich über Hilfe freuen, aber es sollte nicht so schwer zu lernen sein, also kann ich das wahrscheinlich alleine machen.

BEARBEITEN basierend auf der Antwort Ich habe mein eigenes Syntax-Skript für Python erstellt. Fühlen Sie sich frei, es zu versuchen. Geben Sie hier die Linkbeschreibung ein

user1685095
quelle
Es gibt ein offenes Problem bei Github, bei dem die Keyword-Hervorhebung in die aktuellste mir bekannte Python- Syntaxdatei aufgenommen werden soll : github.com/hdima/python-syntax/issues/44 Möglicherweise möchten Sie es später überprüfen. Wenn Sie herausfinden, wie es geht, teilen Sie dies den Mitarbeitern mit (oder senden Sie mir eine Nachricht, damit ich eine Pull-Anfrage erstellen kann), damit diese Funktion für alle verfügbar ist.
cbaumhardt
1
Ja, ich bin derjenige, der es geöffnet hat.
user1685095

Antworten:

12

Mit diesen Einstellungen:

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

Ich bekomme:

Bildbeschreibung hier eingeben

Hier:

  1. Ich definiere einen Syntaxbereich, innerhalb dessen Schlüsselwortargumente gefunden werden können, was der Funktionsaufruf wäre. Mit dieser containsOption kann ich Funktionsaufrufe verschachteln.
  2. Innerhalb dieser Region stimme ich mit einer Zeichenfolge überein, die aus gültigen Bezeichnerzeichen ( \i*) besteht, gefolgt von =, jedoch nicht ==, damit die Gleichheitsprüfungen nicht übereinstimmen.

Durch die Verwendung von Regionen kann ich die Übereinstimmungen so oft verschachteln, wie ich es brauche. Das wäre sehr kompliziert (unmöglich?), Wenn ich nur matchreguläre Ausdrücke gewählt hätte.

Ich glaube, die regulären Ausdrücke, mit denen der Funktionsaufruf und das Schlüsselwort abgeglichen werden, können verfeinert werden. Angesichts der Gültigkeit von Python 3 bin ich jedoch nicht bereit, diese Aufgabe zu übernehmen.

Ich denke, Sie können dies optional verwenden, um Funktionsaufrufe hervorzuheben, indem Sie Folgendes verwenden 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

Bildbeschreibung hier eingeben

muru
quelle
Ich sollte wahrscheinlich eine andere Frage erstellen, aber haben Sie Ideen, wie Sie nur eingebaute Funktionen hervorheben können?
user1685095
@ user1685095 Builtin - Funktionen werden in der aufgelisteten aus pythonBuiltinSyntaxgruppe in dem Standard syntax/python.vim. Allerdings unterscheidet es nicht zwischen Funktionen und Variablen builtin ( True, Falseund Noneist auch in pythonBuiltin). Sie könnten wahrscheinlich die Definitionen für Ihre Verwendung kopieren.
muru
Nun, ich habe eine verfeinerte Syntax verwendet als vim default wie hdima / python und vim-polyglot. Sie alle definieren eingebaute Funktionen wie ein Schlüsselwort, das wichtige Konsequenzen hat. Es werden nicht nur eingebaute Funktionen hervorgehoben, sondern nur Variablen mit demselben Namen und Funktionen in anderen Modulen mit demselben Namen. Ein query(...).***filter***()ähnlicher Filter wird hervorgehoben, obwohl er nichts mit den eingebauten Filterfunktionen zu tun hat.
user1685095
@ user1685095 Standardmäßig werden syntax.vimsie zu Schlüsselwörtern. Siehe github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184
muru
1
@ user1685095 Ungerade. Ich habe keine zusätzlichen syntax/python.vimDateien (nur die Standarddateien und ich sehe nicht das Verhalten, das Sie tun: i.stack.imgur.com/LgF6F.png , und ich stimme der Keyword-Definition zu - das ist die engste Übereinstimmung, und ich glaube nicht , Schlüsselwörter in solchen Fällen aufeinander abgestimmt sind nonkeyword.keyword. wie für Variablen, beachten Sie, dass diese builtins sind Variablen, sie sind Variablen Funktionsobjekte enthält, und kann wie alle anderen Variablen zugewiesen werden. Nichts hindert Sie daran , zu tun sorted = filterund dann unter Verwendung von sortedwie filter.
muru
8

Hier können Sie beginnen:

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

Zerlegen:

/(       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 )

Dies ist verbesserungsbedürftig, gibt Ihnen jedoch einen Überblick darüber, wie Sie dies tun können.

nobe4
quelle
6

Zusätzlich zur Antwort von @ Nobe4 können Sie Folgendes tun:

  • Erstellen Sie die Datei ~/.vim/after/syntax/python.vim
  • Setze diese Zeile in die Datei:

    syntax match PythonArg /(.*\,\s*\zs\w\+\ze\s*=.*)/
    hi PythonArg guibg=blue
    
  • Passen Sie die zweite mit Ihren bevorzugten Werten an.

Dadurch wird eine Syntaxdatei erstellt, in der eine Syntaxübereinstimmung für Ihre Argumente gefolgt von a hinzugefügt =und der zu verwendende Stil festgelegt wird. Dieses Thema :h mysyntaxfile-adddürfte für Sie interessant sein.

Außerdem habe ich einen anderen regulären Ausdruck verwendet als die andere Antwort. Hier ist das Detail (ich weiß nicht, welcher besser funktioniert, also musst du es wahrscheinlich versuchen):

(      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
statox
quelle
Danke für deine Hilfe. Ich wusste nicht, dass ich meine benutzerdefinierte Syntax hinzufügen kann, ohne vorhandene Regeln zu ändern. Ihr Muster stimmt nicht mit dem Schlüsselwortargument überein, wenn es ein erstes Argument in der Funktion ist. Ich werde versuchen, das selbst zu beheben (ich lerne gerade Regexps, um das zu tun). Sobald ich lerne, wie das geht, schreibe ich einen Kommentar.
user1685095
Ich versuche diese Regexp über VIM-Suche und ich denke, dass es nur ein Schlüsselwort im Funktionsaufruf entspricht. Ich brauche es für alle '
user1685095
@ user1685095: Ja, du hast recht, mein Muster ist nicht gut. Ich werde versuchen, es zu verbessern und meine Antwort zu bearbeiten.
statox
3

Ich fand, dass die Antwort von @ Wolfie das Auspacken eines Tupels als Schlüsselwort erfasst und es auch Probleme beim Erfassen von Schlüsselwortargumenten mit Zeilenumbruch gab.

Inspiriert von seinem Regex habe ich mir Folgendes ausgedacht, um meine python.vimSyntaxdatei einzutragen. (Denken Sie daran, dass ich ursprünglich die Syntaxdateipython.vim von sheerun / vim-polyglot verwende. )

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

Und die Regex-Aufschlüsselung ist der Antwort von @ Wolfie sehr ähnlich :

\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

Beachten Sie, dass dies nicht ein Schlüsselwort Argument Farbe wie geschrieben: key = value. Das finde ich gut, da dies gegen die offizielle PEP-8-Whitespace-Empfehlung für Keyword-Argumente verstößt .

ludo
quelle
2

Die vom Verfasser akzeptierte Antwort hat die Hervorhebung für Zeichenfolgen in Funktionsargumentlisten für mich unterbrochen (nach welcher Alchemie ich nicht weiß), daher hier eine hoffentlich sicherere Version, basierend auf der von Statox .

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

ctermfgist für Konsolenterminal, guifgist für GUI. Natürlich können Sie die Farben nach Belieben ändern. Hier ist eine praktische Liste .

Wie immer tun Sie dies am besten, indem Sie es hineinlegen ~/.vim/after/syntax/python.vim

Für eine Regex-Aufschlüsselung klicken Sie hier:

\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

Die abschließende Prüfung verhindert, dass die Hervorhebung durch Farbbedingungen hervorgehoben wird. Sie können es entfernen, wenn Sie möchten.

Wolfie
quelle
Entschuldigung, Sie sind zu spät. Ich habe für mich selbst Maid-Syntax-Datei.
user1685095
Das ist gut; Wenn jemand anderes auf dasselbe Problem stößt, kann er hier hoffentlich einen Blick darauf werfen.
Wolfie