Lembre-se dos modos para arquivos sem extensões

10

Comecei a editar muitos arquivos que não têm extensões, mas ainda estão no formato principal.

Sou o único usuário do Emacs na equipe e não quero tornar dolorosamente óbvio que meu editor precisa de coisas especiais . Eu gostaria de evitar alterar a base de código.

  • Não consigo alterar o nome do arquivo
  • Não posso usar comentários especiais do Emacs

Gostaria que o Emacs se lembrasse de qualquer modo em que eu colocasse o arquivo manualmente por último (com, digamos M-x conf-mode) e ative automaticamente esse modo quando o visitar novamente.

Eu uso savehist-modepara lidar com persistência.

Posso fazer isso sem dor?

PythonNut
fonte
11
Se esse é o arquivo que você pode editar, normalmente você pode adicionar uma primeira linha com um comentário # -*- mode: conf -*-:, e isso indicaria o uso do Emacs conf-mode. Se houver alguns deles, e você puder correspondê-los por meio de expressão regular, adicione o regexp a automode-alist.
Wvxvw
2
@wvxvw uma das minhas limitações é que " não posso usar comentários especiais do Emacs ".
PythonNut
2
Ai, desculpe, eu não entendo como eu perdi isso. Além disso, é auto-mode-alistruim.
Wvxvw
Claramente, a resposta correta aqui é fazer com que o resto da sua equipe use o Emacs. Qualquer outra resposta é apenas uma solução alternativa.
Malabarba

Respostas:

13

Existem várias maneiras de identificar o modo principal de um arquivo que não depende de uma extensão, consulte Escolhendo modos de arquivo no manual.

Dependendo dos tipos de arquivos com os quais você está lidando, talvez você possa usar o magic-mode-alist. Observe também que auto-mode-alistnão se limita às extensões correspondentes: você pode corresponder a qualquer parte do nome ou caminho do arquivo.

Se os arquivos com os quais você está lidando não forem consistentes o suficiente para esses mecanismos, uma opção é adicionar auto-mode-alistentradas que correspondam ao nome do arquivo inteiro ou que correspondam ao caminho raiz de algum projeto e chame uma função personalizada para corresponder os nomes aos modos.

Se todos os arquivos em um determinado diretório forem do mesmo tipo, você também poderá usar uma variável local do diretório para definir o modo. As variáveis ​​de diretório podem ser definidas no seu arquivo init em vez de em um arquivo .dir-locals - consulte Variáveis ​​de diretório para obter detalhes.

Atualizar

Aqui está uma tentativa rápida de gerenciar sua própria lista de nomes de arquivos absolutos e modos principais.

(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
fonte
Infelizmente, os arquivos são muito pouco formatados e têm nomes de arquivos muito genéricos. Obrigado por apontar as especificidades de auto-mode-alist, no entanto. Provavelmente vou magic-mode-alistme lembrar de algo no futuro.
PythonNut
4

O seguinte, com base nos conselhos de Glucas, parece funcionar perfeitamente.

(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
fonte
11
Agradável. Uma solução mais elegante do que a que eu hackeei. :-)
glucas