Làm thế nào để tôi nhóm móc móc trên mạng?


14

Có một số thứ nhất định như hiển thị khoảng trắng theo dõi, hiển thị ranh giới bộ đệm, dấu phân cách màu cầu vồng và nhiều thứ khác tôi muốn kích hoạt trong hầu hết các chế độ hoặc đúng hơn là tất cả các chế độ liên quan đến lập trình và văn bản (vì hiển thị các khoảng trắng trong, nói ediff-mode, sẽ đụng độ với chế độ chính) thay vì sử dụng chế độ phụ toàn cầu hóa với các quy tắc ngoại lệ. Vì hầu hết các chế độ được lấy từ một trong hai prog-modehoặc text-mode, thêm chức năng được đề cập cho cả hai prog-mode-hooktext-mode-hookkhông hoạt động, tuy nhiên, có đủ các chế độ không tuân theo thông số kỹ thuật này, chẳng hạn như css-modehoặc LaTeX-mode.

Tôi muốn xác định một hook bao gồm tất cả các chế độ này trong thời gian hiện tại để chỉ thêm các chức năng vào một hook. Hãy gọi nó non-special-mode-hook(để phân biệt với nó special-mode-hook). Làm thế nào tôi có thể tạo ra một cái móc như vậy được chạy cho tất cả các chế độ chính mà nó được tạo ra?


Câu trả lời:


19

Chỉ cần nhóm các cài đặt đó lại với nhau thành một hàm và thêm chức năng đó vào tất cả các hàm hook có liên quan:

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

Không có cách nào khác để làm điều này sẽ ngắn gọn hơn: bất cứ điều gì xảy ra, ở đâu đó bạn sẽ có một danh sách trắng hoặc danh sách đen các chế độ. Trong thực tế, bạn sẽ chỉ tìm thấy một vài chế độ cần thêm vào danh sách, vì vậy tôi khuyên bạn chỉ nên giữ mọi thứ đơn giản.

Trong cấu hình của riêng tôi, tôi sử dụng chính xác thủ thuật này để thống nhất cấu hình của một số chế độ định hướng lisp.


Cảm ơn bạn, tôi nghĩ rằng tôi cũng sẽ điều chỉnh giải pháp này cho các nhóm hữu ích khác (chẳng hạn như những nhóm lispy).
wasamasa

1
Đó chính xác là những gì tôi tự làm: github.com/purcell/emacs.d/blob/ trên
sanityinc

1
Tuyệt vời, bạn có thể thêm URL vào câu trả lời của mình không? Tôi tin rằng đoạn trích được tô sáng không chỉ giải thích cách sử dụng thực tế rất tốt mà còn thể hiện việc sử dụng thêm, chẳng hạn như sử dụng "hook" liên quan đến Emacs Lisp như một tập hợp con của "hook" lớn hơn và cách người ta tự động tạo tên hook từ các chế độ chính hiện có với derived-mode-hook-name.
wasamasa

Tôi thích điều này hơn của tôi, chỉ cho (dolist ...)vs (add-hook ...)<lặp lại>. Tôi chỉ gắn bó với tôi khi tách riêng các thay đổi chế độ (tệp trên mỗi chế độ use-package,, el-get). Cả hai đều là giải pháp tất cả trong một nơi, nhưng từ các quan điểm khác nhau.
Jonathan Leech-Pepin

Xin lưu ý rằng nếu bạn không cung cấp một APPENDđối số không phải add-hookở đây thì các hook sẽ được gọi theo thứ tự ngược từ thứ tự danh sách bạn cung cấp. Không có gì sai với điều đó; chỉ cần nhận thức được nó, trong trường hợp thứ tự quan trọng.
vẽ

5

Bạn có thể thêm một chức năng để after-change-major-mode-hookkiểm tra xem chế độ mới có phải là một chế độ thú vị (có thể thông qua (not (derived-mode-p 'special-mode))) hay không và nếu chạy non-special-mode-hook.


Điều này nghe có vẻ khá tiện lợi (một khi người ta đã tìm ra tất cả các chế độ "không đặc biệt" vì có một số chỉ sử dụng fundamental-mode, nhưng làm nhiều hơn là chỉ hiển thị văn bản), nhưng hơi kỳ diệu theo sở thích của tôi. Do đó upvote.
wasamasa

4

Tôi thấy mình thường xuyên thực hiện mô hình bao bọc các cài đặt và kích hoạt chế độ nhỏ của @ sanityinc trong một defun và lặp qua các móc để gọi nó, nhưng tôi muốn một cách tiếp cận sạch hơn nên tôi đã viết macro này:

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

Lưu ý: Tôi dash.elvì sự sạch sẽ nhưng nó có thể dễ dàng được điều chỉnh để sử dụng (dolist).

Sau đó, bạn có thể xác định các chế độ được nhóm thành các biến danh sách và sử dụng nó như sau:

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

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

1
Lưu ý rằng ở đây bạn có thể sử dụng derived-mode-hook-nameđể lấy tên của biến hook của chế độ, do đó tránh được internmánh khóe.
sanityinc

@sanityinc TIL derived-mode-hook-name. mẹo hay!
waymondo

1

Thay vì xác định một hook mới hoạt động cho tất cả các chế độ không dẫn xuất này, bạn có thể làm như sau.

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

Bạn vẫn sẽ cần thêm nó vào tất cả các chế độ, nhưng bằng cách xác định chức năng của bạn để bao gồm tất cả các chế độ, bạn sẽ chỉ phải thay đổi một định nghĩa khi thêm / xóa các tính năng gây nghiện.


-2

Có lẽ bạn có thể thử điều này:

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