Ghi nhớ các chế độ cho các tệp không có phần mở rộng


10

Tôi đã bắt đầu chỉnh sửa rất nhiều tệp không có tiện ích mở rộng nhưng vẫn ở định dạng chế độ chính.

Tôi là người dùng Emacs duy nhất trong nhóm và tôi không muốn làm cho rõ ràng rằng trình soạn thảo của tôi cần những thứ đặc biệt . Tôi muốn tránh thay đổi codebase.

  • Tôi không thể thay đổi tên tệp
  • Tôi không thể sử dụng các bình luận đặc biệt của Emacs

Tôi muốn Emacs nhớ bất kỳ chế độ nào tôi đặt tệp theo cách thủ công cuối cùng (với, nói M-x conf-mode) và tự động kích hoạt chế độ đó khi tôi truy cập lại.

Tôi sử dụng savehist-modeđể xử lý sự kiên trì.

Tôi có thể làm điều này không đau?


1
Nếu đó là tệp bạn có thể chỉnh sửa, thông thường bạn có thể thêm một dòng đầu tiên với một nhận xét: # -*- mode: conf -*-và điều đó sẽ khiến Emacs không sử dụng conf-mode. Nếu có một vài trong số chúng và bạn có thể kết hợp chúng thông qua biểu thức chính quy, bạn có thể thêm biểu thức chính quy automode-alist.
wvxvw

2
@wvxvw một trong những hạn chế của tôi là " Tôi không thể sử dụng các bình luận Emacs đặc biệt ".
PythonNut

2
Ouch, xin lỗi, tôi không hiểu làm thế nào tôi đã bỏ lỡ điều đó. Ngoài ra, đó là auto-mode-alist, xấu của tôi.
wvxvw

Rõ ràng câu trả lời chính xác ở đây là để phần còn lại trong nhóm của bạn sử dụng Emacs. Bất kỳ câu trả lời khác chỉ là một cách giải quyết.
Malabarba

Câu trả lời:


13

Có một số cách để xác định chế độ chính cho một tệp không dựa vào tiện ích mở rộng, xem phần Chọn chế độ tệp trong hướng dẫn.

Tùy thuộc vào loại tệp bạn đang xử lý, có lẽ bạn có thể sử dụng magic-mode-alist. Cũng lưu ý rằng auto-mode-alistkhông giới hạn đối với các tiện ích mở rộng phù hợp: bạn có thể khớp bất kỳ phần nào của tên tệp hoặc đường dẫn.

Nếu các tệp bạn đang xử lý không đủ nhất quán cho các cơ chế đó, một tùy chọn là thêm auto-mode-alistcác mục khớp với toàn bộ tên tệp hoặc khớp với đường dẫn gốc của một số dự án và gọi một hàm tùy chỉnh để khớp tên với các chế độ.

Nếu tất cả các tệp trong một thư mục đã cho là cùng loại, bạn cũng có thể sử dụng biến thư mục cục bộ để đặt chế độ. Các biến thư mục có thể được đặt trong tệp init của bạn chứ không phải trong tệp .dir-locals - xem Biến thư mục để biết chi tiết.

Cập nhật

Đây là một nỗ lực nhanh chóng trong việc quản lý các tên tệp và chế độ chính tuyệt đối của riêng bạn.

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

Thật không may, các tệp được định dạng khá lỏng lẻo và chúng có tên tệp rất chung chung. Cảm ơn đã chỉ ra các chi tiết cụ thể auto-mode-alist, mặc dù. Có lẽ tôi sẽ giữ magic-mode-alisttrong đầu tôi một điều gì đó trong tương lai.
PythonNut

4

Những điều sau đây, dựa trên lời khuyên của Glucas dường như hoạt động hoàn hảo.

(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
Đẹp. Một giải pháp thanh lịch hơn so với giải pháp tôi đã hack cùng nhau. :-)
glucas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.