확장자가없는 파일의 기억 모드


10

확장자가 없지만 여전히 주 모드 형식 인 많은 파일을 편집하기 시작했습니다.

나는 팀의 유일한 Emacs 사용자이며 편집자가 특별한 것들을 필요로한다는 것을 고통스럽게 분명하게하고 싶지 않습니다 . 코드베이스 변경을 피하고 싶습니다.

  • 파일 이름을 변경할 수 없습니다
  • 특별한 Emacs 의견을 사용할 수 없습니다

Emacs가 파일을 마지막에 수동으로 넣은 모드 (예 :)를 기억 M-x conf-mode하고 다시 방문 할 때 자동으로 해당 모드를 활성화하고 싶습니다.

savehist-mode지속성을 처리 하는 데 사용 합니다.

이 고통없이 할 수 있습니까?


1
편집 가능한 파일 인 경우 일반적으로 주석 :과 함께 첫 번째 줄을 추가하면 # -*- mode: conf -*-Emacs가 사용하도록 팁을 conf-mode줍니다. 이 중 몇 개가없고 정규식을 통해 일치시킬 수 있으면 정규 표현식을에 추가 할 수 있습니다 automode-alist.
wvxvw

2
@wvxvw 제한 사항 중 하나는 " 특별한 Emacs 설명을 사용할 수 없습니다 "입니다.
PythonNut

2
미안하지만, 내가 어떻게 그리웠는지 이해할 수 없습니다. 또한, auto-mode-alist내 나쁜입니다.
wvxvw 2016 년

여기서 정답은 나머지 팀이 Emacs를 사용하도록하는 것입니다. 다른 답변은 해결 방법입니다.
Malabarba

답변:


13

확장명에 의존하지 않는 파일의 주 모드를 식별하는 방법은 여러 가지가 있습니다. 설명서의 파일 모드 선택을 참조하십시오 .

처리중인 파일의 종류에 따라을 사용할 수 있습니다 magic-mode-alist. 또한 auto-mode-alist일치하는 확장자로만 제한되지는 않습니다. 파일 이름 또는 경로의 모든 부분을 일치시킬 수 있습니다.

처리하는 파일이 해당 메커니즘에 대해 일관성이없는 경우 한 가지 옵션은 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

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.