ทำไมโหมดหลักไม่เพียงตรวจสอบใบหน้า


10

เมื่อเขียนโหมดหลักมันมักจะมีประโยชน์ที่จะรู้ว่า 'เป็นจุดในสตริง?' 'มีความคิดเห็นไหม?'

โหมดหลักส่วนใหญ่ดูเหมือนจะพยายามแยกวิเคราะห์ภาษาการเขียนโปรแกรม ตัวอย่างเช่น:

  • python-syntax-content โทร syntax-ppss
  • haskell-fill-paragraphโทรsyntax-ppssและre-search-forward
  • c-in-comment-line-prefix-p ย้ายจุดรอบ ๆ และโทร looking-at
  • sp-point-in-commentโทรsyntax-ppssแต่ยังตรวจสอบว่ามันอยู่ในขอบเขตความคิดเห็น

อย่างไรก็ตามวิธีนี้ใช้ไม่ได้ในบางกรณี ในบัฟเฟอร์โหมดองค์กรความคิดเห็นในบล็อกแหล่งตรวจไม่ถูกต้องโดยวิธีการเหล่านี้

นอกจากนี้ยังดูเหมือนไม่มีจุดหมายเนื่องจากบัฟเฟอร์แสดงความคิดเห็นแล้วที่เน้นอยู่

คุณสามารถตรวจสอบใบหน้าตรงจุดแทน:

(defun wh--get-faces (pos)
  "Get all the font faces at POS."
  (remq nil
        (list
         (get-char-property pos 'read-face-name)
         (get-char-property pos 'face)
         (plist-get (text-properties-at pos) 'face))))

(defun wh-string-p (pos)
  "Return non-nil if POS is inside a string."
  (memq 'font-lock-string-face (wh--get-faces pos)))

ทำไมโหมดหลักไม่ทำเช่นนี้? บัฟเฟอร์ได้รับการฟอนต์แล้วดังนั้นฉันคาดว่าสิ่งนี้จะเร็วขึ้นแข็งแกร่งขึ้นและต้องการรหัสน้อยลง


1
ฉันชอบคำถามนี้ อย่างไรก็ตามจะเกิดอะไรขึ้นถ้าคุณไม่ได้ใช้font-lock-mode? (ไม่ว่าฉันคิดว่าคุณควร.)
mbork

คำตอบ:


12

ปัญหาคือว่ามันไม่ได้แข็งแกร่งมากขึ้น

ประการแรกโหมดหลักคือโหมดที่รับผิดชอบในการตัดสินใจว่าอะไรคือความคิดเห็นหรือสตริง หากพวกเขาสามารถกำหนดได้สำเร็จสำหรับวัตถุประสงค์ในการล็อคแบบอักษรพวกเขาควรสามารถทำเช่นเดียวกันเพื่อวัตถุประสงค์อื่น

ประการที่สองการอ่านไวยากรณ์เพื่อกำหนดบริบทที่อยู่ภายในนั้นเป็นวิธีที่มีประสิทธิภาพมากขึ้นหากทำถูกต้อง หากคุณพบอินสแตนซ์ที่ล้มเหลวก็ควรส่งรายงานข้อผิดพลาดไปยังผู้สร้างโหมดหลัก


เหตุผลที่การตรวจสอบใบหน้านั้นมีความแข็งแรงน้อยกว่านั้นเป็นเพราะมันอาจล้มเหลวในบางสถานการณ์

  1. สำหรับผู้เริ่มต้นผู้ใช้อาจปิดใช้งานfont-lock-mode(อาจเป็นบัฟเฟอร์ขนาดใหญ่) แต่ถึงแม้จะfont-lock-modeเปิดใช้งานอยู่ใบหน้าก็ค่อนข้างไม่เสถียร

  2. นอกจากนี้ผู้ใช้อาจมีโหมดรองที่เพิ่มบางอย่างfont-lock-keywords(เช่นการเน้นTODOในความคิดเห็น) หรืออาจมีโหมดย่อยที่ใช้ใบหน้าแบบไดนามิกบางส่วนหลังจากที่ font-lock ได้ทำให้บัฟเฟอร์เป็นแบบอักษร

โดยสรุปโหมดสำคัญไม่รับประกันว่าใบหน้าที่กำหนดไว้จะเป็นใบหน้าที่ใช้งานในปัจจุบัน


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