Bagaimana mendeteksi jika intinya ada di dalam area komentar?
15
Periksa nilai * keempat dalam daftar yang dikembalikan oleh syntax-ppss
:
(nth 4 (syntax-ppss))
Itu nil
jika titik di luar komentar, t
jika di dalam komentar non-nestable, atau integer (kedalaman bersarang) jika di dalam komentar nestable. Lihat docstring parse-partial-sexp
untuk lebih jelasnya.
* Berbasis nol.
Perhatikan bahwa ini tidak berfungsi dengan mode-Org, Anda harus menggunakan ini:
(defun in-comment-p ()
"Testy if cursor/point in a commented line?"
(save-excursion
(if (derived-mode-p 'org-mode)
(save-match-data (beginning-of-line) (looking-at "^[ \t]*#"))
(nth 4 (syntax-ppss)))))
syntax-ppss
menyediakan?parse-partial-sexp
.syntax-ppss
akan mengarahkan Anda keparse-partial-sexp
, yang terakhir akan memberi Anda deskripsi semua hal yang dikembalikan oleh fungsi-fungsi ini. Semoga itu membantu untuk memulai.gunakan font-face, ini trik yang saya pelajari dari flyspell.
Saya mencoba
syntax-ppss
dua tahun lalu, itu tidak berhasil karena dua alasan:tidak bekerja di tepi komentar (batas komentar), misalnya, untuk komentar seperti
// this is comment
dalam mode c ++ -, jika Anda meletakkan kursor di atas/
karakter, hasilnya(nth 4 (syntax-ppss))
nihil.tidak bekerja sama sekali dalam mode mayor seperti mode web
Berikut adalah kode yang saya salin dari flyspell:
Harap dicatat kode dapat diperpanjang untuk mendukung mode utama baru dengan fuzz font yang cocok.
Saya telah menggunakan trik ini selama sekitar tiga tahun tanpa kegagalan. Selain itu, mengingat flyspell banyak digunakan begitu lama, saya bisa mengklaim metode ini dapat diandalkan.
Lihat Pintasan keyboard mana yang digunakan untuk menavigasi keluar dari string untuk pertanyaan serupa.
sumber
POS
menggunakan arg dan penggunaanpoint
. Lebih baik daripada memiliki dua versi seperti itu untuk membuat argPOS
opsional dan mengaturnya(point)
kapannil
.