Saya telah menulis mode sederhana untuk menangani JSON. Ia menggunakan mesin turunan untuk menggunakan kembali sebagian besar kode json-mode. Namun satu tambahan adalah Anda dapat memasukkan elisp ke dalam teks JSON yang dievaluasi pada waktu pengiriman JSON. Sebagai contoh kutipan dari json terlihat seperti ini:
{
"parameters": {
"IRC_USER": "stsquad",
"PUB_KEY": `(format "\"%s\"" (s-trim (shell-command-to-string "cat ~/.ssh/id_rsa.pub")))`
}
}
Saat ini penyorotan sintaks dari teks ini rusak karena sintaks JSON hightlighter get's dilemparkan oleh elisp. Saya ingin mengatur tabel sintaks bersarang sehingga elisp dikenali dengan benar sebagai elisp ketika di dalam karakter escape (saya telah memilih `dalam kasus ini). Saya mengerti Anda dapat bergabung dengan char-tables (dari mana sintaks-tables dibuat) dengan sesuatu seperti:
(defvar lava-mode-syntax-table
(let ((json-table (copy-syntax-table json-mode-syntax-table))
(elisp-table (copy-syntax-table lisp-mode-syntax-table)))
(set-char-table-parent elisp-table json-table)
(modify-syntax-entry ?` "(`" json-table)
(modify-syntax-entry ?` ")`" json-table)
json-table)
"LAVA Mode syntax table.
This is a combination of json-mode-syntax-table with an escape into
lisp-mode-syntax table for the embedded elisp.")
Tapi saya tidak mengerti bagaimana saya bisa memodifikasi tabel sintaks untuk mulai menggunakan tabel sintaks anak (elisp) sementara di antara karakter escape?
sumber
Jawaban:
Anda tidak ingin membuat sarang satu tabel sintaks (yang merupakan struktur vektor) di dalam yang lain, Anda ingin mengatur buffer di mana, tergantung pada posisinya, satu tabel sintaks akan digunakan sebagai pengganti yang lain.
Jawaban lain menjelaskan bagaimana melakukan ini menggunakan
syntax-table
properti teks. Berikut ini cara melakukannya menggunakan salah satu paket "mode utama ganda", mmm-mode . Ini akan menggunakan segalanya mode primer di tingkat atas buffer, dan tabel sintaks submode, aturan font-lock, keymap, dll di "subregion".Ini mengasumsikan bahwa file mode campuran Anda dinamai
*.el.json
. Sesuaikan sesuai kebutuhan.Sekarang, instal
mmm-mode
, evaluasi hal di atas dan (hanya kemudian) buka salah satu file yang dimaksud.sumber
nxhtml-mode
agak kikuk, ya.mmm-mode
kurang begitu, tetapi masih kompleks. Saya tidak yakin apakah Anda dapat melakukan hal seperti ini diweb-mode
; tanya penulisnya, mungkin.syntax-ppss
cache tidak.Ok, mari kita luruskan beberapa dasar.
Tabel sintaks Nesting dimungkinkan
Tabel sintaks tidak harus bersifat global ke seluruh buffer. Anda dapat menerapkannya sebagai properti teks ke wilayah tertentu. Ini berarti Anda memang dapat menerapkan
elisp
tabel sintaks hanya untuk wilayah yang dikelilingi oleh backtick.Bagaimana kamu melakukannya?
Inilah salah satu cara Anda dapat melakukannya. Metode ini melakukannya segera sebelum font-lock berjalan melalui buffer, jadi metode ini harus secara khusus mencegah masalah penguncian font Anda.
Dalam definisi mode-utama Anda, Anda harus menambahkan:
Tabel sintaksis tidak sama dengan penyorotan sintaksis
Highlighter sintaks (sistem font-lock) menggunakan Tabel Sintaks sebagai bagian dari informasinya, sehingga solusi di atas harus mencegah stabilo agar tidak menjadi gila.
Namun, itu hanya bagian dari data, jika Anda juga ingin teks di backticks berwarna persis seperti yang Anda lihat di buffer elisp, Anda harus memperluas fungsi di atas untuk melakukannya secara khusus.
sumber
with-silent-modifications
(sepertifont-lock-default-fontify-region
halnya), tetapi yang lebih baik adalah memindahkanadd-text-properties
bisnis inisyntax-propertize-function
.