Vim sözdizimi deseni python anahtar kelime bağımsız değişkenini vurgulamak için


17

Ben vim regexps (ben de başka bir regexp çok iyi bilmiyorum) öğrenme ile mücadele, bu yüzden asıl sorun maç regexp tanımlamak

some_function_call(simple_value, keyword=value)

Bu örnekte anahtar kelime.

Bu yüzden, parensin içindeyse ve ondan sonra eşit işareti varsa bir kelimeyle eşleşmelidir.

Bir sonraki sorun vim'de sözdizimi dosyalarının nasıl tanımlanacağıdır. Bununla ilgili yardımı takdir ediyorum, ama öğrenmesi o kadar zor olmamalı, bu yüzden muhtemelen kendi başıma yapabilirim.

Cevaba göre EDIT python için kendi sözdizimi komutumu hizmetçi oldum. Denemek için çekinmeyin. bağlantı açıklamasını buraya girin


Github'da, farkında olduğum en güncel Python sözdizimi dosyasına eklenecek anahtar kelime vurgulamasıyla ilgili açık bir sorun var: github.com/hdima/python-syntax/issues/44 Daha sonra kontrol etmek isteyebilirsiniz. Bunu nasıl yapacağınızı anlarsanız, bu özelliğin herkese açık olması için lütfen oradaki kişilere bildirin (veya bana bir istekte bulunabilmek için mesaj gönderin).
cbaumhardt

1
Evet, ben açtım.
user1685095

Yanıtlar:


12

Bu ayarlarla:

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

Alırım:

resim açıklamasını buraya girin

Buraya:

  1. İçinde işlev çağrısı olan anahtar kelime bağımsız değişkenlerinin bulunabileceği bir sözdizimi bölgesi tanımlarım . Bu containsseçenek, işlev çağrılarını iç içe yerleştirmeme izin veriyor.
  2. Bu bölgede, eşitlik testlerinin eşleşmemesi için geçerli tanımlayıcı karakterlerden ( \i*) sonra gelen =, ancak olmayan herhangi bir dize ==eşleştiriyorum.

Bölgeleri kullanarak, maçları ihtiyacım olduğu kadar iç içe geçiriyorum, matchdüzenli ifadelerle sadece bir için gidersem çok karmaşık (imkansız?) Olurdu.

İşlev çağrısı ve anahtar kelimeyi eşleştirmek için kullanılan normal ifadelerin rafine edilebileceğine inanıyorum, ancak Python 3'te neyin geçerli olduğunu göz önünde bulundurursak , bu benim almak istediğim bir görev değil.

İsteğe bağlı olarak, bunu kullanarak işlev çağrılarını vurgulamak için kullanabileceğinizi düşünüyorum 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

resim açıklamasını buraya girin


Muhtemelen başka bir soru oluşturmalıyım, ancak sadece yerleşik işlevleri nasıl vurgulayacağınız hakkında fikirleriniz var mı?
user1685095

@ user1685095 Yerleşik işlevler pythonBuiltinvarsayılan olarak sözdizimi grubunda listelenir syntax/python.vim. Ancak, işlevleri ve yerleşik değişkenler arasında ayrım yapmaz ( True, Falseve Noneda vardır pythonBuiltin). Muhtemelen tanımları kullanımınız için kopyalayabilirsiniz.
muru

Peki, hdima / python ve vim-polyglot gibi vim varsayılanlarından daha rafine sözdizimi kullandım. Hepsi yerleşik işlevleri önemli bir sonucu olan bir anahtar kelime gibi tanımlarlar. Yalnızca yerleşik işlevler vurgulanmaz, aynı ada sahip değişkenler ve aynı ada sahip diğer modüllerde işlevler vurgulanır. query(...).***filter***()Filtre gibi yerleşik filtre işlevleriyle ilgisi yoktur.
user1685095

@ user1685095 varsayılan syntax.vimonları anahtar kelimeler yapar. Bkz. Github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184
muru

1
@ user1685095 Tek. Ek syntax/python.vimdosyalarım yok (yalnızca varsayılan ve yaptığınız davranışı görmüyorum: i.stack.imgur.com/LgF6F.png ve anahtar kelime tanımına katılıyorum - bu en yakın uyum ve ben anahtar kelimeler gibi durumlarda eşleştirildiği sanmıyorum nonkeyword.keyworddeğişkenler için. As, not bu builtins o vardır fonksiyon nesneleri içeren değişkenler, onlar değişkenleri ve tıpkı diğer değişkenler gibi atanabilir. yapmaktan hiçbir şey önler sizi sorted = filterve sonra kullanarak sortedgibi filter.
muru

8

Buradan başlayabileceğiniz yer:

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

Decomposing:

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

Bunun iyileştirilmesi gerekiyor, ancak bunu nasıl yapabileceğinize dair genel bir bakış sunuyor.


6

@ Nobe4 yanıtına ek olarak aşağıdakileri de yapabilirsiniz:

  • Dosyayı oluşturun ~/.vim/after/syntax/python.vim
  • Tez satırını dosyaya yerleştirin:

    syntax match PythonArg /(.*\,\s*\zs\w\+\ze\s*=.*)/
    hi PythonArg guibg=blue
    
  • İkincisini tercih ettiğiniz değerlerle uyarlayın.

Bu, argümanlarınız için bir sözdizimi eşleşmesi ve ardından a karakterini ekleyecek =ve kullanılacak stili ayarlayacak bir sözdizimi dosyası oluşturur . Bu konu :h mysyntaxfile-addsizin için ilginç olmalı.

Ayrıca diğer cevaptan farklı bir normal ifade kullandım, işte detay (hangisinin daha iyi çalıştığını bilmiyorum, bu yüzden muhtemelen denemeniz gerekecek):

(      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

Yardımın için teşekkürler. Mevcut kuralları değiştirmeden özel sözdizimi ekleyebileceğimi bilmiyordum. Modeliniz, işlevdeki ilk bağımsız değişkense anahtar kelime bağımsız değişkeniyle eşleşmiyor. Bunu kendim düzeltmeye çalışacağım (bunu yapmak için şu anda normal ifadeleri öğreniyorum). Bunu nasıl yapacağımı öğrenir öğrenmez bir yorum göndereceğim.
user1685095

Ben vim arama yoluyla bu regexp deniyorum ve fonksiyon çağrısında sadece bir anahtar kelime ile eşleştiğini düşünüyorum.
Hepsine uyması lazım

@ user1685095: Evet haklısın şablonum iyi değil. Bunu geliştirmeye ve cevabımı düzenlemeye çalışacağım.
statox

3

Ben bulundu Wolfie'nin cevabı @ Anahtar kelime olarak bir başlığın unwrapping yakalamaları ve aynı zamanda anahtar kelime argümanlar linebroken sorun yakalama vardı.

Onun regex esinlenerek benim python.vimsözdizimi dosya koymak için aşağıdaki ile geldi . (Aslında sheerun / vim-polyglotpython.vim sözdizimi dosyasını kullandığımı unutmayın )

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

Normal ifade dökümü @ Wolfie'nin cevabına çok benziyor :

\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

Bu şekilde yazılmış bir kelime argüman renk unutmayın: key = value. Anahtar kelime argümanları için resmi PEP-8 boşluk önerisine aykırı olduğu için iyi bir şey olduğunu düşünüyorum .


2

Yazma olarak kabul edilen cevap , benim için işlev argüman listelerindeki dizeler için (bilmediğim simya tarafından) vurgulamayı kırdı, bu yüzden Statox'un birine dayanan umarım daha güvenli bir versiyon .

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

ctermfgkonsol terminali içindir, guifggui içindir. Tabii ki renkleri süslü bulduğunuz her şeye değiştirmekte özgürsünüz. İşte kullanışlı bir liste .

Her zaman olduğu gibi, bunu içine koymak en iyisidir ~/.vim/after/syntax/python.vim

Normal ifade dökümü için:

\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

Son kontrol, vurgulamayı renklendirme koşullarından durdurur. İsterseniz kaldırabilirsiniz.


Üzgünüm, geç kaldın. Kendim için sözdizimi dosyasını temizledim.
user1685095

Bu iyi; eğer bir başkası aynı sorunla karşılaşırsa, umarım buraya bir göz atabilirler.
Wolfie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.