Ricorda le modalità per i file senza estensioni


10

Ho iniziato a modificare molti file che non hanno estensioni, ma sono ancora in un formato in modalità principale.

Sono l'unico utente Emacs nel team e non voglio rendere dolorosamente ovvio che il mio editore abbia bisogno di cose speciali . Vorrei evitare di cambiare la base di codice.

  • Non riesco a cambiare il nome del file
  • Non posso usare i commenti speciali di Emacs

Vorrei che Emacs ricordasse la modalità in cui ho inserito il file manualmente per ultimo (con, diciamo M-x conf-mode) e attivare automaticamente quella modalità quando lo visito di nuovo.

Uso savehist-modeper gestire la persistenza.

Posso farlo indolore?


1
Se questo è il file che puoi modificare, in genere puoi aggiungere una prima riga con un commento: # -*- mode: conf -*-e questo suggerirebbe a Emacs di usarlo conf-mode. Se ce ne sono pochi e puoi abbinarli tramite l'espressione regolare, puoi aggiungere regexp a automode-alist.
wvxvw,

2
@wvxvw una delle mie limitazioni è che " Non posso usare i commenti speciali di Emacs ".
PythonNut,

2
Ahi, scusa, non capisco come mi sia perso. Inoltre, è auto-mode-alistmio male.
wvxvw,

Chiaramente la risposta corretta qui è far sì che il resto della tua squadra usi Emacs. Qualsiasi altra risposta è solo una soluzione alternativa.
Malabarba,

Risposte:


13

Esistono diversi modi per identificare la modalità principale per un file che non si basa su un'estensione, vedere Scelta delle modalità di file nel manuale.

A seconda del tipo di file con cui hai a che fare, forse potresti usare il magic-mode-alist. Si noti inoltre che auto-mode-alistnon è limitato alle estensioni corrispondenti: è possibile abbinare qualsiasi parte del nome o del percorso del file.

Se i file con cui hai a che fare non sono abbastanza coerenti per tali meccanismi, un'opzione è quella di aggiungere auto-mode-alistvoci che corrispondono all'intero nome del file, o abbinare il percorso principale di alcuni progetti e chiamare una funzione personalizzata per abbinare i nomi alle modalità.

Se tutti i file in una determinata directory sono dello stesso tipo, puoi anche utilizzare una variabile directory-local per impostare la modalità. Le variabili di directory possono essere impostate nel file init anziché in un file .dir-locals - vedere Variabili di directory per i dettagli.

Aggiornare

Ecco un rapido tentativo di gestire il proprio elenco di nomi di file assoluti e modalità principali.

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

Sfortunatamente, i file sono piuttosto vagamente formattati e hanno nomi di file molto generici. Grazie per aver sottolineato i dettagli di auto-mode-alist, però. Probabilmente mi terrò magic-mode-alistnella parte posteriore della mia mente per qualcosa in futuro.
PythonNut,

4

Quanto segue, basato sul consiglio di Glucas, sembra funzionare perfettamente.

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

1
Bello. Una soluzione più elegante di quella che ho hackerato insieme. :-)
glucas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.