วิธีที่เหมาะสมในการเปิดใช้งานโหมดรอง


24

ฉันมีโหมดฟูและจะเปิดใช้งานโหมดบาร์เล็ก ๆ น้อย ๆสำหรับมัน ดังนั้นวิธีใดที่ใช้กันทั่วไปและเป็นที่นิยมมากกว่า?

A

(add-hook 'foo-mode-hook 'bar-minor-mode)

B

(add-hook 'foo-mode-hook (lambda ()
                           "Turn on `bar-minor-mode' mode."
                           (bar-minor-mode 1)))

C

(defun bar-minor-mode-on ()
  "Turn on `bar-minor-mode' mode."
  (interactive)
  (bar-minor-mode 1))

(add-hook 'foo-mode-hook 'bar-minor-mode-on)

D

•ตัวแปร C แต่ฟังก์ชั่นผลักไปที่ต้นน้ำ

E

•ตัวแปร C แต่ฟังก์ชั่นเก็บไว้ในสูตรของปลั๊กอิน


4
สวัสดี @Netsu ฉันสังเกตเห็นว่าคุณได้เพิ่มการอ้างอิงที่ฉันลบออกจากแลมบ์ดาแล้ว โดยทั่วไปมันเป็นอันตรายต่อการอ้างอิง lambdas ดังนั้น Stefan และฉันจึงพยายามกระตุ้นการปฏิบัติที่ดี :-)
Malabarba

คำตอบ:


26

ขึ้นอยู่กับรุ่นของ Emac ที่คุณใช้ (หรือการกำหนดเป้าหมาย) Iff คุณใช้ Emacs 24+ โดยเฉพาะจากนั้นคุณสามารถใช้ชุด A:

* Incompatible Lisp Changes in Emacs 24.1

** Passing a nil argument to a minor mode function call now ENABLES
the minor mode unconditionally.  This is so that you can write e.g.

 (add-hook 'text-mode-hook 'foo-mode)

to enable foo-mode in Text mode buffers, removing the need for
`turn-on-foo-mode' style functions.  This affects all mode commands
defined by `define-minor-mode'.  If called interactively, the mode
command still toggles the minor mode.

มาจากไฟล์ NEWS แต่ตามความคิดเห็นเป็นแนวปฏิบัติที่ดีในการใช้ฟังก์ชั่นการอ้างอิงสำหรับสัญลักษณ์ฟังก์ชันดังนี้:

 (add-hook 'text-mode-hook #'foo-mode)

หากรหัสอาจต้องทำงานภายใต้ Emacs 23 (หรือรุ่นก่อนหน้า) แล้วฉันจะไปกับตัวแปร C เพราะส่วนตัวฉันไม่ชอบเห็นฟังก์ชั่นที่ไม่ระบุชื่อในตัวแปรเบ็ด (ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณหมายถึงโดยตัวแปร D & E, ใจ)


3
คุณควรใช้คำพูดฟังก์ชั่นสำหรับโหมดรองเพื่อให้คอมไพเลอร์ไบต์สามารถเตือนคุณหากโหมดไม่ได้กำหนด
Lunaryorn

ขอบคุณ แต่ฟังก์ชั่นการอ้างถึงยังจำเป็น? มันให้ประโยชน์อะไรบ้าง? ยังจำเป็นสำหรับ lambdas ด้วยหรือไม่?
Netsu


7

ต่อไปนี้เป็นอีกวิธีในการทำสิ่งที่มีข้อดีคือสมมติว่าคุณกำลังแก้ไขการกำหนดค่าของคุณเองไม่ใช่แพ็คเกจที่คุณเผยแพร่

(add-hook 'foo-mode-hook
          #'custom-foo-hook)

(defun custom-foo-hook ()
  (bar-minor-mode 1)
  (baz-minor-mode 1)
  ;; ...
  (define-key foo-mode-map "C-c C-b" #'foobar))

ข้อดีคือทุกอย่างที่ถูกเก็บไว้ในหนึ่งเบ็ดเพื่อที่จะปิดการใช้งานสิ่งบางอย่างที่คุณไม่ต้องทำremove-hookแต่แทนที่จะแสดงความคิดเห็นในสิ่งบางอย่างและcustom-foo-hookC-M-x

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


1
นี่คือตัวแปร C ที่มีชื่อแตกต่างกัน แต่ฉันยอมรับว่ามันคุ้มค่าที่จะเน้นย้ำ นี่เป็นวิธีที่ฉันใช้เมื่อฉันปรับแต่งพฤติกรรมของโหมดหลักในการกำหนดค่าของฉันเอง
phils

1
Variant C หมายถึงadd-hookคำสั่งหลายรายการสำหรับแต่ละโหมดรองเพื่อเปิดใช้งาน ฉันต้องการเน้นย้ำว่าการมีเพียงadd-hookคำสั่งเดียวเป็นข้อได้เปรียบ
abo-abo

ตกลง ในหัวของฉันฉันแปลสวยมากตัวแปร C ถึง "กำหนดฟังก์ชั่นที่กำหนดเองซึ่งจะช่วยให้โหมด" มากกว่า "กำหนดฟังก์ชั่นที่กำหนดเองซึ่งเพียง แต่ช่วยให้โหมด" แต่ในการหวนกลับหลังดูเหมือนจะได้รับความตั้งใจ อย่างที่คุณพูดมันขึ้นอยู่กับว่ารหัสนั้นมีไว้สำหรับใช้ส่วนตัวหรือไม่
phils

7

ทำไมคุณต้องกำหนดคำสั่งใหม่ที่ทำในสิ่งที่แน่นอนbar-minor-mode?

เริ่มต้นด้วย 24.1 สิ่งเหล่านี้เทียบเท่าทั้งหมดดังนั้นเพียงใช้ตัวเลือกที่ซ้ำซ้อนน้อยกว่า: ตัวเลือกA

(add-hook 'foo-mode-hook #'bar-minor-mode)

1
มันปลอดภัยหรือไม่? ฉันหมายถึงว่าหนึ่งในโหมดหลักของfoo-mode-hookมี hook เดียวกันกว่าbar-minor-modeจะเรียกสองครั้งดังนั้นจะถูกปิดใช้งาน พฤติกรรมที่ไม่คาดคิด
Netsu

2
@Netsu ใช่การเรียกใช้ฟังก์ชันโหมดรองโดยไม่มีอาร์กิวเมนต์เปิดใช้งานโหมดย่อยโดยไม่มีเงื่อนไข
Malabarba

4
@Malabarba เฉพาะของ Emacs 24. ในเวอร์ชันก่อนหน้านี้มันจะสลับโหมด
Lunaryorn

1
@lunaryorn Yes, that's why phils' answer is better. :-) I was being too lazy to fix mine.
Malabarba
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.