Làm thế nào để phát hiện nếu điểm nằm trong một khu vực bình luận?


15

Làm thế nào để phát hiện nếu điểm nằm trong một khu vực bình luận?

Câu trả lời:


19

Kiểm tra giá trị * thứ tư trong danh sách được trả về bởi syntax-ppss:

(nth 4 (syntax-ppss))

Đó là nilnếu điểm nằm ngoài bất kỳ bình luận nào, tnế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)))))

Hoàn hảo, có một tài liệu cho tất cả các thông tin khác syntax-ppsscung cấp?
Tên

2
Vâng, đó là trong các chuỗi cho parse-partial-sexp.
Legoscia

2
@ Tên: chuỗi doc syntax-ppsssẽ 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.
Dân

1
Xem thêm phần 34.6 "Phân tích biểu thức" trong Hướng dẫn Lisp của Emacs.
Sue D. Nymme

7

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-ppsshai 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 commenttrong 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ự.


1
Một chỉnh sửa đề xuất một phiên bản khác không có POSarg và sử dụng point. Tốt hơn là có hai phiên bản như vậy là làm cho arg POStùy chọn và đặt nó thành (point)khi nào nil.
vẽ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.