拡張子のないファイルのモードを記憶する


10

拡張子のない多くのファイルを編集し始めましたが、まだメジャーモード形式です。

私はチームで唯一のEmacsユーザーであり、私のエディターが特別なものを必要としていることを痛々しく明白にしたくありません。コードベースの変更は避けたいです。

  • ファイル名を変更できません
  • 特別なEmacsコメントを使用できない

Emacsに、手動でファイルを最後に(たとえばと言ってM-x conf-mode)置いたモードを記憶し、再度アクセスしたときにそのモードを自動的にアクティブにしてほしいと思います。

savehist-mode永続化の処理に使用します。

簡単にできますか?


1
それが編集可能なファイルである場合は、通常、コメント付きの最初の行を追加でき# -*- mode: conf -*-ますconf-mode。それらの数が少なく、正規表現を介してそれらを照合できる場合は、正規表現をに追加できますautomode-alist
wvxvw

2
@wvxvw私の制限の1つは、「特別なEmacsコメントを使用できない」ことです。
PythonNut

2
申し訳ありませんが、どうやってそれを逃したのかわかりません。また、それauto-mode-alistは私の悪いです。
wvxvw

明らかに、ここでの正しい答えは、チームの他のメンバーにEmacsを使用させることです。他の答えはすべて回避策です。
マラバルバ2015年

回答:


13

拡張子に依存しないファイルのメジャーモードを識別する方法はいくつかあります。マニュアルの「ファイルモードの選択」を参照してください。

扱うファイルの種類によっては、おそらくを使用できますmagic-mode-alist。また、auto-mode-alist拡張子の一致に限定されないことに注意してください。ファイル名またはパスの任意の部分を一致させることができます。

処理するファイルがこれらのメカニズムに対して十分に整合性がない場合、1つのオプションはauto-mode-alist、ファイル名全体に一致するエントリを追加するか、プロジェクトのルートパスに一致させ、名前にモードを一致させるカスタム関数を呼び出すことです。

特定のディレクトリ内のすべてのファイルが同じタイプである場合は、ディレクトリローカル変数を使用してモードを設定することもできます。ディレクトリ変数は、.dir-localsファイルではなく、initファイルで設定できます。詳細については、ディレクトリ変数を参照してください。

更新

ここでは、絶対ファイル名とメジャーモードの独自のリストを管理する簡単な試みを示します。

(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、2015年

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
いいね。私が一緒にハッキングしたものよりもエレガントなソリューションです。:-)
グルカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.