emacs에서 현재 버퍼의 파일 이름을 얻는 방법?


19

내가 Vim에 대해 놓친 주요 기능 중 하나는 항상 현재 파일의 파일 이름을 %버퍼 에 저장한다는 것입니다 ( 자세한 정보 ). 이를 통해 다음과 같은 명령을 쉽게 시작할 수 있습니다.

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

비슷한 기능을 원합니다 emacs(버전 24, 차이 가 나는 경우). 즉, 현재 버퍼에서 열린 파일의 이름을 쉽게 삽입 할 수 있습니다.

내가하고 싶은 일의 예

여기서는 그러한 지름길이 필요할 때 더 잘 설명하기 위해 몇 가지 기본 사용 사례를 설명합니다.

  1. 컴파일 : M-x compileemacs를 입력 하면 컴파일 명령을 요청합니다. gcc (current-buffer)쉽게 들어가고 싶습니다 .

  2. 파일로드 : .emacs 파일을 편집 할 때 변경 사항을 테스트하기 위해 즉시로드하고 싶습니다. 내가하는 방법은 M-x load-file항상 이름을 입력하는 것 . e m a c s입니다. 바로 가기를 갖고 싶습니다.

  3. 외부 프로세스 시작 : du -sh예를 들어서 셸 명령을 실행할 때 바로 가기를 사용할 수 있음을 보여주기 위해 설명했습니다.M-!

내가 지금까지 찾은 것

  • 이 질문 은 U & L에 있습니다. 주어진 답변은 기본적으로 버퍼의 파일 이름을 찾을 수있는 위치를 보여 주므로 킬 링에 추가 할 수 있습니다. 정확히 내가 찾는 것이 아니며 파일 이름을 사용하기 전에 파일 이름을 수동으로 죽이고 싶지 않습니다. (두 답변 모두에 설명 된 솔루션은 내 이맥에서 원활하게 작동하지 않는 것으로 보이며 약간의 키 입력이 필요하므로 약간의 고통이 있습니다).

편집 : 조금 관련이 없습니다.이 솔루션이 작동하지 않는 이유를 알았습니다. 더 나은지 나쁜지 IDO를 사용하도록 설정했습니다.

  • (current-buffer)기능 설명서에 설명는 현재 버퍼에있는 파일의 이름을 반환하지 않습니다, 그러나 아무데도 예에 내가 elisp 코드를 평가하고, 이상했다. 이 함수의 평가 결과를 (미니) 버퍼에 삽입 하고이 방법을 바로 가기에 바인딩하는 방법이 있습니까?

이런 식으로 생각하는 것이 잘못입니까?

Vim을 몇 년 사용한 후에 emacs를 사용하는 법을 배우고 있습니다 (실제로 몇 달이 지났습니다). 예측 가능한 using-emacs-in-a-Vim-way 트랩 을 피하고 싶습니다 . 당신은 내가 무엇을 요구하고있어 매우 아니라고 느끼는 경우 이맥스-Y , 그것을 할 수있는 더 좋은 (청소기?) 방법이 있어야합니다, 귀하의 답변에 언급 마십시오.


.emacs의 파일 이름 정보는 (global-set-key (kbd "C-i") buffer-file-name)Ctrl + I가되어야합니다. .emacs에 M-x load-file RET대해 원하는 것을 수행합니다. 아무 것도 쓸 필요가 없습니다.
Emanuel Berg

2
이 작업 과정은 Emacs와 잘 맞지 않습니다. 창의 맨 아래 줄에있는 모든 프롬프트는 Emacs의 버퍼 (미니 버퍼)에 있기 때문입니다. (buffer-file-name)미니 버퍼를 입력 하는 동안 달리면 미니 버퍼 nil이기 (current-buffer)때문에을 얻습니다 . 미니 버퍼에있는 동안에도 버퍼를 전환 할 수 있으므로, Emacs가 보는 것처럼 현재 버퍼가 미니 버퍼 인 시점에 따라 현재 버퍼에 대해 어떤 버퍼가 현재 버퍼인지 생각하는 것은 추적하기 어렵습니다.
Gilles 'SO- 악한 중지'

답변:


11

다음과 같은 함수를 .emacs에 넣고 원하는 키에 바인딩 할 수 있습니다.

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

또한 이 질문 을 보아도 비슷한 것 같습니다.


4

@easyb의 대답 에 대한 약간의 변형 은 킬 링을 버퍼에 넣는 대신 킬 링의 경로를 복사하는 것입니다 (읽기 전용 파일에 유용함).

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.