Pola sintaks Vim untuk menyoroti argumen kata kunci python

17

Saya berjuang dengan belajar vim regexps (saya juga tidak tahu regexp lain dengan baik), jadi masalah utamanya adalah menentukan regexp yang cocok dengan

some_function_call(simple_value, keyword=value)

kata kunci dalam contoh ini.

Jadi itu harus cocok dengan kata jika itu di dalam parens dan memiliki tanda yang sama setelah itu.

Masalah selanjutnya adalah bagaimana mendefinisikan file sintaks dalam vim. Saya akan sangat menghargai bantuan dengan itu, tetapi seharusnya tidak terlalu sulit untuk dipelajari, jadi saya bisa melakukannya sendiri mungkin.

EDIT berdasarkan jawaban saya sudah membantu skrip sintaks saya sendiri untuk python. Jangan ragu untuk mencobanya. masukkan deskripsi tautan di sini

pengguna1685095
sumber
Ada masalah terbuka pada Github untuk menyoroti kata kunci yang akan dimasukkan dalam file sintaks Python paling mutakhir yang saya ketahui: github.com/hdima/python-syntax/issues/44 Anda mungkin ingin memeriksanya nanti. Jika Anda mengetahui cara melakukannya, beri tahu orang-orang di sana (atau pesan saya agar saya dapat membuat permintaan tarik) agar fitur ini tersedia untuk semua orang.
cbaumhardt
1
Ya, saya yang sudah membukanya.
user1685095

Jawaban:

12

Dengan pengaturan ini:

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

Saya mendapat:

masukkan deskripsi gambar di sini

Sini:

  1. Saya mendefinisikan wilayah sintaks di mana argumen kata kunci dapat ditemukan, yang akan menjadi panggilan fungsi. The containspilihan memungkinkan fungsi panggilan saya sarang.
  2. Di dalam wilayah itu, saya cocok dengan string apa pun yang terbuat dari karakter pengidentifikasi yang valid ( \i*) diikuti oleh =, tetapi tidak ==, sehingga tes kesetaraan tidak cocok.

Dengan menggunakan region, aku bisa membuat sarang pertandingan sebanyak yang aku butuhkan, yang akan sangat rumit (mustahil?) Jika aku pergi hanya matchdengan ekspresi reguler.

Saya percaya persamaan reguler yang digunakan untuk mencocokkan panggilan fungsi dan kata kunci dapat disempurnakan, tetapi mengingat apa yang valid di Python 3 , itu bukan tugas yang saya bersedia ambil.

Secara opsional, saya pikir Anda dapat menggunakan ini untuk menyorot panggilan fungsi, menggunakan 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

masukkan deskripsi gambar di sini

muru
sumber
Saya mungkin harus membuat pertanyaan lain, tetapi apakah Anda memiliki ide tentang cara menyorot fungsi bawaan saja?
user1685095
@ user1685095 Fungsi builtin tercantum dalam pythonBuiltingrup sintaks di default syntax/python.vim. Namun, itu tidak membedakan antara fungsi dan variabel bawaan ( True, Falsedan Nonejuga di pythonBuiltin). Anda mungkin dapat menyalin definisi untuk penggunaan Anda.
muru
Yah, saya telah menggunakan sintaks yang lebih disempurnakan kemudian vim default seperti hdima / python dan vim-polyglot. Mereka semua mendefinisikan fungsi builtin seperti kata kunci yang memiliki konsekuensi penting. Tidak hanya fungsi bawaan yang disorot, tetapi hanya variabel dengan nama dan fungsi yang sama di modul lain dengan nama yang sama disorot. Suka query(...).***filter***()filter disorot sementara itu tidak ada hubungannya dengan fungsi filter bawaan.
user1685095
@ user1685095 defaultnya syntax.vimmemang membuatnya kata kunci. Lihat github.com/vim/vim/blob/master/runtime/syntax/python.vim#L184
muru
1
@ user1685095 Aneh. Saya tidak memiliki syntax/python.vimfile tambahan (hanya default, dan saya tidak melihat perilaku yang Anda lakukan: i.stack.imgur.com/LgF6F.png , dan saya setuju dengan definisi kata kunci - itu yang paling cocok, dan saya jangan berpikir kata kunci cocok dalam kasus-kasus seperti nonkeyword.keyword. Adapun variabel, perhatikan bahwa builtin ini adalah variabel, mereka variabel yang berisi objek fungsi, dan dapat ditugaskan seperti variabel lain. Tidak ada yang menghalangi Anda untuk melakukan sorted = filterdan kemudian menggunakan sortedseperti filter.
Muru
8

Di sinilah Anda dapat mulai dari:

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

Membusuk:

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

Ini membutuhkan peningkatan tetapi memberi Anda gambaran tentang bagaimana Anda bisa melakukannya.

nobe4
sumber
6

Selain jawaban @ Nobe4 Anda dapat melakukan hal berikut:

  • Buat file ~/.vim/after/syntax/python.vim
  • Masukkan baris tesis dalam file:

    syntax match PythonArg /(.*\,\s*\zs\w\+\ze\s*=.*)/
    hi PythonArg guibg=blue
    
  • Sesuaikan yang kedua dengan nilai-nilai pilihan Anda.

Ini akan membuat file sintaks yang akan menambahkan kecocokan sintaksis untuk argumen Anda diikuti oleh a =dan mengatur gaya untuk digunakan. Topik ini :h mysyntaxfile-addseharusnya menarik untuk Anda.

Saya juga menggunakan regex yang berbeda dari jawaban yang lain, inilah detailnya (saya tidak tahu mana yang lebih baik sehingga Anda mungkin harus mencoba):

(      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
sumber
Terima kasih atas bantuannya. Saya tidak tahu bahwa saya dapat menambahkan sintaks khusus saya tanpa mengubah aturan yang ada. Pola Anda tidak cocok dengan argumen kata kunci jika itu adalah argumen pertama yang berfungsi. Saya akan mencoba memperbaikinya sendiri (saya sedang belajar regexps sekarang untuk melakukannya). Begitu saya akan belajar bagaimana melakukan itu, saya akan mengirim komentar.
user1685095
Saya mencoba regexp ini melalui pencarian vim dan saya pikir hanya cocok dengan satu kata kunci dalam panggilan fungsi. Saya membutuhkannya untuk mencocokkan semuanya '
user1685095
@ user1685095: Ya, Anda benar, pola saya tidak baik. Saya akan mencoba memperbaikinya dan mengedit jawaban saya.
statox
3

Saya menemukan bahwa jawaban @ Wolfie menangkap bungkusan tuple sebagai kata kunci dan juga kesulitan menangkap argumen kata kunci linebroken.

Terinspirasi oleh regex-nya, saya datang dengan yang berikut untuk dimasukkan ke dalam python.vimfile sintaks saya . (Ingatlah bahwa saya awalnya menggunakan python.vimfile sintaks dari 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

Dan rincian regex sangat mirip dengan jawaban @ 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

Catatan bahwa ini tidak akan mewarnai argumen kata kunci ditulis sebagai: key = value. Yang saya anggap hal yang baik, karena bertentangan dengan rekomendasi spasi putih PEP-8 resmi untuk argumen kata kunci .

ludo
sumber
2

Jawaban yang diterima saat penulisan melanggar sorotan untuk string di dalam daftar argumen fungsi bagi saya (oleh alkimia apa yang saya tidak tahu), jadi inilah versi yang mudah-mudahan lebih aman, berdasarkan Statox ' .

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

ctermfguntuk terminal konsol, guifguntuk gui. Tentu saja Anda bebas mengubah warna menjadi apa pun yang Anda sukai. Berikut daftar praktisnya .

Seperti biasa, Anda melakukan yang terbaik ~/.vim/after/syntax/python.vim

Untuk gangguan regex, ini dia:

\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

Pemeriksaan terakhir menghentikan penyorotan dari kondisi pewarnaan. Anda dapat menghapus jika diinginkan.

Wolfie
sumber
Maaf, kamu terlambat. Saya sudah menyiapkan file sintaks untuk diri saya sendiri.
user1685095
Tidak apa-apa; jika orang lain mengalami masalah yang sama saya lakukan mereka bisa mengintip di sini mudah-mudahan.
Wolfie