คุณแสดงรายการโหมดรองที่ใช้งานอยู่ใน emac ได้อย่างไร?


คำตอบ:


125

C-h mหรือM-x describe-modeแสดงโหมดรองที่ใช้งานอยู่ทั้งหมด (และโหมดหลัก) และคำอธิบายสั้น ๆ ของแต่ละโหมด


21

รายชื่อของทุกคำสั่งโหมดเล็ก ๆ น้อย ๆ minor-mode-listจะถูกเก็บไว้ในตัวแปร การตรวจสอบว่ามีการใช้งานอยู่หรือไม่มักทำได้โดยการตรวจสอบตัวแปรที่มีชื่อเดียวกัน ดังนั้นคุณสามารถทำสิ่งนี้:

(defun which-active-modes ()
  "Give a message of which minor modes are enabled in the current buffer."
  (interactive)
  (let ((active-modes))
    (mapc (lambda (mode) (condition-case nil
                             (if (and (symbolp mode) (symbol-value mode))
                                 (add-to-list 'active-modes mode))
                           (error nil) ))
          minor-mode-list)
    (message "Active modes are %s" active-modes)))

หมายเหตุ: ใช้งานได้กับบัฟเฟอร์ปัจจุบันเท่านั้น (เนื่องจากโหมดรองอาจเปิดใช้งานในบัฟเฟอร์บางอย่างเท่านั้น)


add-to-list ภายในแผนที่? สับสน
jrockway

4
@jrockway ไม่ใช่ช่วงเวลาที่น่าภาคภูมิใจที่สุดของฉัน
Trey Jackson

การใช้boundpแทนคุณsymbolpสามารถกำจัดไฟล์condition-case.
Lassi

4

describe-modeสามารถสร้างรายการโหมดรองที่เปิดใช้งานได้บ้างทำไมฉันถึงทำไม่ได้? ดังนั้นหลังจากอ่านซอร์สโค้ดแล้วฉันก็รู้ว่ามันได้รับรายการโหมดรองที่ใช้งานอยู่จากทั้งสองminor-mode-listและminor-mode-alist. การใช้dash.elไลบรารีการจัดการรายการของบุคคลที่สามฉันมาพร้อมกับรหัสนี้:

(--filter (and (boundp it) (symbol-value it)) minor-mode-list)

ตัวอย่างเช่นหากต้องการปิดโหมดรองทั้งหมดให้ใช้-each:

(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
        (funcall it -1))

อย่าลืมบันทึกรายการโหมดรองในตัวแปรมิฉะนั้นคุณจะต้องรีสตาร์ท Emacs หรือเปิดใช้งานด้วยหน่วยความจำ


3

หากคุณต้องการทำบางสิ่งโดยทางโปรแกรมกับบัฟเฟอร์ทั้งหมดที่มีโหมดบางโหมดที่ใช้งานอยู่วิธีแก้ปัญหาในตัวที่ดีที่สุดเรียบง่ายที่สุดสะอาดที่สุดมีดังนี้:

(dolist ($buf (buffer-list (current-buffer)))
  (with-current-buffer $buf
    (when some-buffer-local-minor-or-major-mode-variable-you-want-to-find
      (message "x %s" $buf))))

มันทำสิ่งต่อไปนี้:

  1. ดึงข้อมูลรายการของบัฟเฟอร์ทั้งหมดโดยbuffer-listใช้บัฟเฟอร์ที่ใช้งานอยู่ในปัจจุบันที่ส่วนหัวของรายการ (ดังนั้นจึงถือว่าเป็นอันดับแรกโดยปกติจะเป็นสิ่งที่คุณต้องการ แต่ให้current-bufferเว้นพารามิเตอร์ไว้หากคุณไม่สนใจ)
  2. $bufห่วงผ่านรายการกันชนและกำหนดชื่อบัฟเฟอร์แต่ละตัวแปร
  3. ใช้with-current-buffer $bufเพื่อบอก Emacs ว่าโค้ดทั้งหมดในร่างกายควรทำงานราวกับว่ามันกำลังทำงานอยู่ภายในบัฟเฟอร์$bufแทนที่จะเป็นบัฟเฟอร์ที่คุณกำลังแสดงบนหน้าจอจริงๆ
  4. when <some mode variable>เป็นวิธีที่ถูกต้องในการตรวจสอบว่าเปิดใช้งานโหมดหรือไม่ คุณยังสามารถใช้ifและวิธีการอื่น ๆ ไม่ว่าจะด้วยวิธีใดเป้าหมายคือการตรวจสอบว่าตัวแปรโหมดหลักของโหมดรองหรือโหมดหลักถูกตั้งค่าไว้ในบัฟเฟอร์ เกือบทุกโหมดกำหนดตัวแปรผ่านโหมด "กำหนด" ซึ่งจะทำให้พวกเขาสร้างตัวแปรบัฟเฟอร์โลคัลโดยอัตโนมัติซึ่งตั้งชื่อตามโหมดซึ่งเป็นวิธีการทำงาน และหากไม่มีตัวแปรมาตรฐานให้ดูที่ซอร์สโค้ดของตนเองเพื่อดูว่าโค้ด "สลับ" กำหนดวิธีการเปิดและปิดได้อย่างไร 99% ของพวกเขาใช้การมีอยู่ของตัวแปรของ modename (และถ้าไม่เป็นเช่นนั้นฉันขอแนะนำให้รายงานว่าเป็นจุดบกพร่องของผู้เขียนโหมด) ตัวอย่างเช่นหากต้องการตรวจสอบว่าบัฟเฟอร์มีการใช้งานโหมดช่องว่างwhen whitespace-modeหรือไม่
  5. หลังจากนั้นจะส่งข้อความไปยังบัฟเฟอร์ Messages พร้อมกับ "x" และชื่อของบัฟเฟอร์ที่มีโหมดทำงานอยู่ นั่นคือที่ที่คุณจะใส่รหัสของคุณเองเพื่อทำอะไรก็ได้ที่คุณต้องการทำกับบัฟเฟอร์ที่ค้นพบ

สนุก! เป็นต้นไปเพื่อรหัสเสียงกระเพื่อมที่ดีขึ้นและสะอาดขึ้น!


2

นี่คือตัวอย่างทางเลือกง่ายๆที่คล้ายกับวิธีการบางอย่างที่ได้ระบุไว้แล้วในคำตอบอื่น ๆ :

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.