วิธีการตรวจสอบว่าจุดอยู่ในพื้นที่แสดงความคิดเห็น?


คำตอบ:


19

ตรวจสอบที่สี่*ค่าในรายการที่ส่งกลับโดยsyntax-ppss:

(nth 4 (syntax-ppss))

มันคือnilถ้าจุดอยู่นอกความคิดเห็นใด ๆtถ้าอยู่ในความคิดเห็นที่ไม่สามารถซ้อนได้หรือเป็นจำนวนเต็ม (ความลึกการซ้อน) ถ้าอยู่ในความคิดเห็นที่ซ้อนได้ ดู docstring สำหรับparse-partial-sexpรายละเอียดเพิ่มเติม

* เป็นศูนย์

โปรดทราบว่าวิธีนี้ใช้ไม่ได้กับโหมด Org คุณควรใช้สิ่งนี้:

(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ให้ไว้หรือไม่
ชื่อ

2
ใช่มันเป็นใน docstring parse-partial-sexpสำหรับ
legoscia

2
@Name: docstring สำหรับsyntax-ppssจะนำคุณไปparse-partial-sexpที่หลังซึ่งจะให้คำอธิบายของทุกสิ่งที่ส่งกลับโดยฟังก์ชั่นเหล่านี้ หวังว่าจะช่วยให้เริ่มต้น
Dan

1
ดูส่วน 34.6 "การแยกวิเคราะห์นิพจน์" ในคู่มือ Emacs Lisp
Sue D. Nymme

7

ใช้แบบอักษรหน้านี่คือเคล็ดลับที่ฉันเรียนรู้จาก flyspell

ฉันลองsyntax-ppssสองปีที่แล้วมันไม่ทำงานด้วยเหตุผลสองประการ:

  • ไม่ทำงานบนขอบของความคิดเห็น (ขีด จำกัด ของความคิดเห็น) ตัวอย่างเช่นสำหรับความคิดเห็นเช่น// this is commentในโหมด c ++ - หากคุณวางเคอร์เซอร์ไว้เหนือ/อักขระผลลัพธ์ของการ(nth 4 (syntax-ppss))เป็นศูนย์

  • ไม่ทำงานเลยในโหมดหลักเช่นโหมดเว็บ

นี่คือรหัสที่ฉันคัดลอกมาจาก 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))))

โปรดทราบว่ารหัสนี้สามารถขยายได้เพื่อรองรับโหมดหลักใหม่โดยการใช้ฟอนต์ใบหน้าที่ตรงกัน

ฉันใช้เคล็ดลับนี้ประมาณสามปีโดยไม่ล้มเหลว นอกจากนี้เมื่อพิจารณาถึงการใช้ flyspell กันอย่างแพร่หลายเป็นเวลานานฉันสามารถอ้างว่าวิธีนี้มีความน่าเชื่อถือ

ดูแป้นพิมพ์ลัดใดที่จะใช้สำหรับการนำทางออกจากสตริงสำหรับคำถามที่คล้ายกัน


1
แก้ไขเสนอรุ่นอื่นที่ใช้เวลาไม่หาเรื่องและการใช้งานPOS pointดีกว่ามีสองรุ่นดังกล่าวคือการทำให้หาเรื่องPOSตัวเลือกและตั้งค่าให้เมื่อ(point) nil
Drew
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.