ฉันจะ“ ขอกลุ่ม” ตะขอได้อย่างไร


14

มีบางอย่างเช่นการแสดงของช่องว่างต่อท้าย, การแสดงของขอบเขตบัฟเฟอร์, ตัวคั่นสีรุ้งและอื่น ๆ อีกมากมายที่ฉันต้องการเปิดใช้งานในโหมดส่วนใหญ่หรือมากกว่านั้นทั้งหมดที่เกี่ยวข้องกับการเขียนโปรแกรมและข้อความ (เพราะแสดงช่องว่างต่อท้ายใน พูดediff-modeจะขัดแย้งกับโหมดหลัก) แทนการใช้โหมดย่อยทั่วโลกด้วยกฎข้อยกเว้น ตั้งแต่โหมดส่วนใหญ่จะมาจากทั้งสองprog-modeหรือtext-modeเพิ่มฟังก์ชั่นในคำถามทั้งสองprog-mode-hookและtext-mode-hookไม่ทำงาน แต่มีโหมดพอที่จะไม่ได้ตามนี้เช่นหรือcss-modeLaTeX-mode

ฉันต้องการกำหนด hook ที่ครอบคลุมโหมดเหล่านี้ทั้งหมดในขณะนั้นเพื่อเพิ่มฟังก์ชั่นให้กับหนึ่ง hook เท่านั้น ลองเรียกมันว่าnon-special-mode-hook(เพื่อแยกมันออกจากspecial-mode-hook) ฉันจะสร้างเบ็ดดังกล่าวที่ทำงานสำหรับโหมดหลักทั้งหมดที่สร้างขึ้นได้อย่างไร


นอกจากนี้คุณยังสามารถเน้นช่องว่างต่อท้ายเฉพาะในบัฟเฟอร์ที่กำลังเยี่ยมชมไฟล์
Pkkm

คำตอบ:


19

เพียงจัดกลุ่มการตั้งค่าเหล่านั้นไว้ด้วยกันในฟังก์ชั่นและเพิ่มฟังก์ชั่นนั้นลงในฟังก์ชั่น hook ที่เกี่ยวข้องทั้งหมด:

(defun my-non-special-mode-setup ()
  (setq show-trailing-whitespace t)
  ...)
(dolist (hook '(prog-mode-hook text-mode-hook css-mode-hook ...))
  (add-hook hook 'my-non-special-mode-setup))

ไม่มีทางอื่นที่จะทำสิ่งนี้ได้อย่างกระชับยิ่งขึ้น: ไม่ว่าจะเกิดอะไรขึ้นที่ไหนสักแห่งที่คุณจะมีรายการที่อนุญาตหรือโหมดดำ ในทางปฏิบัติคุณจะพบเพียงไม่กี่โหมดที่ต้องเพิ่มในรายการดังนั้นฉันขอแนะนำให้ใช้วิธีง่ายๆ

ในการกำหนดค่าของฉันฉันใช้เคล็ดลับนี้เพื่อรวมการกำหนดค่าของโหมด lisp-oriented หลายอย่างเข้าด้วยกัน


ขอบคุณฉันคิดว่าฉันจะปรับแก้ปัญหานี้ให้เหมาะกับกลุ่มที่มีประโยชน์อื่น ๆ (เช่นกลุ่มที่มีปัญหา) เช่นกัน
wasamasa

1
นั่นคือสิ่งที่ฉันทำเอง: github.com/purcell/emacs.d/blob/…
sanityinc

1
เยี่ยมมากคุณสามารถเพิ่ม URL ในคำตอบของคุณได้ไหม ฉันเชื่อว่าตัวอย่างข้อมูลที่เน้นไม่เพียง แต่อธิบายการใช้งานจริงได้เป็นอย่างดี แต่ยังแสดงให้เห็นถึงการใช้งานต่อไปเช่นการใช้ "hook" ของ Emacs Lisp ที่เกี่ยวข้องกับ "hook" เป็นส่วนย่อยของ "hook" ที่ใหญ่กว่า derived-mode-hook-nameกับ
wasamasa

ฉันชอบสิ่งนี้มากกว่าของฉันเพียงเพื่อ(dolist ...)vs (add-hook ...)<repeat> ฉันจะยึดติดกับฉันเมื่อแยกการเปลี่ยนแปลงเฉพาะโหมด (ไฟล์ต่อโหมดuse-package,, el-get) ทั้งสองเป็นโซลูชั่นแบบครบวงจร แต่มาจากมุมมองที่แตกต่างกัน
Jonathan Leech-Pepin

โปรดทราบว่าหากคุณไม่ได้ระบุAPPENDอาร์กิวเมนต์ที่ไม่เป็นศูนย์ไว้add-hookที่นี่ตะขอจะถูกเรียกใช้ในลำดับย้อนกลับจากลำดับรายการที่คุณให้ไว้ ไม่มีอะไรผิดปกติกับที่; เพียงแค่ตระหนักถึงมันในกรณีที่การสั่งซื้อมีความสำคัญ
ดึง

5

คุณสามารถเพิ่มฟังก์ชั่นafter-change-major-mode-hookที่จะตรวจสอบว่าโหมดใหม่เป็นโหมดที่น่าสนใจ (อาจผ่าน(not (derived-mode-p 'special-mode))) หรือnon-special-mode-hookไม่


ฟังดูสวยดี (เมื่อมีคนคิดออกโหมด "unspecial" ทั้งหมดเนื่องจากมีไม่กี่ที่ที่ใช้เพียงfundamental-modeแต่ทำมากกว่าแค่การแสดงข้อความ) แต่เล็กน้อยเกินไปวิเศษสำหรับรสนิยมของฉัน ดังนั้นการโหวต
wasamasa

4

ฉันพบว่าตัวเองกำลังทำ @ sanityinc รูปแบบของการห่อการตั้งค่าของฉันและการเปิดใช้งานโหมดรองใน defun และวนลูปผ่าน hooks เพื่อเรียกมัน แต่ฉันต้องการวิธีที่สะอาดกว่าดังนั้นฉันจึงเขียนมาโครนี้:

(defmacro hook-modes (modes &rest body)
  (declare (indent 1))
  `(--each ,modes
     (add-hook (intern (format "%s-hook" it))
               (lambda () ,@body))))

หมายเหตุ: ฉันdash.elสำหรับความสะอาด (dolist)แต่มันได้อย่างง่ายดายปรับให้เข้ากับการใช้งาน

จากนั้นคุณสามารถกำหนดโหมดการจัดกลุ่มเป็นตัวแปรลิสต์และใช้งานได้ดังนี้:

(defvar progish-modes
  '(prog-mode css-mode sgml-mode))

(hook-modes progish-modes
  (highlight-symbol-mode)
  (highlight-symbol-nav-mode))

1
โปรดทราบว่าที่นี่คุณสามารถใช้derived-mode-hook-nameเพื่อรับชื่อตัวแปร hook ของโหมดซึ่งจะหลีกเลี่ยงinternเคล็ดลับ
sanityinc

@sanityinc derived-mode-hook-nameTIL เคล็ดลับที่ดี!
waymondo

1

แทนที่จะกำหนด hook ใหม่ที่ใช้งานได้กับโหมดที่ไม่ได้รับทั้งหมดคุณสามารถทำสิ่งต่อไปนี้

(defun run-my-hooks ()
  "Run all the following functions in the hook"
  (smartparens-mode 1)
  (whitespace-mode 1)
  (my-needed-mode 1)
  ...)

(add-hook 'specific-mode-hook 'run-my-hooks)
(add-hook 'another-mode-hook 'run-my-hooks)

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


-2

บางทีคุณสามารถลองสิ่งนี้:

(setq lisp-dialects-mode-hook '(lisp-mode-hook
                            lisp-interaction-mode-hook
                            emacs-lisp-mode-hook
                            ;; common-lisp-mode-hook
                            scheme-mode-hook
                            clojure-mode-hook
                            cider-repl-mode-hook
                            ))

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