Wzorzec składni Vima, aby podświetlić argument słowa kluczowego python

17

Mam trudności z nauką wyrażeń regularnych vim (nie znam też dobrze innych wyrażeń regularnych), więc głównym problemem jest zdefiniowanie wyrażeń regularnych, które pasowałyby do siebie

some_function_call(simple_value, keyword=value)

słowo kluczowe w tym przykładzie.

Powinien więc pasować do słowa, jeśli znajduje się w parens i ma po nim znak równości.

Kolejnym problemem jest sposób definiowania plików składniowych w vimie. Byłbym wdzięczny za pomoc w tym, ale nauka nie powinna być trudna, więc prawdopodobnie mogę to zrobić samodzielnie.

EDYCJA na podstawie odpowiedzi Sporządziłem własny skrypt składni Pythona. Spróbuj tego. wprowadź opis linku tutaj

użytkownik1685095
źródło
W Github istnieje otwarty problem polegający na tym, że wyróżnianie słów kluczowych należy uwzględnić w najbardziej aktualnym pliku składni Pythona, o którym wiem: github.com/hdima/python-syntax/issues/44 Może warto to sprawdzić później. Jeśli wymyślisz, jak to zrobić, daj znać tym osobom (lub napisz do mnie, abym mógł utworzyć żądanie ściągnięcia), aby ta funkcja była dostępna dla wszystkich.
cbaumhardt
1
Tak, to ja go otworzyłem.
user1685095,

Odpowiedzi:

12

Dzięki tym ustawieniom:

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

Dostaję:

wprowadź opis zdjęcia tutaj

Tutaj:

  1. Definiuję region składni, w którym można znaleźć argumenty słów kluczowych, które byłyby wywołaniem funkcji. Ta containsopcja pozwala mi zagnieżdżać wywołania funkcji.
  2. W tym regionie dopasowuję dowolny ciąg znaków zawierający prawidłowe znaki identyfikatora ( \i*), po których następuje =, ale nie ==, aby testy równości nie były dopasowane.

Używając regionów, mogę zagnieżdżać mecze tyle, ile potrzebuję, co byłoby bardzo skomplikowane (niemożliwe?), Gdybym wybrał tylko matchwyrażenia regularne.

Uważam, że wyrażenia regularne używane do dopasowania wywołania funkcji i słowa kluczowego mogą zostać dopracowane, ale biorąc pod uwagę to, co jest ważne w Pythonie 3 , nie jest to zadanie, które chętnie podejmę się.

Opcjonalnie myślę, że możesz użyć tego do podświetlenia wywołań funkcji, używając 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

wprowadź opis zdjęcia tutaj

muru
źródło
Prawdopodobnie powinienem utworzyć kolejne pytanie, ale czy masz pomysły, jak wyróżnić tylko wbudowane funkcje?
user1685095
@ user1685095 Wbudowane funkcje są pythonBuiltindomyślnie wymienione w grupie składni syntax/python.vim. Jednak to nie rozróżnia funkcji i zmiennych wbudowanych ( True, Falsea Nonetakże w pythonBuiltin). Prawdopodobnie możesz skopiować definicje do swojego użytku.
muru
Cóż, użyłem bardziej dopracowanej składni niż domyślnej vim, takiej jak hdima / python i vim-polyglot. Wszystkie one definiują wbudowane funkcje jak słowa kluczowe, które mają ważne konsekwencje. Podświetlane są nie tylko wbudowane funkcje, ale także zmienne o tych samych nazwach i funkcje w innych modułach o tej samej nazwie. Podobnie jak query(...).***filter***()filtr jest podświetlony, podczas gdy nie ma on nic wspólnego z wbudowanymi funkcjami filtrów.
user1685095
@ user1685095 domyślnie syntax.vimczyni je słowami kluczowymi. Zobacz github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184
muru
1
@ user1685095 Nieparzysty. Nie mam dodatkowych syntax/python.vimplików (tylko domyślny i nie widzę takiego zachowania: i.stack.imgur.com/LgF6F.png i zgadzam się z definicją słowa kluczowego - to najbliższe dopasowanie, a ja nie sądzę, że słowa kluczowe są dopasowane w przypadkach takich jak nonkeyword.keyword. Jeśli chodzi o zmienne, zwróć uwagę, że te wbudowane zmienne, są to zmienne zawierające obiekty funkcyjne, i można je przypisać tak samo jak innym zmiennym. Nic nie stoi na przeszkodzie, aby to zrobić, sorted = filtera następnie użyć sortedpodobnego filter,
muru
8

Oto od czego możesz zacząć:

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

Rozkład:

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

To wymaga ulepszeń, ale daje przegląd tego, jak możesz to zrobić.

nobe4
źródło
6

Oprócz odpowiedzi @ Nobe4 możesz wykonać następujące czynności:

  • Utwórz plik ~/.vim/after/syntax/python.vim
  • Umieść tezę w pliku:

    syntax match PythonArg /(.*\,\s*\zs\w\+\ze\s*=.*)/
    hi PythonArg guibg=blue
    
  • Dostosuj drugi z preferowanymi wartościami.

Spowoduje to utworzenie pliku składni, który doda dopasowanie składni do argumentów, a następnie a =i ustawi styl do użycia. Ten temat :h mysyntaxfile-addpowinien być dla Ciebie interesujący.

Użyłem także innego wyrażenia regularnego niż inna odpowiedź, oto szczegół (nie wiem, który z nich działa lepiej, więc prawdopodobnie będziesz musiał spróbować):

(      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
źródło
Dzięki za pomoc Nie wiedziałem, że mogę dodać własną składnię bez modyfikowania istniejących reguł. Twój wzorzec nie pasuje do argumentu słowa kluczowego, jeśli jest to pierwszy argument w funkcji. Spróbuję to naprawić sam (uczę się teraz wyrażeń regularnych, aby to zrobić). Jak tylko nauczę się, jak to zrobić, opublikuję komentarz.
user1685095,
Próbuję tego wyrażenia regularnego za pomocą wyszukiwania vim i myślę, że pasuje tylko do jednego słowa kluczowego w wywołaniu funkcji. Potrzebuję go dopasować do wszystkich ”
użytkownik1685095,
@ user1685095: Tak, masz rację, mój wzór nie jest dobry. Spróbuję to poprawić i zredagować swoją odpowiedź.
statox
3

Odkryłem, że odpowiedź @ Wolfie przechwytuje rozpakowanie krotki jako słowo kluczowe, a także miała problemy z przechwyceniem argumentów słowa kluczowego z łamanym wierszem.

Zainspirowany jego wyrażeniem regularnym wymyśliłem następujące, aby umieścić w moim python.vimpliku składni. (Pamiętaj, że pierwotnie używam python.vimpliku składni z 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

Podział wyrażenia regularnego jest bardzo podobny do odpowiedzi @ 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

Zauważ, że nie będzie to kolor argument słowa kluczowego napisany jako: key = value. Co uważam za dobrą rzecz, ponieważ jest to sprzeczne z oficjalną rekomendacją białych znaków PEP-8 dla argumentów słów kluczowych .

gra w kości
źródło
2

Przyjęta odpowiedź w momencie pisania przerwała podświetlanie ciągów w listach argumentów funkcji (według jakiej alchemii nie wiem), więc mam nadzieję, że jest to bezpieczniejsza wersja, oparta na wersji Statoxa .

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

ctermfgjest dla terminala konsoli, guifgjest dla GUI. Oczywiście możesz dowolnie zmieniać kolory na dowolne. Oto przydatna lista .

Jak zawsze najlepiej włożyć to do środka ~/.vim/after/syntax/python.vim

Aby uzyskać rozkład wyrażeń regularnych, proszę:

\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

Ostatnia kontrola powstrzymuje wyróżnianie od warunkowych kolorów. Możesz usunąć, jeśli chcesz.

Wolfie
źródło
Przepraszam za spóźnienie. Mam plik składni pokojówki dla siebie.
user1685095,
W porządku; jeśli ktoś napotka ten sam problem, zrobię to, mam nadzieję, zerknąć tutaj.
Wolfie