在微型缓冲区中显示当前文件的完整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)的东西。
我个人使用包装脚本c
和p
分别进行复制和粘贴,第一次从标准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。