2011-09-13 23 views
9

Tôi đã đọc một số article about well-formatted Git commits và tôi đã tự hỏi làm thế nào tôi có thể áp dụng một số quy tắc cho chế độ đăng nhập Magit.Làm cách nào để áp dụng một móc nối cho nhiều chế độ Emacs cùng một lúc?

Dường như sử dụng 3 chế độ chính đồng thời: Magit, Log, Edit.

Vậy làm cách nào để tôi chỉ nhận được các chế độ đó, khi được sử dụng cùng nhau, để tự động khó khăn ở 72 ký tự?

Trả lời

4

Chỉ có thể có một chế độ chính trong bộ đệm Emacs (trừ khi bạn đang sử dụng something like MMM or MuMaMo). Trong trường hợp của bạn là một chế độ chính là magit-log-edit-mode, có tên bao gồm ba từ ("Magit Log Edit"). Bạn chỉ có thể thêm vào đó bất cứ điều gì móc bạn thích:

(defun my-turn-on-auto-fill() 
    (setq fill-column 72) 
    (turn-on-auto-fill)) 

(add-hook 'magit-log-edit-mode-hook 'my-turn-on-auto-fill) 
+0

Hoàn hảo, cảm ơn! Như một ốp, tôi đã nhầm lẫn về các chế độ chính - mỗi người trong số họ bật ra một "trình đơn ngữ cảnh" riêng biệt trên nhấp chuột. Dù bằng cách nào, giải pháp của bạn hoạt động hoàn hảo. –

+1

Tôi đặc biệt khuyên bạn không nên thêm biểu thức 'lambda' vào móc. Một lý do là nó thực sự khó để xem những gì một cái móc chứa khi nghiên cứu nội dung của nó. Một lý do khác là khi bạn sửa đổi móc, cả phiên bản mới và mọi phiên bản cũ đều có mặt (trừ khi bạn cẩn thận tháo phiên bản cũ), điều này có thể dẫn đến các hiệu ứng thú vị. – Lindydancer

+0

@Lindydancer tôi hoàn toàn đồng ý, nhưng điều này chỉ dành cho mục đích trình diễn. Dù sao, thay đổi thành chức năng riêng biệt. –

1

Nói chung, bạn có thể xác định chức năng của riêng bạn, hãy nói my-common-hook và thêm nó vào tất cả các chế độ chính, ví dụ:

(defun my-common-hook() 
    ... do stuff ... 
    ) 
(add-hook 'one-mode-hook 'my-common-hook) 
(add-hook 'another-mode-hook 'my-common-hook) 
(add-hook 'a-third-mode-hook 'my-common-hook) 
7

Trong trả lời cho câu hỏi đã nêu ban đầu, nếu bạn có một hàm duy nhất để thêm vào nhiều biến móc, bạn có thể làm như sau:

(defun my-add-to-multiple-hooks (function hooks) 
    (mapc (lambda (hook) 
      (add-hook hook function)) 
     hooks)) 

(defun my-turn-on-auto-fill() 
    (setq fill-column 72) 
    (turn-on-auto-fill)) 

(my-add-to-multiple-hooks 
'my-turn-on-auto-fill 
'(text-mode-hook 
    magit-log-edit-mode-hook 
    change-log-mode-hook)) 

Không phải ví dụ tốt nhất, có lẽ, nhưng tôi có mething tương tự cho một số hành vi phổ biến tôi muốn kích hoạt trong chế độ lập trình, trong đó có rất nhiều nhiều hơn nữa để liệt kê.

4

Chế độ Emacs có "chế độ cơ sở" để nói chế độ bade. Ví dụ: python-mode mở rộng prog-mode tự mở rộng fundamental-mode. Tất cả các chế độ mở rộng fundamental-mode. Vì vậy, để móc python-mode cộng với c-mode nhưng không phải text-mode, bạn có thể móc prog-mode.

1

Chỉ nhìn thấy điều này ngay bây giờ, nhưng đây là những gì tôi đã làm. Kết quả cuối cùng là tôi muốn làm như sau: (hook-up-modes my-lisps 'standard-lisp-environment).

Để thực hiện việc này, tôi xác định sau defvar s.

(defvar my-lisps "clojure lisp emacs-lisp cider-repl") 
(defun standard-lisp-environment() 
    (paredit-mode 1) 
    (rainbow-delimiters-mode 1) 
    (eldoc-mode 1)) 

Tôi muốn có append lisp -mode-móc vào lisps tôi sử dụng vì vậy tôi đã điều sau đây:

(defun append-suffix (suffix phrases) 
    "take SUFFIX and append it to each of the PHRASES." 
    (mapcar #'(lambda (phrase) (concat phrase suffix)) phrases)) 

để ("clojure" "ngọng") => ("clojure -mode-hook "" lisp-mode-hook ").

Bây giờ chúng ta có thể dễ dàng có này, chúng ta cần những biểu tượng độc giả của họ, mà chúng tôi dễ dàng nhận được từ

(defun symbols-from-strings (strings) 
    "Given a list of strings, get their symbol values" 
    (mapcar #'intern strings)) 

Và rồi cuối cùng chúng tôi có các hình thức tương tự được đăng ở trên:

(defun multiple-mode-add-hook (modes hook) 
    "Given a list of x-mode-hook symbols in MODE, add the HOOK to them." 
    (mapc (lambda (mode) (add-hook mode hook)) modes)) 

Những tất cả hoạt động trên loại có ý nghĩa đối với chúng, danh sách các chuỗi, danh sách các ký hiệu blah-mode-hook, v.v. Vì vậy, bây giờ chúng ta cần một hàm người dùng tốt đẹp mà chúng ta có thể làm việc.

(defun hook-up-modes (strings hook) 
    (let ((modes (symbols-from-strings 
       (append-suffix "-mode-hook" (split-string strings))))) 
    (multiple-mode-add-hook modes hook))) 

Bây giờ điều này sẽ khá rõ ràng: Chúng tôi tạo các chế độ từ danh sách chuỗi giới hạn không gian và áp dụng móc cho nó.Ngoài ra, vì tôi đã định nghĩa một môi trường lisp tiêu chuẩn, tất cả các lisps của tôi hoạt động tương tự, và tôi có thể dễ dàng tháo móc sau nếu tôi muốn. Sau đó, mã thực sự hoạt động là cụm từ siêu đơn giản (hook-up-modes my-lisps 'standard-lisp-environment).

+0

Bắt đầu với một chuỗi thay vì một danh sách là khá lạ. Một danh sách các biểu tượng sẽ là một điểm khởi đầu bình thường hơn. Bạn có thể sử dụng 'symbol-name' để lấy chuỗi tương đương để nối với, khi xử lý. – phils

Các vấn đề liên quan