자동 모드-알리스트를 존중하기 위해 파일뿐만 아니라 버퍼를 얻는 방법?


13

Q : 매핑을 준수 하기 위해 새 버퍼 를 어떻게 얻을 수 auto-mode-alist있습니까?

파일을 찾을 때 Emacs는 파일 확장자와 파일 확장자를 비교하여 파일 auto-mode-alist버퍼에 사용할 주 모드를 결정합니다. auto-mode-alist파일을 가지고 있지 않은 버퍼의 모드를 결정하기 위해 정보를 사용하는 방법 이 있습니까?

즉 , 파일 확장명처럼 보이는 이름 의 새 버퍼 를 열면 예상 모드에서 자동으로 열 수 있습니까? 예를 들어, a-new-buffer.el파일과 아직 연결되지 않은 새 버퍼 를 열려면 emacs-lisp-mode기본 모드 가 아닌 파일을 열고 싶습니다 .


2
궁금한 점이 있습니다. 사용 사례는 무엇입니까? IOW, 왜 / 언제 / 컨텍스트로 하시겠습니까? 일반적으로 버퍼를 파일과 연결하고에서 모드를 선택 auto-mode-alist하려면 버퍼를 파일을 " 방문 " 하고 모든 것을 처리합니다.
Drew

5
나를위한 전형적인 사용 사례의 예는 다음과 같다. a) org내가 사용하기 위해 쓰고있는 새로운 기능을 테스트하기 위한 임시 버퍼 org-mode; b) R신속하고 무시할 수있는 통계 조작을 위한 임시 버퍼; c) 이메일을 작성하기위한 임시 텍스트 버퍼. 각각의 경우, 방문 할 파일을 만들고 싶지 않지만 적절한 모드에서 열리는 버림 버퍼를 원합니다.
Dan

2
같은 파일 방문 명령 C-x C-f수 없습니다 " 방문에 파일을 만듭니다 ." 그것은 근본적인 오해입니다. 그들은 단순히 당신이 찾고있는 것을 정확하게합니다. 그것은입니다 당신이하려고하면 경우 버퍼 저장 파일이 작성되는 것으로한다. 버퍼를 저장하지 않으면 파일이 작성되지 않습니다. 내가 지금까지 이해 한 것에서 원하는 것은 "파일 방문"(실제로 적절한 모드에서 버퍼를 여는 것을 의미 함)입니다.
Drew

8
Dan과 마찬가지로 실제 파일 경로와 연결하고 싶지 않은 모든 시간에 임시 버퍼를 만듭니다. 가짜 파일 경로를 방문하면 효과가 있지만 디렉토리를 선택하거나 현재 디렉토리를 수락하는 데 약간의 마찰이 있습니다. 나머지 구성에 따라 다른 부작용이있을 수 있습니다. 자동 저장 동작? 경로에 의해 결정되는 Ibuffer 그룹 또는 발사체 프로젝트? 확인 메시지가 표시됩니까? 버퍼는 어쨌든 이름을 가져야하기 때문에 이름을 사용하여 임시 버퍼에 대한 모드를 자동으로 설정하는 것이 좋습니다.
glucas

@Drew는 그렇습니다.이 질문에 대한 가장 간단한 답변이 될 것입니다. 답변으로 게시 해 주시겠습니까? 업그레이드가 필요합니다.
Dan

답변:


8

방문 파일과 같은 파일 방문 명령 은 방문 C-x C-f 할 파일생성하지 않습니다 . 그들은 당신이 찾고있는 것을합니다.

파일이 작성 되는 버퍼 저장 하려고하는 경우 에만 해당 됩니다 .

버퍼를 저장하지 않으면 파일이 작성되지 않습니다. 내가 지금까지 이해 한 것으로부터 원하는 것은 " 파일 방문 " (실제로 적절한 모드에서 버퍼를 여는 것을 의미 함)입니다.


4
원하는 파일에 관계없이 3 초마다 현재 파일을 지속적으로 저장하는 초 활성 손가락이있는 경우 어떻게해야합니까?
Malabarba

1
@ Malabarba : 사실, 나는 그 손가락이있다! ;-) 아마도 우리 대부분의 오래된 방귀가 일어납니다-일이 항상 추락했을 때 습관이 회복되었습니다. 그러나 어쨌든, 나는 제안한 것을 수행합니다 : 버리기 방문 파일 버퍼에서 편집하십시오. 과잉 근육 메모리가 방해를 받고 저장하려고하면 저장 n하지 않기 위해 누르 거나 버퍼를 저장하기 만하면됩니다. 그리고 나중에 생성 된 파일을 던져 버립니다. 그렇지 않습니다.)
Drew

1
@Malabarba 주 모드 전용 스크래치 버퍼를 사용하기 시작한 것은 임시 파일의 혼란을 막는 것입니다. 스크래치에 파일이 필요한 경우 나중에 파일로 저장할 수 있습니다.
Kaushal Modi

1
@kaushalmodi : 모드 별 버퍼에 대한 것은 없지만 " 임시 파일의 혼란 "은 버퍼혼란 만큼 쉽게 정리됩니다 . ;-) 그리고 모드 별 스크래치 버퍼의 하이퍼 액티브 손가락은 아마도 같은 문제를 나타냅니다 . *scratch*손가락이 자동으로 닿으면 저장하라는 메시지가 나타납니다 C-x C-s.
Drew

9

Juri Linkov 의 솔루션을 수년간 사용해 온 경험이 있다면 .

와 같은 임시 버퍼를 만듭니다 C-x b test.org C-j. 를 major-mode통해 파일 확장자에 의해 결정됩니다 auto-mode-alist.

;; http://thread.gmane.org/gmane.emacs.devel/115520/focus=115794
(setq-default major-mode
              (lambda () (if buffer-file-name
                          (fundamental-mode)
                            (let ((buffer-file-name (buffer-name)))
                          (set-auto-mode)))))

효과를 테스트하기 위해 시도 할 수 있습니다 (prog1 (and (switch-to-buffer "my-new.org") major-mode) (kill-buffer "my-new.org")) => org-mode. 깨끗하게 emacs -q테스트가 돌아옵니다 fundamental-mode.


1
매우 영리합니다! 또한 advice내가 사용했던 옵션 보다 깔끔합니다 . 확실하지 나는 무엇을 다음있어 (prog1...)일부가하지만 (setq-default major-mode ...)일부는 아주 좋은 것입니다.
Dan

1
Juri의 Emacs 사이트 를 확인 하십시오 . prog1당신이 얻을 -test 단지 쇼는 예상 major-mode버퍼로 전환 할 때. setq-default부품을 평가하고 테스트를 실행하십시오. 반환 org-mode 하지 않으면 setq-default반환 fundamental-mode됩니다.
rasmus

이것은 내 버퍼 목록 업데이트 후크보다 더 우아합니다. 감사!
glucas

이것은 왜 우리가 묻는 지 왜 틀린지 말해주지 않고 실제로 질문에 대답하기 때문입니다. :
Shlomi

6

@Drew의 의견과 @glucas의 답변에서 얻은 아이디어를 사용하여 조언 기반 방식을 알아 냈습니다.

짧은 버전 : after버퍼에 관련 파일 이름이 있는지 여부를 쿼리하고, 그렇지 않은 경우 임시로 설정 한 다음 나머지 set-auto-mode기계가 세부 사항을 처리하도록하십시오. 약간의 테스트 (광범위한 것은 아님) 후 제대로 작동하는 것 같습니다.

들어 ido-switch-buffer와 바닐라 switch-to-buffer, 조언의 두 비트는 다음과 같습니다

(defadvice ido-switch-buffer (after set-mode activate)
  (unless buffer-file-name
    (let ((buffer-file-name (buffer-name)))
      (set-auto-mode t))))

(defadvice switch-to-buffer (after set-mode activate)
  (unless buffer-file-name
    (let ((buffer-file-name (buffer-name)))
      (set-auto-mode t))))

find-file손가락이 뇌보다 앞서 갈 수 있기 때문에 @Drew가 제기 한 점 에서이 옵션이 도움이 된다는 것을 알게되었습니다. 근육 기억은 종종 필요한 일을하는 find-file것이 나에게 완전히 발생하기 전에 버퍼 전환 영역으로 이동 합니다. 이제 두 가지 옵션을 모두 사용할 수 있습니다.

업데이트 : 위의 코드에서 작지만 잠재적으로 자극적 인 버그 : 버퍼로 전환 할 때마다 버퍼에서 모드 후크를 다시 실행합니다. 다음은 /tmp디렉토리 에서 실제 파일 이름을 제공하고 해당 문제를 피합니다.

(defadvice ido-switch-buffer (after set-mode activate)
  (unless buffer-file-name
    (setq buffer-file-name (concat "/tmp/" (buffer-name)))
    (set-auto-mode t)))

좋아 보이고 몇 번의 반복에 걸쳐 내 대답이 누적 된 균열을 정리합니다. :-) 어떤 이유로 실제 파일 경로를 설정하지 않으려면 버퍼 로컬 변수를 사용하여 모드를 여러 번 설정하지 않도록 할 수 있습니다.
glucas

5

set-auto-mode함수는 버퍼와 관련된 파일을 기반으로 모드를 설정합니다. buffer-file-name모드를 설정하기 위해 버퍼 이름에서 임시로 설정하는 함수는 다음과 같습니다 .

(defun my/set-buffer-mode (buffer &optional again)
  "Set the mode for BUFFER from the name.  
When called repeatedly for the same buffer only set the mode the first
time, unless the optional argument AGAIN is specified.
Does nothing if the buffer is associated with a file."

  (with-current-buffer buffer
    (when again (kill-local-variable 'my/buffer-mode-set))
    (unless (or buffer-file-name 
            (local-variable-p 'my/buffer-mode-set))
      (let ((buffer-file-name (buffer-name)))
        (set-auto-mode t)
        (setq-local my/buffer-mode-set t)))))

조언을 사용하여 버퍼의 이름을 바꿀 때 이것을 실행할 수 있습니다.

(defadvice rename-buffer (after my/rename-update-mode activate)
  (my/set-buffer-mode (current-buffer) 'again))

새 버퍼에 영향을 미치기 위해 이것을 연결하는 가장 좋은 장소는 확실하지 않습니다. 여기에서는을 사용하고 buffer-list-update-hook있지만 필요한 경우보다 더 많이 호출됩니다.

(add-hook 'buffer-list-update-hook
      '(lambda ()
         (my/set-buffer-mode (car (buffer-list)))))

위의 답변은 일부 문제를 해결하기 위해 수정되었습니다. 특히, 예상 된 현재 버퍼로 호출되지 buffer-list-update-hook않았기 때문에 를 사용하여 다시 돌아 왔습니다 change-major-mode-hook. 레코드의 경우 @Dan이 대답하는 것처럼 스위치 버퍼 기능을 조언하는 것이 더 합리적입니다.
glucas

3

작업중인 파일과 동일한 주 모드를 갖는 임시 버퍼를 작성하기 위해 * scratch * 버퍼를 사용할 수 있습니다.

다음은 문제를 해결할 수있는 emacs SE 답변입니다.

파일과 동일한 주 모드를 가진 * scratch * 버퍼 사이를 빠르게 전환하려면 어떻게해야합니까?

참조 된 질문과 답변이 모두 나에 의해 게시되었습니다. 함수의 대답은 다음을 수행합니다.

  • 파일에서 X 메이저 모드로 작업중인 경우이 함수를 호출 *scratch-X-mode*하면 이미 존재하지 않는 경우 라는 새 스크래치 버퍼 가 작성되고 새로 작성된이 버퍼로 전환됩니다.
  • *scratch-X-mode*이미 존재하는 경우 해당 버퍼로 간단히 전환합니다.
  • 해당 스크래치 버퍼에있는 동안이 함수를 다시 호출하면 원래 작업하던 파일 버퍼로 돌아갑니다.

0

여기에 좋은 답변이 있지만 한 가지 더 추가하고 싶었습니다. 이맥스는 많은 기능을 가지고 있으며 종종 무언가를하는 몇 가지 방법이 있습니다. 확장명에 관계없이 파일의 상단에 태그를 추가하여 emacs에 유형을 알려줍니다. 예를 들어 이것을 추가 :

# -*-Python-*-

파일 맨 위에는 emacs가 .py확장자 가없는 파이썬 파일임을 알려줍니다 . (가) 있습니다 #줄의 시작 부분에 파이썬 스타일의 주석이다. 다른 파일 형식의 경우 다른 주석을 사용할 수 있습니다. 예를 들어 ;주석 행을 시작하고 다음과 같이 emacs에서 모드를 설정하는 데 사용하는 Lisp 파일을 지정하려면 다음 을 수행하십시오.

; -*- mode: Lisp;-*-

파일 변수 지정파일 모드 선택을 참조하십시오 .


예, 그러나 여기서 중요한 것은 새로운 임시 버퍼 (예 : with switch-buffer)를 만들고 모드가 자동으로 이외의 것으로 설정되도록하는 것 fundamental-mode입니다.
glucas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.