Помните режимы для файлов без расширений

10

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

Я единственный пользователь Emacs в команде, и я не хочу, чтобы это было до боли очевидно, что моему редактору нужны особые вещи. Я хотел бы избежать изменения кодовой базы.

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

Я хотел бы, чтобы Emacs запомнил, в каком режиме я в последний раз помещал файл (скажем M-x conf-mode), и автоматически активировал этот режим при повторном посещении.

Я использую, savehist-modeчтобы справиться с настойчивостью.

Могу ли я сделать это безболезненно?

PythonNut
источник
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записи, которые соответствуют полному имени файла или корневому пути какого-либо проекта, и вызвать пользовательскую функцию для сопоставления имен с режимами.

Если все файлы в данном каталоге имеют одинаковый тип, вы также можете использовать локальную переменную directory для установки режима. Переменные каталога могут быть установлены в вашем файле инициализации, а не в файле .dir-locals - подробности см. В разделе Переменные каталога .

Обновить

Вот быстрая попытка управления собственным списком абсолютных имен файлов и основных режимов.

(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
источник
К сожалению, файлы довольно свободно отформатированы и имеют очень общие имена файлов. Спасибо за указание на особенности auto-mode-alist, хотя. Я, вероятно, буду magic-mode-alistпомнить что-то в будущем.
PythonNut
4

Следующее, основанное на советах Глюкаса, кажется, работает отлично.

(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
источник
1
Ницца. Более элегантное решение, чем то, которое я взломал вместе. :-)
глюкас