我需要获取我正在使用 emacs 编辑的文件的完整路径。
有那个功能吗?
如果不是,那么获得它的 elisp 函数是什么?
如何将结果(路径名)复制到剪贴板以便重复使用?
我正在使用 Mac OS X 和 Aqumacs。
(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???
添加
(defun show-file-name () "Show the full path file name in the minibuffer." (interactive) (message (buffer-file-name)) (kill-new (file-truename buffer-file-name)) ) (global-set-key "\C-cz" 'show-file-name)
结合我得到的两个答案,我可以得到我想要的。感谢您的回答。还有一些问题。
(file-truename) 有什么用?
我可以将路径名复制到系统(操作系统)的剪贴板,而不是杀伤环,以便我可以将信息与其他应用程序一起使用吗?
C-x C-f
吗?它不是为此而设计的,但它可以工作(用于此 gnu.org/software/emacs/manual/html_node/emacs/Visiting.html)
内置函数 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
借用 Jérôme Radix 的答案,如果您只想快速查看当前缓冲区的文件路径,可以执行 M-: buffer-file-name
。
或者,在缓冲区的某处键入 (buffer-file-name)
并在右括号上运行 C-x C-e
(这将在任何模式下工作,而不仅仅是 lisp 模式)。
buffer-file-name
是一个函数,但它没有出现在M-x
中,而是出现在M-:
中作为emacs eval
,我可以在那里运行命令,感谢你的回答:)
M-x
只运行交互式函数,而 M-:
运行任何 elisp 函数。
C-h v
并输入 buffer-file-name
为您提供变量的值和描述,并具有制表符补全的好处。
我的技巧是做一个 C-x C-f
喜欢打开一个文件,它会用当前文件路径预填充 minibuff,C-g
退出。比 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))))
也就是说,我发现能够获得 minibuffer 中内容的完整路径非常有用,这就是我使用的:
(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))))
然后,如果我想要它在剪贴板中,我只需删除该行(Ca Ck)。但是我们可以在上面的命令中轻松地将真名复制到剪贴板,只需将最后一行更改为:
(insert (kill-new (concat file-true-dir file-name)))))
新部分是对 'kill-new
的调用,它将字符串放入 kill ring 中。
无需额外功能,只需
M-! pwd
C-x C-f
访问文件,运行 M-! pwd
,然后 M-x cd
并选择不同的目录,然后再次运行 M-! pwd
来亲自看到这一点。
我有以下代码已经使用了很长时间。当我在模式行中的缓冲区名称上按下鼠标中键时,它会将完整文件路径复制到终止环。当我在模式行中的缓冲区名称上按 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)))
C-x C-b
显示缓冲区列表和每个缓冲区的文件路径(如果适用)。
C-x C-d
,也可通过 M-x list-directory
调用,将显示当前文件的目录,您只需按“Enter”键即可清除 minibuffer。提供更多详细信息here。
C-u C-x C-b
列出当前访问文件的缓冲区。
要做到标题所说的(在 minibuffer 中显示当前文件路径),您可以这样做:
M-x buffer-file-name
要在模式行中永久显示它,您可以使用以下命令:
(setq-default mode-line-buffer-identification
(list 'buffer-file-name
(propertized-buffer-identification "%12f")
(propertized-buffer-identification "%12b")))
或者这个(颜色+缩写):
(setq-default mode-line-buffer-identification
'((:eval
(list (propertize (abbreviate-file-name
(expand-file-name buffer-file-name))
'face 'font-lock-string-face)))))
我可以将路径名复制到系统(操作系统)的剪贴板,而不是杀伤环,以便我可以将信息与其他应用程序一起使用吗?
如果您使用 xclip (Linux)、pbcopy (Mac)、putclip (Cygwin) 之类的东西,则可以。
我个人使用包装脚本 c
和 p
分别进行复制和粘贴,第一次读取标准输入,后者写入标准输出。这样,这适用于我所有的开发平台:
(shell-command (format "echo '%s' | c" buffer-file-name))
我发现这比使用 Emacs 剪贴板支持更可靠且可配置。例如,我的 c
命令将输入复制到 Linux 上的所有 3 个剪贴板(主、辅助、剪贴板),因此我可以使用 Ctrl-V 或中键进行粘贴。
date | xclip
和 xclip file
都可以像宣传的那样工作(将文件的日期或内容存储到主文件)。但是,如果我在 M- 之后键入这些命令中的任何一个!在 emacs 中(并按回车键)没有任何反应;光标保留在 minibuffer 中,就好像期待更多输入一样;如果我中断以重新获得控制权,则没有任何内容存储在初级中。
(shell-command (format "echo '%s' | xsel -i" buffer-file-name))
- 当做成交互式命令时(如上面@JeromeRadix 最赞成的回答中所建议的那样),这是一个大胜利!谢谢!
最简单的方法是
(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)))
您可以在 site 上找到更多信息
[0] 中的 copy-buffer-file-name-as-kill
完全符合我的想法。它还可以选择仅复制目录名或文件名。
[0] http://www.emacswiki.org/emacs/download/buffer-extension.el
不定期副业成功案例分享
buffer-file-name
是一个变量M-x
中?funcall
之类的函数来调用存储为变量foo
的值的函数,因为如果您使用(foo)
,您将使用foo
的函数槽而不是比价值槽。