Denken Sie an Modi für Dateien ohne Erweiterungen

10

Ich habe angefangen, viele Dateien zu bearbeiten, die keine Erweiterungen haben, aber immer noch im Hauptmodus vorliegen.

Ich bin der einzige Emacs-Benutzer im Team, und ich möchte nicht schmerzlich klar machen, dass mein Editor spezielle Dinge benötigt. Ich möchte vermeiden, die Codebasis zu ändern.

  • Ich kann den Dateinamen nicht ändern
  • Ich kann keine speziellen Emacs-Kommentare verwenden

Ich möchte, dass Emacs sich daran erinnert, in welchen Modus ich die Datei zuletzt manuell versetzt habe (z. B. mit M-x conf-mode) und diesen Modus automatisch aktiviert, wenn ich sie erneut besuche.

Ich benutze savehist-mode, um mit Beharrlichkeit umzugehen.

Kann ich das schmerzlos machen?

PythonNut
quelle
1
Wenn dies die Datei ist, die Sie bearbeiten können, können Sie normalerweise eine erste Zeile mit einem Kommentar hinzufügen : # -*- mode: conf -*-, und das würde Emacs zur Verwendung verleiten conf-mode. Wenn es nur wenige davon gibt und Sie sie über reguläre Ausdrücke abgleichen können, können Sie den regulären Ausdruck hinzufügen automode-alist.
wvxvw
2
@wvxvw Eine meiner Einschränkungen ist, dass " ich keine speziellen Emacs-Kommentare verwenden kann ".
PythonNut
2
Autsch, sorry, ich verstehe nicht, wie ich das verpasst habe. Es ist auto-mode-alistauch mein schlechtes.
wvxvw
Die richtige Antwort hier ist eindeutig, den Rest Ihres Teams dazu zu bringen, Emacs zu verwenden. Jede andere Antwort ist nur eine Problemumgehung.
Malabarba

Antworten:

13

Es gibt verschiedene Möglichkeiten, den Hauptmodus für eine Datei zu ermitteln, die nicht auf einer Erweiterung basiert. Weitere Informationen finden Sie unter Auswählen von Dateimodi im Handbuch.

Abhängig von der Art der Dateien, mit denen Sie sich befassen, können Sie möglicherweise die verwenden magic-mode-alist. Beachten Sie auch, dass dies auto-mode-alistnicht auf übereinstimmende Erweiterungen beschränkt ist: Sie können einen beliebigen Teil des Dateinamens oder Pfads abgleichen.

Wenn die Dateien, mit denen Sie sich befassen, für diese Mechanismen nicht konsistent genug sind, können Sie auto-mode-alistEinträge hinzufügen , die mit dem gesamten Dateinamen oder dem Stammpfad eines Projekts übereinstimmen, und eine benutzerdefinierte Funktion aufrufen, um Namen mit Modi abzugleichen.

Wenn alle Dateien in einem bestimmten Verzeichnis vom gleichen Typ sind, können Sie auch eine verzeichnislokale Variable verwenden, um den Modus festzulegen. Verzeichnisvariablen können in Ihrer Init-Datei und nicht in einer DIR-Locals-Datei festgelegt werden. Weitere Informationen finden Sie unter Verzeichnisvariablen .

Aktualisieren

Hier ist ein kurzer Versuch, Ihre eigene Liste absoluter Dateinamen und Hauptmodi zu verwalten.

(defvar my-custom-mode-alist '())
(defvar my-custom-mode-alist-file (expand-file-name "custom-file-assoc" user-emacs-directory))

;; command to save the file->mode association of the current buffer
(defun save-file-mode-association ()
  (interactive)
  (when buffer-file-name
    (add-to-list 'my-custom-mode-alist (cons buffer-file-name major-mode))
    (write-custom-mode-alist my-custom-mode-alist-file)))

(defun write-custom-mode-alist (file)
  (with-current-buffer (get-buffer-create " *Custom File Assocations*")
    (goto-char (point-min))
    (delete-region (point-min) (point-max))
    (pp my-custom-mode-alist (current-buffer))
    (condition-case nil
        (write-region (point-min) (point-max) file)
      (file-error (message "Can't write %s" file)))
    (kill-buffer (current-buffer))
    (message "Wrote custom file associations to file %s" file)))

(defun load-custom-mode-alist (file)
  (when (file-exists-p file)
    (with-current-buffer
        (let ((enable-local-variables nil))
          (find-file-noselect file))
      (goto-char (point-min))
      (setq my-custom-mode-alist (read (current-buffer)))
      (setq auto-mode-alist (append auto-mode-alist my-custom-mode-alist))
      (kill-buffer (current-buffer)))))

;; Load any custom file associations and add them to auto-mode-alist
(load-custom-mode-alist my-custom-mode-alist-file)
Glucas
quelle
Leider sind die Dateien ziemlich locker formatiert und haben sehr generische Dateinamen. Vielen Dank, dass Sie auf die Besonderheiten von hingewiesen haben auto-mode-alist. Ich werde mich wahrscheinlich magic-mode-alistfür etwas in der Zukunft im Hinterkopf behalten.
PythonNut
4

Das Folgende, basierend auf Glucas 'Rat, scheint perfekt zu funktionieren.

(defvar file-name-mode-alist '())
;; other stuff here, of course
(setq savehist-additional-variables '(file-name-mode-alist))
(savehist-mode +1)
(setq auto-mode-alist (append auto-mode-alist file-name-mode-alist))

(add-hook 'after-change-major-mode-hook
  (lambda ()
    (when (and
            buffer-file-name
            (not
              (file-name-extension
                buffer-file-name)))
       (setq file-name-mode-alist
        (cons
          (cons buffer-file-name major-mode)
          file-name-mode-alist))
      (setq auto-mode-alist
        (append auto-mode-alist
          (list (cons buffer-file-name major-mode)))))))
PythonNut
quelle
1
Nett. Eine elegantere Lösung als die, die ich zusammen gehackt habe. :-)
Glucas