2012-12-19 30 views
12

Tôi tìm thấy this question phần nào về chủ đề, nhưng có cách nào [trong emac] để đặt chế độ phụ (hoặc danh sách) dựa trên số mở rộng ? Ví dụ, nó rất dễ dàng để tìm ra rằng chế độ lớn có thể được thao tác như vậyChế độ tự động tối thiểu Emacs dựa trên phần mở rộng

(setq auto-mode-alist 
    (cons '("\\.notes$" . text-mode) 
     auto-mode-alist)) 

và những gì tôi tưởng muốn để có thể làm là

(setq auto-minor-mode-alist 
    (cons '("\\.notes$" . auto-fill-mode) 
     auto-minor-mode-alist)) 

Các chấp nhận câu trả lời của các liên kết câu hỏi đề cập đến móc, cụ thể là temp-buffer-setup-hook. Để sử dụng, bạn cần phải thêm một chức năng để móc như vậy

(add-hook 'temp-buffer-setup-hook 'my-func-to-set-minor-mode) 

Câu hỏi của tôi là hai lần:

  1. Có một cách dễ dàng hơn để làm điều này, tương tự như chế độ chính?
  2. Nếu không, làm cách nào để viết chức năng cho móc?
    1. Cần kiểm tra đường dẫn tệp đối với cụm từ thông dụng.
    2. Nếu nó khớp, hãy kích hoạt chế độ mong muốn (ví dụ: auto-fill-mode).

yếu ớt và buggy nỗ lực một giải pháp:

; Enables the given minor mode for the current buffer it it matches regex 
; my-pair is a cons cell (regular-expression . minor-mode) 
(defun enable-minor-mode (my-pair) 
    (if (buffer-file-name) ; If we are visiting a file, 
     ; and the filename matches our regular expression, 
     (if (string-match (car my-pair) buffer-file-name) 
     (funcall (cdr my-pair))))) ; enable the minor mode 

; used as 
(add-hook 'temp-buffer-setup-hook 
      (lambda() (enable-minor-mode ("\\.notes$" . auto-fill-mode)))) 
+1

Khi bạn nhìn vào 'Ch v auto-mode-alist', các phần mở rộng thường được viết như ' " \\ \\ ghi chú'"' . Xem trích dẫn * đơn * cuối cùng. –

+0

Tôi sẽ bị nguyền rủa. Bỏ lỡ điều đó khi tôi đang làm kiểu. Có lẽ chính xác giải thích các dấu gạch chéo ngược điều -_- –

Trả lời

11

Mã này dường như để cung cấp cho những gì bạn muốn:

(defvar auto-minor-mode-alist() 
    "Alist of filename patterns vs correpsonding minor mode functions, see `auto-mode-alist' 
All elements of this alist are checked, meaning you can enable multiple minor modes for the same regexp.") 
(defun enable-minor-mode-based-on-extension() 
    "check file name against auto-minor-mode-alist to enable minor modes 
the checking happens for all pairs in auto-minor-mode-alist" 
    (when buffer-file-name 
    (let ((name buffer-file-name) 
      (remote-id (file-remote-p buffer-file-name)) 
      (alist auto-minor-mode-alist)) 
     ;; Remove backup-suffixes from file name. 
     (setq name (file-name-sans-versions name)) 
     ;; Remove remote file name identification. 
     (when (and (stringp remote-id) 
       (string-match-p (regexp-quote remote-id) name)) 
     (setq name (substring name (match-end 0)))) 
     (while (and alist (caar alist) (cdar alist)) 
     (if (string-match (caar alist) name) 
      (funcall (cdar alist) 1)) 
     (setq alist (cdr alist)))))) 

(add-hook 'find-file-hook 'enable-minor-mode-based-on-extension) 

Lưu ý: việc so sánh được thực hiện với string-match-p theo cài đặt case-fold-search trong khi so sánh.

+0

Tôi hiểu hầu hết những gì đang xảy ra ở đây, mặc dù tôi nhận được một lỗi> regexp không hợp lệ: "Trailing dấu chéo ngược"

+0

Không biết làm thế nào, không biết tại sao, nhưng tất cả đều hoạt động ngay bây giờ. Cảm ơn!! –

+0

Trong 'files.el: set-auto-mode',' auto-mode-alist' được tìm kiếm với '(assoc-default name auto-mode-alist 'string-match)'. Điều này có thể đơn giản hóa và thay thế vòng lặp while của bạn. –

2

Câu trả lời của Trey Jackson có vẻ là một giải pháp rất mạnh mẽ và có thể mở rộng, nhưng tôi đang tìm kiếm một thứ đơn giản hơn. Các mã sau đây sẽ cho phép hư cấu hmmm-mode khi chỉnh sửa .hmmm file:

(add-hook 'find-file-hook 
      (lambda() 
      (when (string= (file-name-extension buffer-file-name) "hmmm") 
       (hmmm-mode 1)))) 
Các vấn đề liên quan