Câu trả lời:
Kiểm tra giá trị * thứ tư trong danh sách được trả về bởi syntax-ppss
:
(nth 4 (syntax-ppss))
Đó là nil
nếu điểm nằm ngoài bất kỳ bình luận nào, t
nếu bên trong một bình luận không thể lồng nhau hoặc một số nguyên (độ sâu lồng nhau) nếu bên trong một bình luận lồng nhau. Xem các chuỗi parse-partial-sexp
để biết thêm chi tiết.
* Không dựa trên.
Lưu ý rằng điều này không hoạt động với chế độ Org, bạn nên sử dụng chế độ này:
(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
sẽ chỉ cho bạn parse-partial-sexp
, chuỗi sau sẽ cung cấp cho bạn một mô tả về tất cả nội dung được trả về bởi các hàm này. Hy vọng rằng sẽ giúp cho một sự khởi đầu.
sử dụng khuôn mặt phông chữ, đây là mẹo tôi học được từ flyspell.
Tôi đã thử syntax-ppss
hai năm trước, nó không hoạt động vì hai lý do:
không hoạt động trên cạnh bình luận (giới hạn bình luận), ví dụ, đối với nhận xét như // this is comment
trong chế độ c ++, nếu bạn đặt con trỏ lên /
ký tự, kết quả (nth 4 (syntax-ppss))
là không.
hoàn toàn không hoạt động ở chế độ chính như chế độ web
Đây là mã tôi đã sao chép từ 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))))
Xin lưu ý rằng mã có thể được mở rộng để hỗ trợ các chế độ chính mới bằng cách ghép mặt phông chữ phù hợp.
Tôi đã sử dụng thủ thuật này trong khoảng ba năm mà không thất bại. Bên cạnh đó, việc xem xét flyspell được sử dụng rộng rãi trong một thời gian dài, tôi có thể khẳng định phương pháp này là đáng tin cậy.
Xem phím tắt nào được sử dụng để điều hướng ra khỏi chuỗi cho câu hỏi tương tự.
POS
arg và sử dụng point
. Tốt hơn là có hai phiên bản như vậy là làm cho arg POS
tùy chọn và đặt nó thành (point)
khi nào nil
.
syntax-ppss
cung cấp?