Saya telah mencari cara untuk mendeteksi apakah titik ada di komentar dengan melihat bagaimana buffer saat ini diklasifikasi.
Smartparens mendefinisikan sp-point-in-comment
, yang bergantung pada syntax-ppss
. Namun, tampaknya itu syntax-ppss
dan parse-partial-sexp
dapat digunakan untuk bahasa yang arbitrer, bahkan jika mereka tidak menggunakan ekspresi s.
Misalnya, Python ini:
x = 1
# I'm a comment
y = 2
Menempatkan titik di dalam komentar dan mengevaluasi (if (nth 4 (syntax-ppss)) 'comment 'not-comment)
berfungsi dengan benar.
Apakah syntax-ppss
berfungsi untuk mode pemrograman apa pun? Mengapa dokumen membahas ekspresi s?
syntax-highlighting
parsing
syntax
Wilfred Hughes
sumber
sumber
Jawaban:
Ekspresi s pada dasarnya adalah "sintaksis abstrak", dalam arti bahwa itu hanyalah sintaksis konkret untuk pohon sintaksis abstrak, dan dengan demikian bahasa apa pun dapat direpresentasikan sebagai ekspresi-s, dan dimanipulasi dengan perintah ekspresi-s. Oleh karena itu,
syntax-ppss
berbicara tentang "Sexps" hanyalah cara Lisp untuk berbicara tentang pohon sintaksis abstrak.Namun, secara praktis,
syntax-ppss
umumnya tidak berfungsi untuk mode apa pun. Ini secara fundamental ditargetkan pada bahasa seperti Lisp, dan jika bahasa konkret dari suatu bahasa menyimpang dari Sexps terlalu banyak, tidak masuk akal lagi untuk menggunakan perintah Sexp untuk memanipulasi bahasa. Ini akan berhasil, tetapi akan ada kesenjangan yang terlalu besar antara representasi abstrak dan sintaksis konkret, yang akan membuat sebagian besar perintah kontra-intuitif.Namun, beberapa infrastruktur yang mendasarinya
syntax-ppss
cukup generik. Mode utama biasanya berusaha keras untuk menyambungkannya, karena membuatnya bekerja dengan baik dengan banyak fitur bawaan Emacs dan menyediakan antarmuka generik untuk paket pihak ketiga lainnya seperti Smartparens.Khususnya,
syntax-ppss
bergantung pada Tabel Sintaks untuk string dan komentar. Tabel Sintaks mengategorikan karakter individu berdasarkan kelas sintaksisnya. Ada kelas untuk pembatas berpasangan, pembatas string dan karakter komentar.Struktur string dan komentar hampir sama di hampir semua bahasa pemrograman: String biasanya terlampir dalam pembatas khusus. Komentar dapat memiliki pembatas khusus juga, atau mulai dengan karakter tertentu dan meluas hingga akhir baris. Struktur ini dapat dengan mudah ditangkap dalam tabel sintaksis, dan hampir semua mode utama menentukan tabel sintaksis yang sesuai, jika hanya untuk mendapat untung dari fortifikasi sintaksis Emacs.
Oleh karena itu,
syntax-ppss
berfungsi dengan baik untuk string dan komentar dalam hampir semua bahasa, tetapi dukungan dan "kegunaan" dari fitur lain bervariasi.sumber
Menambahkan ke jawaban @ lunaryorn, saya pikir sintaks-pps hanya mengandalkan ketahanan sistem tabel sintaks emacs, yang berfungsi untuk komentar dan string dalam kebanyakan bahasa. Tetapi jika bahasa memiliki sintaksis bahwa tabel sintaksis tidak dapat menangkap, dan jika mode tidak membangun parser untuk menambahkan properti sintaksis ke tempat yang tepat,
syntax-ppss
akan gagal.Coba ini di
html-mode
:dan panggil perintah berikut:
Hanya aa yang benar, tetapi bb juga harus benar.
Ketika masuk
nxml-mode
, tidak ada yang mengembalikan nilai benar, tetapi setidaknya aa harus benar.sumber