在微型缓冲区中显示当前文件的完整path的function

我需要得到我用emacs编辑的文件的完整path。

  • 有没有这个function?
  • 如果没有,那么elisp的function是什么?
  • 我怎样才能将结果(path名)复制到剪贴板,以便我可以重复使用它?

我正在使用Mac OS X和Aqumacs。

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

添加

 (defun show-file-name()
   “在minibuffer中显示完整的path文件名称。”
   (互动)
   (消息(缓冲文件名))
   (kill-new(file-truename buffer-file-name))
 )
 (全局设置键“\ C-cz”'show-file-name)

结合我得到的两个答案,我可以得到我想要的。 感谢您的答案。 还有一些问题。

  • 什么是(文件 – truename)?
  • 我可以将path名称复制到系统(OS)的剪贴板,而不是杀死环,以便我可以使用其他应用程序的信息?

这是内置的函数buffer-file-name ,可以为您提供文件的完整path。

最好的办法是让你的emacs窗口始终显示你的系统名和你正在编辑的缓冲区的完整path:

 (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 

借用JérômeRadix的答案,如果您只想快速查看当前缓冲区的文件path,可以使用M-: buffer-file-name

我的窍门是做一个Cx Cf就像打开一个文件,它将用当前文件pathCg来预填充minibuff。 比M-: buffer-file-name更快,但比其他任何方法都要糟得多。

直接执行你想要的是:

 (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)))) 

也就是说,我发现能够获得迷你缓冲器中的完整path非常有用,这就是我所使用的:

 (define-key minibuffer-local-completion-map "\Cr" '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)))) 

然后,如果我想在剪贴板中,我只是杀死线( Ca Ck )。 但是我们可以很容易地将truename复制到剪贴板上,只需将最后一行改为:

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

新的部分是'kill-new ,把string放在kill ring中。

我有以下代码已经在使用很长一段时间了。 当我在mode-line中按下缓冲区名称上的鼠标中键时,它将完整的文件path复制到kill ring。 当我按模式行中的缓冲区名称上的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))) 

不需要额外的function

 M-! pwd 

我可以将path名称复制到系统(OS)的剪贴板,而不是杀死环,以便我可以使用其他应用程序的信息?

你可以,如果你掏出像xclip(Linux),pbcopy(Mac),putclip(Cygwin)的东西。

我个人使用包装脚本cp分别进行复制和粘贴,第一次从标准input读取,后者写入标准输出。 这样,这可以在我所有的开发平台上运行:

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

我发现这比使用Emacs剪贴板支持更可靠和可configuration。 例如,我的c命令将input​​复制到Linux上的所有3个剪贴板(主,辅助,剪贴板),所以我可以使用Ctrl-V或中键单击进行粘贴。

Cx Cd也可以通过Mx list-directory调用,它会显示当前文件的目录,只需点击“Enter”键清除小缓冲区。 其他细节可在这里 。

最简单的方法,将是

 (buffer-name)<(Cx)(Ce)> for the file name to appear in the echo area (buffer-name)<(Cu)(Cx)(Ce)> 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))) 

您可以在网站上find更多信息

copy-buffer-file-name-as-kill from [0]完全符合你的需求。 它也可以select复制目录名称,或只是文件名。

[0] http://www.emacswiki.org/emacs/download/buffer-extension.el

Cx Cb显示适用的每个缓冲区的缓冲区列表和文件path。