จดจำโหมดสำหรับไฟล์ที่ไม่มีนามสกุล


10

ฉันเริ่มแก้ไขไฟล์จำนวนมากที่ไม่มีส่วนขยาย แต่ยังอยู่ในรูปแบบโหมดหลัก

ฉันเป็นผู้ใช้ Emacs เพียงคนเดียวในทีมและฉันไม่ต้องการทำให้มันชัดเจนว่าผู้แก้ไขของฉันต้องการสิ่งพิเศษ ฉันต้องการหลีกเลี่ยงการเปลี่ยน codebase

  • ฉันไม่สามารถเปลี่ยนชื่อไฟล์ได้
  • ฉันไม่สามารถใช้ความคิดเห็นพิเศษของ Emacs ได้

ฉันต้องการให้ Emacs จดจำโหมดใดก็ตามที่ฉันวางไฟล์ด้วยตนเองในที่สุด (พร้อมพูดM-x conf-mode) และเปิดใช้งานโหมดนั้นโดยอัตโนมัติเมื่อฉันเข้าชมอีกครั้ง

ฉันใช้savehist-modeเพื่อจัดการความเพียร

ฉันสามารถทำสิ่งนี้อย่างเจ็บปวดได้หรือไม่?


1
หากเป็นไฟล์ที่คุณสามารถแก้ไขได้โดยทั่วไปคุณสามารถเพิ่มบรรทัดแรกด้วยความคิดเห็น: # -*- mode: conf -*-และนั่นจะทำให้ Emacs สามารถใช้งานconf-modeได้ หากมีกี่ของพวกเขาและคุณสามารถตรงกับพวกเขาผ่านการแสดงออกปกติคุณสามารถเพิ่ม regexp automode-alistไป
wvxvw

2
@wvxvw ข้อ จำกัด อย่างหนึ่งของฉันคือ " ฉันไม่สามารถใช้ความคิดเห็น Emacs พิเศษ "
PythonNut

2
โอ้ขอโทษฉันไม่เข้าใจว่าฉันพลาดไปได้อย่างไร นอกจากนี้ยังเป็นauto-mode-alistสิ่งที่ไม่ดีของฉัน
wvxvw

ชัดเจนคำตอบที่ถูกต้องที่นี่คือการได้รับส่วนที่เหลือของทีมของคุณใช้ Emacs คำตอบอื่น ๆ เป็นเพียงวิธีแก้ปัญหา
Malabarba

คำตอบ:


13

มีหลายวิธีในการระบุโหมดหลักสำหรับไฟล์ที่ไม่ต้องใช้นามสกุลดูที่การเลือกโหมดไฟล์ในคู่มือ

magic-mode-alistทั้งนี้ขึ้นอยู่กับชนิดของไฟล์ที่คุณกำลังเผชิญกับบางทีคุณสามารถใช้ โปรดทราบว่าauto-mode-alistไม่ จำกัด เฉพาะส่วนขยายที่ตรงกัน: คุณสามารถจับคู่ส่วนใด ๆ ของชื่อไฟล์หรือพา ธ

หากไฟล์ที่คุณจัดการไม่สอดคล้องกันเพียงพอสำหรับกลไกเหล่านั้นตัวเลือกหนึ่งคือเพิ่มauto-mode-alistรายการที่ตรงกับชื่อไฟล์ทั้งหมดหรือจับคู่รูทพา ธ ของบางโครงการและเรียกใช้ฟังก์ชันที่กำหนดเองเพื่อจับคู่ชื่อกับโหมด

หากไฟล์ทั้งหมดในไดเรกทอรีที่กำหนดเป็นประเภทเดียวกันคุณสามารถใช้ตัวแปรไดเรกทอรีท้องถิ่นเพื่อตั้งค่าโหมด ตัวแปรไดเรกทอรีสามารถตั้งค่าได้ในไฟล์ init แทนที่จะเป็นไฟล์ .dir-locals - ดูรายละเอียดตัวแปรไดเรกทอรี

ปรับปรุง

นี่คือความพยายามอย่างรวดเร็วในการจัดการ alist ของคุณเองของชื่อไฟล์และโหมดหลัก

(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

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
ดี ทางออกที่ดีกว่าอันที่ฉันแฮ็กด้วยกัน :-)
glucas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.