Recordar modos para archivos sin extensiones

10

Empecé a editar muchos archivos que no tienen extensiones, pero que todavía están en un formato de modo principal.

Soy el único usuario de Emacs en el equipo, y no quiero dejar en claro que mi editor necesita cosas especiales . Me gustaría evitar cambiar la base de código.

  • No puedo cambiar el nombre del archivo
  • No puedo usar comentarios especiales de Emacs

Me gustaría que Emacs recuerde cualquier modo en el que coloque el archivo manualmente en último lugar (con, digamos M-x conf-mode) y active automáticamente ese modo cuando lo vuelva a visitar.

Yo uso savehist-modepara manejar la persistencia.

¿Puedo hacer esto sin dolor?

PythonNut
fuente
1
Si ese es el archivo que puede editar, normalmente puede agregar una primera línea con un comentario: # -*- mode: conf -*-y eso le indicaría a Emacs que lo use conf-mode. Si hay algunos de ellos y puede hacerlos coincidir mediante una expresión regular, puede agregar la expresión regular a automode-alist.
wvxvw
2
@wvxvw una de mis limitaciones es que " no puedo usar comentarios especiales de Emacs ".
PythonNut
2
Ay, lo siento, no entiendo cómo me he perdido eso. Además, es auto-mode-alistmi mal.
wvxvw
Claramente, la respuesta correcta aquí es lograr que el resto de su equipo use Emacs. Cualquier otra respuesta es solo una solución.
Malabarba

Respuestas:

13

Hay varias formas de identificar el modo principal para un archivo que no depende de una extensión, consulte Elección de modos de archivo en el manual.

Dependiendo de los tipos de archivos con los que esté tratando, quizás podría usar el magic-mode-alist. También tenga en cuenta que auto-mode-alistno se limita a las extensiones coincidentes: puede hacer coincidir cualquier parte del nombre o la ruta del archivo.

Si los archivos con los que está tratando no son lo suficientemente consistentes para esos mecanismos, una opción es agregar auto-mode-alistentradas que coincidan con el nombre completo del archivo o con la ruta raíz de algún proyecto y llamar a una función personalizada para que coincida con los nombres de los modos.

Si todos los archivos en un directorio dado son del mismo tipo, también podría usar una variable local de directorio para establecer el modo. Las variables de directorio se pueden configurar en su archivo init en lugar de en un archivo .dir-locals; consulte Variables de directorio para obtener más información.

Actualizar

Aquí hay un intento rápido de administrar su propia lista de nombres de archivos absolutos y modos principales.

(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
fuente
Desafortunadamente, los archivos tienen un formato bastante amplio y tienen nombres de archivo muy genéricos. Gracias por señalar los detalles de auto-mode-alist, sin embargo. Probablemente me quede magic-mode-alisten el fondo de mi mente para algo en el futuro.
PythonNut
4

Lo siguiente, basado en los consejos de Glucas, parece funcionar perfectamente.

(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
fuente
1
Agradable. Una solución más elegante que la que pirateé juntos. :-)
glucas