ทำให้ forward-sexp รู้จักบล็อกที่กำหนดโดยคำหลักไม่ใช่แค่วงเล็บ


10

ในภาษา (Julia) ที่มีบล็อกที่กำหนดโดยคำหลักเช่นfor..end, begin..endเช่นเดียวกับวงเล็บสิ่งที่เป็นวิธีที่ดีที่จะข้ามเช่นบล็อกหรือไม่? นอกจากนี้endไม่เพียง แต่เป็นคำหลักบล็อก แต่ยังเป็นตัวระบุที่ถูกต้องที่ใช้ในสถานที่อื่น

วิธีหนึ่งคือค้นหา regex เริ่มต้น / ปิดบล็อกและข้ามสายอักขระข้อคิดเห็นและends ฯลฯ ทั้งหมด แต่สิ่งนี้ค่อนข้างไม่มีประสิทธิภาพและน่าเกลียดเล็กน้อย

มีวิธีในการแยกวิเคราะห์ไวยากรณ์ของ emacs เองหรือไม่รู้จักคำหลักบล็อกดังกล่าวเพื่อที่forward/backward-sexpจะทำงานโดยอัตโนมัติและเพื่อให้หนึ่งสามารถบอกจุดเริ่มต้นของบล็อกปัจจุบันได้อย่างรวดเร็วจากการส่งออกของเช่นsyntax-ppss?

[หมายเหตุ: ฉันไม่รังเกียจที่จะแยกไฟล์ด้วยตัวเอง แต่ในกรณีนี้ฉันยังอยากรู้ว่าตัวแยกวิเคราะห์ของฉันควรเสียบเข้ากับ emacs ที่เหลืออย่างไร]


1
คุณสามารถดูruby-modeสิ่งที่คล้ายกับทับทิม อีกทางเลือกหนึ่งคือการติดตั้งsmartparensแต่ก็มีการกำหนดค่าพิเศษสำหรับโหมดrubyซึ่งคุณสามารถใช้เป็นจุดเริ่มต้นได้
Iqbal Ansari

คำตอบ:


9

คุณสามารถดูห้องสมุดในตัวSMIE (ย่อมาจาก Simple-Minded Indentation Engine) แม้จะมีชื่อการเยื้องเป็นเพียงหนึ่งในคุณสมบัติที่มีให้ นี่คือวิธีการที่ใช้ในหลาย ๆ โหมด (รวมruby-modeถึงที่กล่าวถึงในความคิดเห็น) เพื่อให้การเคลื่อนไหวและการเยื้องของ sexp

การปรับใช้ SMIE สำหรับภาษานั้นเป็นงานสองขั้นตอนคร่าวๆ:

  • กำหนดไวยากรณ์สำหรับภาษาของคุณพร้อมกับโทเค็นระบุ lexer;
  • กำหนดกฎการเยื้อง

เพื่อจุดประสงค์ของคุณเฉพาะขั้นตอนแรกเท่านั้นที่จำเป็น!

โดยรวม parser กำหนดวิธีนี้ปลั๊กอย่าง emacs ตัวอย่างเช่นshow-parensจะเน้นการแสดงออกที่คล้ายกับการเลียนแบบที่กำหนดไว้ในไวยากรณ์ SMIE (อย่างน้อยก็เพียงพอในเวอร์ชั่นล่าสุดของ emacs)

โปรดทราบว่าคุณจะยังไม่สามารถใช้syntax-ppssเพื่อรับข้อมูลเกี่ยวกับสภาพแวดล้อมที่ปิดล้อมเนื่องจากจะให้ผลลัพธ์ของตัวแยกวิเคราะห์ตารางไวยากรณ์เท่านั้น แต่ฟังก์ชั่นการเคลื่อนไหว sexp (ตัวอย่างเช่นup-listตามด้วยbackward-sexp) สามารถทดแทนได้


2

ฉันทำห้องสมุดสำหรับสิ่งนี้

เมื่อกำหนดแล้วจะมีคำสั่งมากมายให้ใช้เดินหน้าเดินถอยหลังคัดลอกและอื่น ๆ

การกำหนด --in หลอกโค้ด -:

(put 'MY-FORM 'beginning-op-at
           (lambda () MY-FORWARD-MOVE-CODE))

(put 'MY-FORM 'end-op-at
     (lambda () MY-BACKWARD-MOVE-CODE))

เมื่อดำเนินการเสร็จแล้วควรพร้อมใช้งานเช่นคัดลอกและส่งคืนเช่นนี้

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.