Ingat mode untuk file tanpa ekstensi

10

Saya sudah mulai mengedit banyak file yang tidak memiliki ekstensi, tetapi masih dalam format mode utama.

Saya satu-satunya pengguna Emacs di tim, dan saya tidak ingin membuatnya jelas bahwa editor saya membutuhkan hal - hal khusus . Saya ingin menghindari mengubah basis kode.

  • Saya tidak dapat mengubah nama file
  • Saya tidak dapat menggunakan komentar khusus Emacs

Saya ingin Emacs mengingat mode apa pun yang saya letakkan file secara manual terakhir (dengan, katakanlah M-x conf-mode) dan secara otomatis mengaktifkan mode itu ketika saya mengunjunginya lagi.

Saya gunakan savehist-modeuntuk menangani kegigihan.

Bisakah saya melakukan ini tanpa rasa sakit?

PythonNut
sumber
1
Jika itu file yang dapat Anda edit, biasanya Anda dapat menambahkan baris pertama dengan komentar:, # -*- mode: conf -*-dan itu akan memberi tip pada Emacs untuk digunakan conf-mode. Jika ada beberapa dari mereka, dan Anda dapat mencocokkannya melalui ekspresi reguler, Anda dapat menambahkan regexp ke automode-alist.
wvxvw
2
@wvxvw salah satu keterbatasan saya adalah " Saya tidak bisa menggunakan komentar khusus Emacs ".
PythonNut
2
Aduh, maaf, saya tidak mengerti bagaimana saya melewatkan itu. Juga, ini auto-mode-alist, salahku.
wvxvw
Jelas jawaban yang benar di sini adalah membuat anggota tim Anda menggunakan Emacs. Jawaban lain hanyalah solusi.
Malabarba

Jawaban:

13

Ada sejumlah cara untuk mengidentifikasi mode utama untuk file yang tidak bergantung pada ekstensi, lihat Memilih Mode File di manual.

Tergantung pada jenis file yang Anda hadapi, mungkin Anda bisa menggunakan magic-mode-alist. Perhatikan juga bahwa auto-mode-alisttidak terbatas pada ekstensi yang cocok: Anda dapat mencocokkan bagian mana pun dari nama file atau jalur.

Jika file yang Anda hadapi tidak cukup konsisten untuk mekanisme tersebut, satu opsi adalah menambahkan auto-mode-alistentri yang cocok dengan seluruh nama file, atau mencocokkan jalur root dari beberapa proyek dan memanggil fungsi kustom untuk mencocokkan nama dengan mode.

Jika semua file dalam direktori yang diberikan adalah tipe yang sama Anda juga bisa menggunakan variabel direktori-lokal untuk mengatur mode. Variabel direktori dapat diatur dalam file init Anda alih-alih dalam file .dir-locals - lihat Variabel Direktori untuk detailnya.

Memperbarui

Berikut adalah upaya cepat untuk mengelola daftar nama file absolut dan mode utama Anda sendiri.

(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)
glukas
sumber
Sayangnya, file-file tersebut diformat secara longgar, dan mereka memiliki nama file yang sangat umum. Terima kasih telah menunjukkan spesifiknya auto-mode-alist. Saya mungkin akan magic-mode-alistmengingat sesuatu di masa depan.
PythonNut
4

Berikut ini, berdasarkan saran Glucas tampaknya bekerja dengan sempurna.

(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
sumber
1
Bagus. Solusi yang lebih elegan daripada yang saya retas bersama. :-)
glucas