2012-12-19 13 views
12

Ich fand this question etwas über das Thema, aber gibt es einen Weg [in Emacs], um einen untergeordneten Modus (oder eine Liste davon) basierend auf Erweiterung? Zum Beispiel ist es ziemlich einfach, um herauszufinden, dass die großen Modi wie soEmacs Auto-Minor-Modus basierend auf der Erweiterung

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

und was manipuliert werden würde ich im Idealfall in der Lage sein mag, ist zu tun

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

Die akzeptieren Antwort des verknüpften Frage erwähnt Haken, speziell temp-buffer-setup-hook. Um dies zu nutzen, müssen Sie sich wie eine Funktion zum Haken hinzufügen, so

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

Meine Frage ist zweifach:

  1. Gibt es einen einfacheren Weg, dies zu tun, ähnlich zu den wichtigsten Modi?
  2. Wenn nicht, wie würde man die Funktion für den Haken schreiben?
    1. Es muss der Dateipfad gegen einen regulären Ausdruck überprüft werden. Wenn es übereinstimmt, aktivieren Sie den gewünschten Modus (z. B. auto-fill-mode).

Feeble und Buggy Versuch einer Lösung:

; 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

Wenn Sie v Blick auf 'Ch Auto-Modus-alist' werden die Erweiterungen in der Regel geschrieben als' "\\ Hinweise \\ '" ' . Siehe das letzte * einzige * Zitat. –

+0

Ich werde verdammt sein. Das habe ich verpasst, als ich den Typ gemacht habe. Wahrscheinlich genau erklärt das folgende Backslash Thing -_- –

Antwort

11

Dieser Code scheint zu geben, was Sie wollen:

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

Hinweis: Der Vergleich erfolgt mit string-match-p, die während des Vergleichs den Einstellungen case-fold-search folgt.

+0

Ich verstehe das meiste von dem, was hier vor sich geht, obwohl ich einen Fehler bekomme> Invalid regexp: "Trailing backslash"

+0

Weiß nicht wie, weiß nicht warum, aber alles funktioniert jetzt. Vielen Dank!! –

+0

In 'files.el: set-auto-mode' wird' auto-mode-alist' mit '(assoc-defaultname auto-mode-alist 'string-match)' gesucht. Dies könnte Ihre While-Schleife vereinfachen und ersetzen. –

2

Die Antwort von Trey Jackson scheint eine sehr robuste und erweiterbare Lösung zu sein, aber ich suchte nach etwas einfacherem. Der folgende Code wird die fiktive hmmm-mode aktivieren, wenn .hmmm Bearbeiten von Dateien:

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