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:
Misalnya, perhatikan bagaimana self
tidak 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:
- 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.
- Memuat file yang sama di macvim daripada terminal (iterm2) vim; masalah yang sama, file terlihat persis sama seperti pada gambar.
- Menambahkan file python.vim baru . Tidak menyelesaikan masalah, bahkan jika digunakan sebagai
.vim/after
skrip.
Setiap saran dipersilahkan; Saya telah membenturkan kepalaku selama berjam-jam, dan tidak tahu mengapa penyorotan tidak berfungsi seperti yang diharapkan.
syntax-highlighting
filetype-python
sl8r000
sumber
sumber
Jawaban:
Cara kerja penyorotan sintaks secara singkat:
Dalam
syntax/<filetype>.vim
aturan sintaks didefinisikan dengan:syntax
perintah. 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.:highlight
mengatakan "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>.vim
File mengontrol lekukan otomatis. Sebagai contoh untuk Ruby dikatakan "baris setelahdef
harus meningkatkan tingkat lekukan" dan "baris setelahend
harus 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,
Type
grup sorotan digunakan untuk nama kelas. Tapi bisa juga ituFunction
atau sesuatu yang lain. Kenapa begituType
? 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,
self
adalah kata kunci khusus. Anda tidak dapat melakukanself = "foo"
ataudef self()
. Ini adalah kesalahan. Tapi ini tidak terjadi dengan Python. Ini hanyalah variabel lain tanpa properti khusus. Perbuatan:benar-benar "diterjemahkan" oleh Python ke:
Namanya
self
hanya konvensi (hampir diadopsi secara universal) tetapi Anda dapat menamainya sesuka Anda;def x(this):
ataudef x(xxx):
sama-sama valid. Anda juga dapat menggunakan nama diself
mana saja Anda suka;self = 'foo'
dandef self():
baik-baik saja.Saya berpendapat bahwa
self
tidak boleh disorot, karena itu bukan kata kunci khusus, atau variabel yang ditentukan sebelumnya (sepertistr
). Tidak ada jejak kataself
dalam file sintaks, jadi sepertinya penulisnya beralasan sama :-)Jika Anda ingin
self
disorot Anda harus membuat aturan sintaks untuk itu:Nama
pythonBuiltin
grup sudah ditentukan dalam file sintaks default dan ditautkan keFunction
grup highlight. Untuk menggunakan grup sorotan baru, gunakan sesuatu seperti: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:
Gunakan
FileType
autocmd:Gunakan
after-directory
,~/.vim/after/syntax/python.vim
:Kedua metode secara efektif sama. Gunakan mana yang Anda inginkan.
sumber