在微型缓冲区中显示当前文件的完整路径的函数

我需要得到我用 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)

把我得到的两个答案结合起来,我就能得到我想要的。谢谢你的回答。还有一些问题。

  • 什么是(文件-真实名称) ?
  • 我可以复制路径名称到系统(操作系统)的剪贴板,而不是杀死环,以便我可以使用其他应用程序的信息?
56925 次浏览

你想要的直接实现是:

(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的调用,它将字符串放在 kill ring 中。

它是内置的函数 buffer-file-name,它为您提供文件的完整路径。

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

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

You can also do something like this :

(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 模式)。

我的诀窍是做一个 C-x C-f喜欢打开一个文件,它会预先填充当前文件路径的 minibuff,C-g退出。比 M-: buffer-file-name快,但比其他方法丑得多。

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

如果您使用的是 xlip (Linux)、 pbcopy (Mac)、 putlip (Cygwin)之类的 shell,那么就可以这样做。

I personally use wrapper scripts c and p for copy and paste respectively, the first reading from standard input, the latter writing to standard output. That way, this works on all my development platforms:

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

I find this more reliable and configurable than using the Emacs clipboard support. For example, my c command copies the input to all 3 clipboards on Linux (primary, secondary, clipboard), so I can paste with either Ctrl-V or middle click.

我有以下代码已经使用了很长时间。 当我在模式行中按下缓冲区名称上的鼠标中键时,它将完整的文件路径复制到终止环。当我在模式行的 buffer-name 上按 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)))

最简单的方法就是

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

向特雷 · 杰克逊借钱 我想到了这个:

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

你可以在 工地上找到更多的信息

copy-buffer-file-name-as-kill从[0]正是你需要的,我认为。它还可以选择只复制目录名或只复制文件名。

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

C-x C-b显示了缓冲区的列表以及适用的每个缓冲区的文件路径。

C-x C-d也可以通过 M-x list-directory调用,它将向您显示当前文件的目录,您只需按下“ Enter”键就可以清除 minibuffer。其他详细信息可以在 给你中找到。

不需要额外的功能

M-! pwd

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

或者这个(color + abbrev) :

(setq-default mode-line-buffer-identification
'((:eval
(list (propertize (abbreviate-file-name
(expand-file-name buffer-file-name))
'face 'font-lock-string-face)))))