현재 파일 이름을 미니 버퍼에 넣습니다


12

활성 파일 버퍼의 파일 이름을 명령에 삽입하려면 어떻게해야합니까?

파일 이름이 필요한 명령을 호출 할 때 파일 버퍼에서 수행하는 경우가 많으며 미니 버퍼 에 명령 을 입력 하는 동안 해당 파일의 이름을 원합니다 .

C-x미니 버퍼에 명령 줄을 구성하는 동안 입력 할 수 있는 가설 을 찾고 있습니다.

따라서 현재 버퍼가 파일 이름 인 동안 다음을 Lorem Ipsum.txt입력하십시오.

M-x grep RET 'foo' SPC C-x … RET

M-xgrepRET선물은 미니 버퍼는 묻지 grep명령. 이에 대한 응답으로 정규식 패턴 인수 ( 'foo')를 입력 하고 파일 이름 인수 ( C-x)를 삽입했습니다 . 그 미니 버퍼는 다음과 같이 끝납니다 :

grep -nH -e 'foo' 'Lorem Ipsum.txt'

어떤 기존 명령이 현재 파일 버퍼의 파일 이름을 이와 같이 가져 옵니까? 기본 키 바인딩은 무엇입니까?


3
아무도 언급하지 않은 것에 놀랐습니다 M-n. 모든 곳에서 작동하지는 않지만 많은 곳에서 작동합니다. 또한 당신이 grepping하고 있기 때문에 좀 더 인터랙티브 한 lgrep과 rgrep을 좋아할 것입니다.
Malabarba

답변:


18

어떤 기존 명령이 현재 파일 버퍼의 파일 이름을 이와 같이 가져 옵니까?

불행히도 이에 대한 준비된 명령은 없지만 다음과 같이 만들 수 있습니다.

(defun name-of-the-file ()
  "Gets the name of the file the current buffer is based on."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

마법은 미니 버퍼 선택 창 기능에 있습니다. 미니 버퍼가 활성화되기 전에 마지막 버퍼를 선택하여 올바른 작업을 수행합니다. 그렇지 않으면 buffer-file-name 만 사용하면 파일 이름 이 미니 버퍼에 들어 가지 않습니다. 흥미롭게도 동일한 함수를 일반 버퍼 또는 미니 버퍼에서 사용하여 파일 이름을 삽입 할 수 있습니다. 특별한 치료가 필요하지 않습니다.

기본 키 바인딩은 무엇입니까?

아무것도 없지만 편리한 것을 골라서 다음과 같이 지정할 수 있습니다.

(global-set-key (kbd "C-c f") 'name-of-the-file)

위의 lisp 코드 라인을 init.el 파일에 넣으십시오.

이것은 대부분의 사소한 경우에 작동하지만이 기능을 호출 할 때 어떤 모드에서 어떤 충돌이 있을지 예측하기 어렵습니다.

버퍼가 스크래치 버퍼와 같은 유효한 파일 이름을 방문하지 않으면 어떻게됩니까? 그런 다음이 오류가 에코 영역에 표시됩니다.

name-of-the-file: Wrong type argument: char-or-string-p, nil

바로 가기를 호출하기 전에 올바른 파일 이름으로 유효한 버퍼를 선택하면 이러한 오류가 발생하지 않습니다.

위와 같은 몇 가지 다른 솔루션이 있지만 충돌에 대한 예외 또는 재정의 처리 방법이 주로 다릅니다. 예를 들어, 일부는 모드 훅을 사용하여 특정 모드에서만이 기능을 사용할 수 있습니다.


이것이 작동하기 위해서는 하나가 필요하다고 생각합니다 enable-recursive-minibuffers.
Dieter. 빌헬름

명령이 미니 버퍼 에서만 사용 (define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function 되어야 C-c b한다면, 현재 바인딩 이름을 삽입하는 버퍼 이름 대신 다음 바인딩을 사용할 수 있습니다 .
Dov Grobgeld

2

dired-x키보드 단축키를 사용 하는 경우 C-x C-j에 바인딩됩니다 dired-jump. 따라서 파일 버퍼에서 오른쪽 줄에 끝나고 파일 이름을로 복사 할 수 있습니다 w. 그런 다음 미니 버퍼에 붙여 넣을 수 있습니다.

파일 이름 입력을 없애는 또 다른 가능성은 표준 Emacs 미니 버퍼 파일 완성입니다. 파일 이름의 첫 문자를 입력 한 다음 TAB을 입력하십시오.


1
w(command dired-copy-filename-as-kill) 를 사용하여 현재 Dired 줄에서 파일 이름을 복사 할 수 있습니다 .
Drew

-1

이 질문은 기존 Emacs 명령을 요구합니다.

앞에서 언급했듯이 :

불행히도 이에 대한 준비된 명령이 없습니다.

이 질문에 대한 답으로 밝혀졌습니다.


유스 케이스를 완화하는 방법과 다른 제안 된 맞춤형 코딩 솔루션이 있으므로 귀하의 진술이 옳지 않다고 생각합니다. 즉시 사용 가능한 이맥스 방식을 요청하지 않았습니다 !
Dieter. 빌헬름

목적을 위해 기존 명령을 구체적으로 요청 했으므로이 대답은 정확합니다.
bignose
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.