Запам’ятайте режими для файлів без розширень


10

Я почав редагувати багато файлів, які не мають розширень, але все ще знаходяться у форматі основного режиму.

Я єдиний користувач Emacs в команді, і я не хочу робити болісно очевидним, що моєму редактору потрібні спеціальні речі. Я хотів би уникати зміни кодової бази.

  • Я не можу змінити ім'я файлу
  • Я не можу використовувати спеціальні коментарі Emacs

Я хотів би, щоб Emacs запам'ятав будь-який режим, в який я вручав файл вручну (з, скажімо M-x conf-mode), і автоматично активувати цей режим, коли я його знову відвідую.

Я використовую savehist-modeдля обробки наполегливості.

Чи можу я це зробити безболісно?


1
Якщо це файл, який ви можете редагувати, зазвичай ви можете додати перший рядок із коментарем:, # -*- mode: conf -*-і це дозволить Emacs вимкнути його для використання conf-mode. Якщо їх небагато, і ви можете зіставити їх за допомогою регулярного вираження, ви можете додати регулярне вираження automode-alist.
wvxvw

2
@wvxvw Одним із моїх обмежень є те, що " я не можу використовувати спеціальні коментарі Emacs ".
PythonNut

2
Ой, вибач, я не розумію, як я це пропустив. Також, це auto-mode-alist, моє погано.
wvxvw

Очевидно, що правильна відповідь тут - це змусити решту вашої команди використовувати Emacs. Будь-яка інша відповідь - це лише обхідне рішення.
Малабарба

Відповіді:


13

Існує кілька способів визначити основний режим для файлу, який не покладається на розширення, див. Вибір режимів файлів у посібнику.

Залежно від типу файлів, з якими ви маєте справу, можливо, ви могли б використовувати magic-mode-alist. Також зауважте, що auto-mode-alistне обмежується збігом розширень: ви можете відповідати будь-якій частині імені файлу або шляху.

Якщо файли, з якими ви маєте справу, недостатньо сумісні для цих механізмів, один із варіантів - додати auto-mode-alistзаписи, які відповідають всьому імені файлу, або відповідати кореневому шляху певного проекту та викликати спеціальну функцію, щоб відповідати імена режимам.

Якщо всі файли в даному каталозі одного типу, ви також можете використати змінну локального каталогу для встановлення режиму. Змінні каталоги можна встановити у вашому файлі init, а не у файлі .dir-localals - детальну інформацію див. У змінних каталогів .

Оновлення

Ось швидка спроба управління власним списком абсолютних імен файлів та основних режимів.

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

На жаль, файли досить вільно відформатовані, і вони мають дуже загальні назви файлів. Дякую, що вказали на специфіку auto-mode-alist. Я, мабуть, буду тримати magic-mode-alistв душі щось для майбутнього.
PythonNut

4

Далі, на основі порад Glucas, здається, працює чудово.

(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
Приємно. Більш елегантне рішення, ніж те, що я зламав разом. :-)
глюкас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.