Bagaimana saya bisa memperbaiki penyorotan sintaks "hilang" untuk kata kunci Python seperti "diri"?

12

Saya mencoba untuk memperbaiki penyorotan sintaksis untuk python; warna saya berbeda dari yang ada di tangkapan layar seperti apa "seharusnya" terlihat dalam skema warna vim yang berbeda. Dan Anda dapat melihat perbedaan dalam membandingkan .rb (yang ditampilkan dengan benar) ke .py, yang sepertinya tidak aktif:

masukkan deskripsi gambar di sini

Misalnya, perhatikan bagaimana selftidak disorot. (Ini ada di base16, tetapi perbandingannya akan serupa di skema warna lain). Secara umum, sepertinya highlight sintaks objek salah.

Beberapa hal yang saya coba:

  1. Melihat skrip sintaks vim memuat; satu-satunya perbedaan antara .py dan .rb dalam contoh di bawah ini adalah, tentu saja, ruby ​​mendapat indentasi / ruby.vim dan sintaks / ruby.vim sementara python mendapat indent / python.vim dan sintaks / python.vim. Ini adalah file yang datang dengan vim homebrew.
  2. Memuat file yang sama di macvim daripada terminal (iterm2) vim; masalah yang sama, file terlihat persis sama seperti pada gambar.
  3. Menambahkan file python.vim baru . Tidak menyelesaikan masalah, bahkan jika digunakan sebagai .vim/afterskrip.

Setiap saran dipersilahkan; Saya telah membenturkan kepalaku selama berjam-jam, dan tidak tahu mengapa penyorotan tidak berfungsi seperti yang diharapkan.

sl8r000
sumber
Perhatikan bahwa Python tidak memiliki simbol, dan saya sangat menyarankan Anda menggunakan sintaks Python 3 untuk kode baru.
Martin Tournoij

Jawaban:

12

Cara kerja penyorotan sintaks secara singkat:

  • Dalam syntax/<filetype>.vimaturan sintaks didefinisikan dengan :syntaxperintah. Perintah ini mendefinisikan, baik, sintaks. Dikatakan "jika teks cocok dengan ekspresi reguler ini, ini adalah string", dan sebagainya. Untuk melakukannya, ia menetapkan grup sorotan . Itu tidak mengatakan apa-apa tentang warna seperti itu.

  • :highlightmengatakan "sorot grup ini dengan warna-warna ini". Ini dilakukan dalam skema warna , bukan file sintaks. Ada sekelompok kelompok Highlight default ( String, Function, Special, dan sebagainya) yang semua skema warna harus mendefinisikan.

    Anda tidak dibatasi oleh grup-grup default ini, dan Anda dapat membuat grup sebanyak yang Anda inginkan (tetapi file sintaksis default biasanya tidak).

  • The indent/<filetype>.vimFile mengontrol lekukan otomatis. Sebagai contoh untuk Ruby dikatakan "baris setelah defharus meningkatkan tingkat lekukan" dan "baris setelah endharus mengurangi lekukan satu tingkat". Itu tidak melakukan apa pun dengan warna atau penyorotan sintaksis.


Mengapa bahasa pemrograman yang berbeda disorot berbeda? Sebagian karena estetika pribadi dan pendapat siapa pun yang menulisnya. Misalnya di Ruby, Typegrup sorotan digunakan untuk nama kelas. Tapi bisa juga itu Functionatau sesuatu yang lain. Kenapa begitu Type? Mungkin karena penulis berpikir bahwa itu terlihat lebih baik dalam skema warnanya.

Tetapi yang lebih penting, bahasa memiliki semantik dan kepekaan yang berbeda. Di Ruby, selfadalah kata kunci khusus. Anda tidak dapat melakukan self = "foo"atau def self(). Ini adalah kesalahan. Tapi ini tidak terjadi dengan Python. Ini hanyalah variabel lain tanpa properti khusus. Perbuatan:

x = Object()
x.foo()

benar-benar "diterjemahkan" oleh Python ke:

Object.foo(x)

Namanya selfhanya konvensi (hampir diadopsi secara universal) tetapi Anda dapat menamainya sesuka Anda; def x(this):atau def x(xxx):sama-sama valid. Anda juga dapat menggunakan nama di selfmana saja Anda suka; self = 'foo'dan def self():baik-baik saja.

Saya berpendapat bahwa selftidak boleh disorot, karena itu bukan kata kunci khusus, atau variabel yang ditentukan sebelumnya (seperti str). Tidak ada jejak kata selfdalam file sintaks, jadi sepertinya penulisnya beralasan sama :-)


Jika Anda ingin selfdisorot Anda harus membuat aturan sintaks untuk itu:

:syn keyword pythonBuiltin self

Nama pythonBuiltingrup sudah ditentukan dalam file sintaks default dan ditautkan ke Functiongrup highlight. Untuk menggunakan grup sorotan baru, gunakan sesuatu seperti:

:syn keyword pythonSelf self
:highlight def link pythonSelf Special

Untuk melakukan perubahan ini, Anda tidak bisa hanya menempelkannya di file vimrc Anda. File sintaks akan menimpanya. Sebagai gantinya, Anda harus menjalankannya setelah file sintaks dimuat, yang dapat Anda lakukan dengan dua cara:

  1. Gunakan FileTypeautocmd:

    augroup python
        autocmd!
        autocmd FileType python
                    \   syn keyword pythonSelf self
                    \ | highlight def link pythonSelf Special
    augroup end
    
  2. Gunakan after-directory, ~/.vim/after/syntax/python.vim:

    syn keyword pythonSelf self
    highlight def link pythonSelf Special
    

Kedua metode secara efektif sama. Gunakan mana yang Anda inginkan.

Martin Tournoij
sumber