Uzantısı olmayan dosyalar için modları hatırla


10

Uzantısı olmayan, ancak yine de büyük mod biçiminde olan birçok dosyayı düzenlemeye başladım.

Takımdaki tek Emacs kullanıcısıyım ve editörümün özel şeylere ihtiyacı olduğunu acı verici bir şekilde açıklamak istemiyorum . Kod temeli değiştirmekten kaçınmak istiyorum.

  • Dosya adını değiştiremiyorum
  • Özel Emacs yorumlarını kullanamıyorum

Emacs'ın dosyayı son olarak manuel olarak koyduğum (hatırla) modunu hatırlamasını M-x conf-modeve tekrar ziyaret ettiğimde bu modu otomatik olarak etkinleştirmesini istiyorum.

Kullandığım savehist-modesebat işlemek için.

Bunu acısız bir şekilde yapabilir miyim?


1
Düzenleyebileceğiniz dosya buysa, genellikle bir yorum içeren ilk satır ekleyebilirsiniz: # -*- mode: conf -*-ve Emacs'ı kullanmak için ipucu verir conf-mode. Bunlardan azı varsa ve bunları normal ifade ile eşleştirebiliyorsanız, regexp öğesini ekleyebilirsiniz automode-alist.
wvxvw

2
@wvxvw sınırlamalardan biri " Özel Emacs yorumlarını kullanamıyorum ".
PythonNut

2
Ah, üzgünüm, bunu nasıl özlediğimi anlamıyorum. Ayrıca, bu auto-mode-alist, benim hatam.
wvxvw

Açıkçası buradaki doğru cevap ekibinizin geri kalanının Emacs'ı kullanmasını sağlamaktır. Diğer yanıtlar sadece bir çözümdür.
Malabarba

Yanıtlar:


13

Bir uzantıya dayanmayan bir dosyanın ana modunu tanımlamanın birkaç yolu vardır, kılavuzdaki Dosya Modlarını Seçme konusuna bakın .

Karşılaştığınız dosya türlerine bağlı olarak, belki de kullanabilirsiniz magic-mode-alist. Ayrıca auto-mode-alist, eşleşen uzantılarla sınırlı olmadığını unutmayın : dosya adının veya yolunun herhangi bir bölümü ile eşleşebilirsiniz.

Karşılaştığınız dosyalar bu mekanizmalar için yeterince tutarlı değilse, bir seçenek auto-mode-alisttüm dosya adıyla eşleşen girişler eklemek veya bazı projelerin kök yoluyla eşleşmek ve adları modlarla eşleştirmek için özel bir işlev çağırmaktır.

Belirli bir dizindeki tüm dosyalar aynı türdeyse, modu ayarlamak için bir dizin-yerel değişkeni de kullanabilirsiniz. Dizin değişkenleri, .dir-locals dosyası yerine init dosyanızda ayarlanabilir; ayrıntılar için bkz. Dizin Değişkenleri .

Güncelleme

İşte mutlak dosya adları ve ana modlardan oluşan kendi listenizi yönetmeye yönelik hızlı bir girişim.

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

Ne yazık ki, dosyalar oldukça gevşek biçimlendirilmiş ve çok genel dosya adlarına sahipler. auto-mode-alistGerçi özelliklerini de belirttiğiniz için teşekkürler . magic-mode-alistGelecekte bir şey için muhtemelen aklımın arkasında kalacağım .
PythonNut

4

Glucas'ın tavsiyelerine dayanan aşağıdakiler mükemmel çalışıyor.

(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
Güzel. Birlikte hacklediğimden daha zarif bir çözüm. :-)
glucas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.