미니 버퍼에 현재 파일의 전체 경로를 표시하는 기능


98

emacs로 편집중인 파일의 전체 경로를 가져와야합니다.

  • 그 기능이 있습니까?
  • 그렇지 않다면 그것을 얻기위한 elisp 함수는 무엇일까요?
  • 결과 (경로 이름)를 클립 보드에 복사하여 재사용 할 수있는 방법은 무엇입니까?

Mac OS X와 ​​Aqumacs를 사용하고 있습니다.

(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???

추가됨

(defun show-file-name ()
  "미니 버퍼에 전체 경로 파일 이름을 표시합니다."
  (인터렉티브)
  (메시지 (버퍼 파일 이름))
  (kill-new (파일-진실 이름 버퍼-파일-이름))
)
(global-set-key "\ C-cz" 'show-file-name)

내가 얻은 두 가지 대답을 결합하면 원하는 것을 얻을 수 있습니다. 답변 해 주셔서 감사합니다. 그리고 몇 가지 더 많은 질문.

  • (file-truename)은 무엇입니까?
  • 다른 앱에서 정보를 사용할 수 있도록 킬 링이 아닌 시스템 (OS)의 클립 보드에 경로 이름을 복사 할 수 있습니까?

답변:


91

buffer-file-name파일의 전체 경로를 제공 하는 내장 함수 입니다.

가장 좋은 방법은 emacs 창에 항상 시스템 이름과 현재 편집중인 버퍼의 전체 경로를 표시하도록하는 것입니다.

(setq frame-title-format
      (list (format "%s %%S: %%j " (system-name))
        '(buffer-file-name "%f" (dired-directory dired-directory "%b"))))

다음과 같이 할 수도 있습니다.

(defun show-file-name ()
  "Show the full path file name in the minibuffer."
  (interactive)
  (message (buffer-file-name)))

(global-set-key [C-f1] 'show-file-name) ; Or any other key you want

7
emacs에서 24 buffer-file-name는 변수입니다
barracel

5
...하지만 여전히 기능
phils

16
함수라면 왜 나타나지 M-x않습니까?
asmeurer 2014 년

8
asmeurer - 그것은 대화 형 아니기 때문에
벤 피츠 제럴드

2
@Talespin_Kit 네, 물론입니다. Elisp는 "lisp-1"과는 반대로 "lisp-2"입니다. 즉, 두 개의 독립적 인 이름 공간 (변수 및 함수)이 있습니다. 따라서 각 심볼에는 "기능 슬롯"과 "값 슬롯"이 있으며 액세스되는 슬롯은 컨텍스트에 따라 다릅니다. 실제로 많은 예제가 있습니다 (예 : 부 모드 이름은 함수와 변수가 될 것입니다). 이것이 funcall변수의 값으로 저장된 함수를 호출 하기 위해 like를 사용해야하는 이유이기도 foo합니다. 사용 (foo)했다면 foo값 슬롯 이 아닌 의 함수 슬롯을 사용 하기 때문입니다.
phils

73

Jérôme Radix의 답변에서 빌리려면 현재 버퍼의 파일 경로를 빠르게 보려면 M-: buffer-file-name.

또는 (buffer-file-name)버퍼에 어딘가에 입력 C-x C-e하고 닫는 괄호에서 실행 합니다 (이는 lisp 모드뿐만 아니라 모든 모드에서 작동합니다).


3
덕분에, 내가 생각 buffer-file-name하는 기능으로,하지만 표시되지 않습니다 M-x,하지만에 표시되는 M-:대로 emacs eval: 당신의 대답에, 내가 명령이 실행할 수 있습니다, 감사
PeterZD

6
예, M-x대화 형 함수 만 M-:실행하고 모든 elisp 함수를 실행합니다.
asmeurer

40

내 트릭은 C-x C-f파일을 여는 것과 같은 작업을 수행하는 것 C-g입니다. 종료 하려면 현재 파일 경로로 미니 버프를 미리 채워야합니다 . M-: buffer-file-name다른 어떤 방법보다 빠르지 만 훨씬 못 생겼습니다.


나도 이렇게합니다. 하드 코어 emacs-y는 아니지만 내가 신경 쓰는 것이 현재 파일의 경로뿐이라면 작동합니다.
andrunix

예를 들어 플러그인의 정의로 이동 기능을 사용하여 파일을 열고 A라고 말한 다음 B라고하는 다른 파일로 이동하면이 방법은 B가 아닌 A의 경로를 보여줍니다! 따라서이 답변은 항상 OP가 요구하는 것을 제공하지는 않습니다.
Abhishek Anand

4
CX 이력서는 당신에게뿐만 아니라 현재 경로하지만 현재 파일의 이름뿐만 아니라 표시됩니다
kuzzooroo

ido-mode가 아닌 사용자에게 적합한 @kuzzooroo (ido-mode를 사용하면 이름이 Cx Cf에 표시됨).
Julien Palard 2011

16

원하는 것을 직접 구현하는 방법은 다음과 같습니다.

(defun copy-full-path-to-kill-ring ()
  "copy buffer's full path to kill ring"
  (interactive)
  (when buffer-file-name
    (kill-new (file-truename buffer-file-name))))

즉, 미니 버퍼에있는 전체 경로를 얻을 수 있다는 것이 매우 유용하다는 것을 알았습니다. 이것이 제가 사용하는 것입니다.

(define-key minibuffer-local-completion-map "\C-r" 'resolve-sym-link)
(defun resolve-sym-link ()
  "Try to resolve symbolic links into true paths."
  (interactive)
  (beginning-of-line)
  (let* ((file (buffer-substring (point)
                                 (save-excursion (end-of-line) (point))))
         (file-dir (file-name-directory file))
         (file-true-dir (file-truename file-dir))
         (file-name (file-name-nondirectory file)))
    (delete-region (point) (save-excursion (end-of-line) (point)))
    (insert (concat file-true-dir file-name))))

그런 다음 클립 보드에 넣으려면 줄 ( C-a C-k)을 제거합니다. 그러나 위의 명령에서 클립 보드에 실제 이름을 쉽게 복사 할 수 있습니다. 마지막 줄을 다음과 같이 변경하면됩니다.

(insert (kill-new (concat file-true-dir file-name)))))

새로운 부분은 'kill-new킬 링에 문자열을 넣는 호출 입니다.


이 설정을 사용하는 방법을 자세히 설명해 주시겠습니까? "\ Cr"은 무엇을 의미합니까?
modeller

신경 쓰지 마. 나는 그것을 알아. ido 모드에서 파일을 가리킬 때 유용하다고 생각한 다음 Cr을 눌러 해당 파일의 전체 경로를 가져옵니다. 정말 유용합니다. 그러나 나는 아직도 왜 C 대신 \ C를 사용하는지 모르겠다.
modeller

11

추가 기능이 필요하지 않습니다.

M-! pwd

이것이 작동 할 수는 있지만 Windows 시스템에서는 작동하지 않으며 emacs의 현재 작업 디렉토리가 현재 버퍼 파일의 디렉토리와 다를 수 있다는 사실을 설명하지 못합니다. 을 사용하여 파일을 방문하여 C-x C-f, 실행 M-! pwd한 다음 M-x cd다른 디렉토리를 선택한 다음 M-! pwd다시 실행 하여 직접 확인할 수 있습니다 .
josaphatv

3

이미 오랫동안 사용중인 다음 코드가 있습니다. 모드 라인의 버퍼 이름에서 마우스 가운데 버튼을 누르면 전체 파일 경로를 킬 링으로 복사합니다. 모드 라인의 버퍼 이름에서 shift-mouse-2를 누르면 버퍼 이름 만 kill-ring에 복사됩니다.

(defun copy-buffer-file-name (event &optional bufName)
  "Copy buffer file name to kill ring.
If no file is associated with buffer just get buffer name.
"
  (interactive "eP")
  (save-selected-window
    (message "bufName: %S" bufName)
    (select-window (posn-window (event-start event)))
    (let ((name (or (unless bufName (buffer-file-name)) (buffer-name))))
      (message "Saved file name \"%s\" in killring." name)
      (kill-new name)
      name)))

(define-key mode-line-buffer-identification-keymap [mode-line mouse-2] 'copy-buffer-file-name)
(define-key mode-line-buffer-identification-keymap [mode-line S-mouse-2] '(lambda (e) (interactive "e") (copy-buffer-file-name e 't)))

3

C-x C-d를 통해 호출 할 수도있는 M-x list-directory은 현재 파일의 디렉토리를 표시하며 미니 버퍼를 지우려면 "Enter"키를 누르기 만하면됩니다. 자세한 내용은 여기에서 확인할 수 있습니다 .


내가 가장 좋아하는 대답은 간단하고 빠르고 쉽습니다!
ticktock

2

C-x C-b 해당하는 경우 버퍼 목록과 각 버퍼의 파일 경로를 보여줍니다.



1

다른 앱에서 정보를 사용할 수 있도록 킬 링이 아닌 시스템 (OS)의 클립 보드에 경로 이름을 복사 할 수 있습니까?

xclip (Linux), pbcopy (Mac), putclip (Cygwin)과 같은 것으로 쉘 아웃 할 수 있습니다.

나는 개인적으로 스크립트 랩퍼 사용 c하고 p사본을하고, 각각 표준 입력, 표준 출력에 후자의 기록에서 첫 번째 읽기를 붙여 넣습니다. 이렇게하면 모든 개발 플랫폼에서 작동합니다.

(shell-command (format "echo '%s' | c" buffer-file-name))

Emacs 클립 보드 지원을 사용하는 것보다 이것이 더 안정적이고 구성 가능하다고 생각합니다. 예를 들어, 내 c명령은 입력을 Linux의 3 개 클립 보드 (기본, 보조, 클립 보드) 모두에 복사하므로 Ctrl-V 또는 가운데 클릭으로 붙여 넣을 수 있습니다.


이것은 작동하지만 나에게는 그렇지 않습니다. (우분투 14.04.1.) 즉, date | xclip그리고 xclip file쉘에 입력하면 광고 등 모두 작업 (날짜 또는 주에 파일의 내용을 저장). 하지만 M-! 뒤에이 명령 중 하나를 입력하면 emacs에서는 (그리고 리턴을 누르십시오) 아무 일도 일어나지 않습니다. 커서는 더 많은 입력을 기대하는 것처럼 미니 버퍼에 남아 있습니다. 제어권을 되찾기 위해 인터럽트하면 기본에 hsas가 저장되지 않습니다.
Silvio Levy

좋아, 당신의 아이디어는 xclip 대신 xsel로 잘 작동합니다 .-- (shell-command (format "echo '%s' | xsel -i" buffer-file-name))그리고 대화 형 명령으로 만들면 (위의 @JeromeRadix가 가장 많이 찬성 한 답변에서 제안한 것처럼) 이것은 큰 승리입니다! 감사!
Silvio Levy

0

가장 간단한 방법은

(buffer-name)<(C-x)(C-e)> for the file name to appear in the echo area

(buffer-name)<(C-u)(C-x)(C-e)> would print the location <here>

Trey Jackson에서 빌려서 나는 이것을 생각해 냈습니다.

(defun buffer-kill-path ()
  "copy buffer's full path to kill ring"
  (interactive)
  (kill-new (buffer-file-name)))

사이트에서 더 많은 정보를 찾을 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.