Dalam vim, dokumen berikut ini akan menyebabkan $PWD
on line 2 dan 3 diwarnai dengan dua cara berbeda:
#/bin/sh
echo "Current Directory: $PWD"
echo 'Current Directory: $PWD'
Contoh pertama dari $PWD
akan berada dalam warna yang berbeda dari sisa string itu. Ini memberikan indikasi visual yang jelas bahwa variabel akan diperluas, daripada diperlakukan sebagai teks literal. Sebaliknya, instance kedua $PWD
akan diwarnai sama dengan string yang lain, karena tanda kutip tunggal menyebabkannya diperlakukan sebagai teks literal.
Apakah ada mode emacs yang ada yang menyediakan jenis "kesadaran mengutip-shell?"
sh-mode
? Mungkin itu dapat ditambahkan ke Emacs sendiri.Jawaban:
Kode di bawah ini menggunakan aturan font-lock dengan fungsi bukan regexp, fungsi mencari kejadian
$VAR
tetapi hanya ketika mereka berada di dalam string yang dikutip ganda. Fungsi(syntax-ppss)
ini digunakan untuk menentukan ini.Aturan font-lock menggunakan
prepend
bendera untuk menambahkan dirinya di atas penyorotan string yang ada. (Perhatikan bahwa banyak paket menggunakant
untuk ini. Sayangnya, ini menimpa semua aspek dari penyorotan yang ada. Misalnya, menggunakanprepend
akan mempertahankan warna latar belakang string (jika ada) saat mengganti warna latar depan.)Anda dapat memanggil menggunakan ini dengan menambahkan fungsi terakhir ke pengait yang sesuai, misalnya:
sumber
2
aturan kunci-huruf dengan aturan0
itu seharusnya berfungsi. (Anda mungkin perlu memperpanjang regexp untuk menyertakan trailing}
untuk disorot${FOO}
dengan benar.) Angka ini mengacu pada subkelompok regexp dari pertandingan,0
artinya seluruh pertandingan harus disorot.Saya meningkatkan jawaban @ Lindydancer dengan cara berikut:
sh-script-extra-font-lock-is-in-double-quoted-string
, karena hanya digunakan sekali$10
,$1
, dll) yang disorot.Istirahat untuk kode
sumber
[^\\\\]
dapat ditulis sebagai[^\\]
, itu satu set karakter yang tidak cocok, dan kode Anda termasuk backslash dua kali. Di versi Emacs yang lebih lama harus digunakanfont-lock-fontify-buffer
, di yang lebih baru Anda seharusnya meneleponfont-lock-flush
dan meneleponfont-lock-fontify-buffer
dari elisp sudah usang. Kode asli saya mengikuti ini, kode Anda tidak. Bagaimanapun, mungkin ide yang lebih baik untuk memigrasikan ini ke arsip GitHub dan bergabung dengan upaya tersebut.[^\\]
luput dari itu]
? Begitulah cara regex bekerja di Jawa seperti yang saya tahu.