Cách thích hợp để bật chế độ nhỏ


24

Tôi có chế độ foo và sẽ kích hoạt chế độ thanh phụ cho nó. Vì vậy, cách nào là phổ biến hơn và thích hợp hơn?

Một

(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

• biến thể C, nhưng chức năng được đẩy lên thượng nguồn

E

• biến thể C, nhưng chức năng được lưu trữ trong công thức của plugin


4
Xin chào @Netsu, tôi nhận thấy bạn đã thêm lại trích dẫn tôi đã xóa khỏi lambda của bạn. Nói chung, có hại khi trích dẫn lambdas, vì vậy Stefan và tôi chỉ đang cố gắng thúc đẩy các thực hành tốt. :-)
Malabarba

Câu trả lời:


26

Nó phụ thuộc vào (các) phiên bản Emacs bạn đang sử dụng (hoặc nhắm mục tiêu). Nếu bạn đang sử dụng độc quyền Emacs 24+ thì bạn có thể sử dụng biến thể A một cách an toàn:

* 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.

Đó là từ tệp TIN, nhưng theo nhận xét, nên sử dụng trích dẫn chức năng cho các ký hiệu chức năng, như vậy:

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

Nếu mã có thể cần chạy trong Emacs 23 (hoặc sớm hơn), thì tôi sẽ đi với biến thể C, vì cá nhân tôi không thích nhìn thấy các hàm ẩn danh trong các biến hook. (Tôi không chắc là tôi hiểu ý của bạn về các biến thể D & E, mind).


3
Tốt nhất bạn nên sử dụng dấu ngoặc kép cho chế độ phụ, để trình biên dịch byte có thể cảnh báo bạn nếu chế độ không được xác định.
lunaryorn

Cảm ơn. Nhưng chức năng trích dẫn vẫn cần thiết? Nó mang lại lợi thế gì? Ngoài ra nó có cần thiết cho lambdas không?
Netsu


7

Đây là một cách khác để làm điều đó có một số lợi thế, giả sử rằng bạn đang chỉnh sửa cấu hình của riêng bạn, không phải là gói mà bạn phân phối.

(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))

Ưu điểm là mọi thứ được lưu trữ trong một hook, vì vậy để vô hiệu hóa một số nội dung, bạn không phải làm remove-hookmà thay vào đó hãy nhận xét một số nội dung trong custom-foo-hookC-M-x.

Bạn thậm chí có thể viết một lệnh nhảy từ bất kỳ chế độ nào đến móc tùy chỉnh của nó.


1
Đây là (về cơ bản) biến thể C với một tên khác, nhưng tôi đồng ý rằng nó đáng được nhấn mạnh. Đây chắc chắn là cách tiếp cận tôi thực hiện khi tôi tùy chỉnh các hành vi chế độ chính trong cấu hình của riêng tôi.
phils

1
Biến thể C ngụ ý nhiều add-hookcâu lệnh cho mỗi chế độ nhỏ để bật. Tôi muốn nhấn mạnh rằng chỉ có một add-hooktuyên bố là một lợi thế.
abo-abo

Đã đồng ý. Trong đầu tôi, tôi đã dịch khá nhiều biến thể C để "xác định một chức năng tùy chỉnh cho phép chế độ" thay vì "xác định một chức năng tùy chỉnh chỉ cho phép chế độ", nhưng nhìn lại thì cái sau dường như đã có chủ ý. Như bạn nói, nó phụ thuộc vào việc mã đó có được sử dụng cho mục đích cá nhân hay không.
phils 14/12/14

7

Tại sao bạn lại định nghĩa một lệnh mới thực hiện chính xác những gì bar-minor-mode?

Bắt đầu với 24.1, tất cả những thứ này hoàn toàn tương đương, vì vậy chỉ cần sử dụng cái ít dư thừa: tùy chọn A

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

1
Là giải pháp an toàn? Ý tôi là nếu một trong các chế độ cha của foo-mode-hook có cùng hook thì chế độ thanh phụ sẽ gọi hai lần, do đó sẽ bị vô hiệu hóa. Hành vi bất ngờ.
Netsu

2
@Netsu có, gọi một chức năng chế độ nhỏ không có đối số ENABLES chế độ nhỏ vô điều kiện.
Malabarba

4
@Malabarba Chỉ kể từ Emacs 24. Trong các phiên bản trước, nó thực sự sẽ chuyển chế độ.
lunaryorn

1
@lunaryorn Vâng, đó là lý do tại sao câu trả lời của phils tốt hơn. :-) Tôi đã quá lười biếng để sửa lỗi của tôi.
Malabarba
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.