2012-12-19 21 views
12

ho trovato un po 'this question sul tema, ma c'è un modo [in Emacs] per impostare un modo minore (o una lista di esso) sulla base di estensione? Ad esempio, è abbastanza facile per scoprire che i principali modi possono essere manipolati in questo modoEmacs auto-minor-mode in base all'estensione

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

e quello che mi piacerebbe idealmente piace essere in grado di fare è

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

La accettare risposta del collegato la domanda menziona i ganci, in particolare temp-buffer-setup-hook. Per utilizzare questo, si deve aggiungere una funzione al gancio in questo modo

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

La mia domanda è duplice:

  1. C'è un modo più semplice per fare questo, simile alle principali impostazioni?
  2. In caso contrario, come si scrive la funzione per il gancio?
    1. È necessario controllare il percorso del file rispetto a un'espressione regolare.
    2. Se corrisponde, attivare la modalità desiderata (ad esempio auto-fill-mode).

debole e buggy tentativo di soluzione:

; 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

Quando si guarda a 'Ch v auto-mode-alist', le estensioni sono di solito realizzate come' "\\ note \\ '" ' . Vedi l'ultima * singola * citazione. –

+0

Sarò dannato. Mi è mancato quando stavo facendo il tipo. Probabilmente spiega esattamente la trailing backdown thing -_- –

risposta

11

Questo codice sembra dare ciò che si vuole:

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

Nota: il confronto viene fatto con string-match-p che segue le impostazioni case-fold-search durante il confronto.

+0

Capisco gran parte di cosa sta succedendo qui, anche se sto ricevendo un errore> espressione regolare non valida: "Trailing backslash"

+0

Non so come, non so perché, ma tutto funziona ora. Grazie!! –

+0

In 'files.el: set-auto-mode', 'auto-mode-alist' viene cercato con' (assoc-default nome auto-mode-alist' string-match) '. Questo potrebbe semplificare e sostituire il tuo ciclo while. –

2

La risposta di Trey Jackson sembra essere una soluzione molto robusta ed estendibile, ma cercavo qualcosa di più semplice. Il seguente codice consentirà l'immaginario hmmm-mode durante la modifica di file .hmmm:

(add-hook 'find-file-hook 
      (lambda() 
      (when (string= (file-name-extension buffer-file-name) "hmmm") 
       (hmmm-mode 1))))