Jawaban:
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)))))
parse-partial-sexp
.
syntax-ppss
akan mengarahkan Anda ke parse-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:
(defun evilnc--in-comment-p (&optional pos)
"Test if character at POS is comment. If POS is nil, character at `(point)' is tested"
(interactive)
(unless pos (setq pos (point)))
(let* ((fontfaces (get-text-property pos 'face)))
(when (not (listp fontfaces))
(setf fontfaces (list fontfaces)))
(delq nil
(mapcar #'(lambda (f)
;; learn this trick from flyspell
(or (eq f 'font-lock-comment-face)
(eq f 'font-lock-comment-delimiter-face)))
fontfaces))))
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.
POS
menggunakan arg dan penggunaan point
. Lebih baik daripada memiliki dua versi seperti itu untuk membuat arg POS
opsional dan mengaturnya (point)
kapan nil
.
syntax-ppss
menyediakan?