คุณแสดงรายการโหมดรองที่ใช้งานอยู่ใน emac ได้อย่างไร?
คุณแสดงรายการโหมดรองที่ใช้งานอยู่ใน emac ได้อย่างไร?
คำตอบ:
C-h m
หรือM-x describe-mode
แสดงโหมดรองที่ใช้งานอยู่ทั้งหมด (และโหมดหลัก) และคำอธิบายสั้น ๆ ของแต่ละโหมด
รายชื่อของทุกคำสั่งโหมดเล็ก ๆ น้อย ๆ 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)))
หมายเหตุ: ใช้งานได้กับบัฟเฟอร์ปัจจุบันเท่านั้น (เนื่องจากโหมดรองอาจเปิดใช้งานในบัฟเฟอร์บางอย่างเท่านั้น)
boundp
แทนคุณsymbolp
สามารถกำจัดไฟล์condition-case
.
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 หรือเปิดใช้งานด้วยหน่วยความจำ
หากคุณต้องการทำบางสิ่งโดยทางโปรแกรมกับบัฟเฟอร์ทั้งหมดที่มีโหมดบางโหมดที่ใช้งานอยู่วิธีแก้ปัญหาในตัวที่ดีที่สุดเรียบง่ายที่สุดสะอาดที่สุดมีดังนี้:
(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))))
มันทำสิ่งต่อไปนี้:
buffer-list
ใช้บัฟเฟอร์ที่ใช้งานอยู่ในปัจจุบันที่ส่วนหัวของรายการ (ดังนั้นจึงถือว่าเป็นอันดับแรกโดยปกติจะเป็นสิ่งที่คุณต้องการ แต่ให้current-buffer
เว้นพารามิเตอร์ไว้หากคุณไม่สนใจ)$buf
ห่วงผ่านรายการกันชนและกำหนดชื่อบัฟเฟอร์แต่ละตัวแปรwith-current-buffer $buf
เพื่อบอก Emacs ว่าโค้ดทั้งหมดในร่างกายควรทำงานราวกับว่ามันกำลังทำงานอยู่ภายในบัฟเฟอร์$buf
แทนที่จะเป็นบัฟเฟอร์ที่คุณกำลังแสดงบนหน้าจอจริงๆwhen <some mode variable>
เป็นวิธีที่ถูกต้องในการตรวจสอบว่าเปิดใช้งานโหมดหรือไม่ คุณยังสามารถใช้if
และวิธีการอื่น ๆ ไม่ว่าจะด้วยวิธีใดเป้าหมายคือการตรวจสอบว่าตัวแปรโหมดหลักของโหมดรองหรือโหมดหลักถูกตั้งค่าไว้ในบัฟเฟอร์ เกือบทุกโหมดกำหนดตัวแปรผ่านโหมด "กำหนด" ซึ่งจะทำให้พวกเขาสร้างตัวแปรบัฟเฟอร์โลคัลโดยอัตโนมัติซึ่งตั้งชื่อตามโหมดซึ่งเป็นวิธีการทำงาน และหากไม่มีตัวแปรมาตรฐานให้ดูที่ซอร์สโค้ดของตนเองเพื่อดูว่าโค้ด "สลับ" กำหนดวิธีการเปิดและปิดได้อย่างไร 99% ของพวกเขาใช้การมีอยู่ของตัวแปรของ modename (และถ้าไม่เป็นเช่นนั้นฉันขอแนะนำให้รายงานว่าเป็นจุดบกพร่องของผู้เขียนโหมด) ตัวอย่างเช่นหากต้องการตรวจสอบว่าบัฟเฟอร์มีการใช้งานโหมดช่องว่างwhen whitespace-mode
หรือไม่สนุก! เป็นต้นไปเพื่อรหัสเสียงกระเพื่อมที่ดีขึ้นและสะอาดขึ้น!
นี่คือตัวอย่างทางเลือกง่ายๆที่คล้ายกับวิธีการบางอย่างที่ได้ระบุไว้แล้วในคำตอบอื่น ๆ :
(delq nil
(mapcar
(lambda (x)
(let ((car-x (car x)))
(when (and (symbolp car-x) (symbol-value car-x))
x)))
minor-mode-alist))