คุณจะอัพเดทคำจำกัดความของโหมดรองได้อย่างไรขณะที่พัฒนาขึ้นมา?


13

ฉันเริ่มเขียนโค้ดโหมดย่อยเพื่อให้การป้อนคีย์บางอย่าง ความพยายามเริ่มต้นของฉันมีการพิมพ์ผิด:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(([b] . 'previous-line)))

ผมตั้งใจว่าจะใช้bที่สำคัญและตระหนักได้ทันทีว่าฉันควรจะได้นำมาใช้แทน"b" [b]ดังนั้นฉันจึงนิยามโหมดย่อยใหม่:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(("b" . 'previous-line)))

อย่างไรก็ตามสิ่งนี้ไม่ได้ผล สิ่งนี้ทำให้ฉันตกอยู่ในการไล่ล่าห่านป่าผ่านวิธีการต่างๆของกุญแจที่มีผลผูกพัน (เช่น, (kbd ... ), [... ], ฯลฯ ) ในที่สุดฉันก็รู้ว่าเพียงแค่การประเมิน(define-minor-mode ...)รูปแบบใหม่นั้นไม่ได้เปลี่ยนแปลงอะไรเลยฉันติดอยู่กับแผนที่หลักดั้งเดิมที่แตกหัก ฉันลองเปลี่ยน keymap โดยตรงผ่านทาง(define-key borked-mode-map ...)และยังไม่สามารถโหลด keymap ที่แก้ไขได้ ในที่สุดฉันก็เริ่ม Emacs ใหม่และโหมดรองของฉันโหลดอย่างถูกต้อง

คำถามของฉันคือคุณจะปรับปรุงคำจำกัดความโหมดรองในขณะที่คุณพัฒนามันได้อย่างไร? มีวิธีการล้างคำจำกัดความที่เสียหายหรือไม่หรือคุณต้องรีสตาร์ท emacs เพื่อล้างบิตที่ใช้งานไม่ได้?

คำตอบ:


11

ครั้งแรกที่คุณประเมินdefine-minor-modeมันจะกำหนดตัวแปรborked-mode-mapด้วยการเชื่อมโยงคีย์ที่คุณระบุ อย่างไรก็ตามเมื่อกำหนดสัญลักษณ์นั้นแล้วการประเมินของคุณdefine-minor-modeจะไม่เปลี่ยนแปลง

คุณสามารถลบborked-mode-xxxสัญลักษณ์ต่างๆ โดยใช้uninternแล้วประเมินรหัสของคุณใหม่ ลอง:

(unintern 'borked-mode-map)

คุณอาจสนใจที่จะขยายdefine-minor-modeมาโครเพื่อดูว่ามันทำอะไรอยู่ M-x pp-macroexpand-last-sexpจุดใส่ในตอนท้ายและโทร สิ่งนี้จะเปิดบัฟเฟอร์ใหม่ที่แสดงแมโครที่ขยาย คุณจะเห็นการdefvarโทรที่ใช้ในการตั้งค่าตัวแปรโหมดของคุณ หากคุณอ่านความช่วยเหลือสำหรับdefvarคุณจะเห็นว่ามีการใช้ค่าเริ่มต้นหากสัญลักษณ์ที่กำหนดไว้เป็นโมฆะ - เมื่อมีอยู่การdefvarโทรที่ตามมาจะไม่เปลี่ยนค่าของมัน


13

ผมคิดว่าคำตอบที่ดีที่สุดที่ฉันสามารถให้คุณคือการอยู่ห่างจาก "keybindings อินไลน์มี" define-minor-modeของ ใช้

(defvar borked-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map [b] 'previous-line)
    ...
    map))

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  :global nil
  ...)

แทน. จากนั้นคุณสามารถใช้C-M-xเพื่อประเมินคำจำกัดความเหล่านั้นอีกครั้ง


1
defvarจะได้ประเมินมูลค่าของมันอีกครั้งหลังจากC-M-x:) คุณต้องการต้องหรือแยกต่างหากdefparameter setf
wvxvw

@wvxvw ชี้ให้เห็นว่าสิ่งนี้ไม่ได้แก้ไขปัญหา โค้ดตัวอย่างของคุณกำลังทำแบบเดียวกับที่define-minor-modeแมโครทำ: การเรียกdefvarเพื่อกำหนดแผนที่ การประเมินว่า defvar เป็นครั้งที่สองไม่มีผล
ลูกัส

7
@wvxvw หากคุณใช้C-M-x( eval-defun) เพื่อประเมินค่าใหม่defvarตัวแปรจะถูกอัพเดต นี่เป็นกรณีพิเศษในeval-defun; ถ้าคุณโทรeval-bufferหรือeval-regionจากนั้นค่าที่มีอยู่จะไม่เปลี่ยนแปลง
Gilles 'หยุดความชั่วร้าย' ใน

อา - นั่นดูเหมือนประเด็นสำคัญ
ลูกัส

1
โปรดทราบว่าC-M-xในdefvarฟอร์มจะอัปเดตตัวแปรโหมดแผนที่เท่านั้น คุณต้องC-M-xใช้define-minor-modeแบบฟอร์มเพื่อเปลี่ยนแผนที่ 'ติดตั้ง' ในโหมดรอง ฉันพยายามหาสาเหตุด้วยการขยายมาโคร แต่มันเกินกว่าฉัน
ไทเลอร์

0

คุณสามารถกำหนดโหมดแผนที่ของคุณดังนี้:

(defvar dnd-mode-map
  (let ((map (make-sparse-keymap)))
    (prog1 map
      (define-key map "q" 'dnd-quit)
      (when (eq this-command 'eval-defun)
        (let ((mmap (assq 'dnd-mode minor-mode-map-alist)))
          (when mmap
            (setcdr mmap map)))))))

ตอนนี้คุณสามารถที่จะประเมินความละเอียดแผนที่โดยใช้โดยอัตโนมัติและจะปรับปรุงภายในแผนที่ที่เก็บไว้eval-defunminor-mode-map-alist

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