Emacs 显示当前文件的函数';s在小缓冲区中的完整路径

Emacs 显示当前文件的函数';s在小缓冲区中的完整路径,emacs,elisp,clipboard,aquamacs,Emacs,Elisp,Clipboard,Aquamacs,我需要获得使用emacs编辑的文件的完整路径 有这样的功能吗 如果没有,elisp函数将如何获得该值 如何将结果(路径名)复制到剪贴板以便重用 我正在使用MacOSX和Mac (setq filepath (get-fullpath-current-file)) ??? (copy-to-clipboard 'filepath) ??? 补充 (取消显示文件名() “在小缓冲区中显示完整路径文件名。” (互动) (消息(缓冲区文件名)) (kill new(文件truename缓冲区文件名

我需要获得使用emacs编辑的文件的完整路径

  • 有这样的功能吗
  • 如果没有,elisp函数将如何获得该值
  • 如何将结果(路径名)复制到剪贴板以便重用
我正在使用MacOSX和Mac

(setq filepath (get-fullpath-current-file)) ???
(copy-to-clipboard 'filepath) ???
补充 (取消显示文件名() “在小缓冲区中显示完整路径文件名。” (互动) (消息(缓冲区文件名)) (kill new(文件truename缓冲区文件名)) ) (全局设置键“\C-cz”显示文件名) 结合我得到的两个答案,我可以得到我想要的。谢谢你的回答。还有一些问题

  • (文件名)的用途是什么
  • 我是否可以将路径名复制到系统(OS)的剪贴板,而不是kill ring,以便将该信息与其他应用程序一起使用

直接实现您想要的是:

(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))))
然后,如果我想把它放在剪贴板上,我就把这行删掉(C-a C-k)。但我们可以在上面的命令中轻松地将truename复制到剪贴板,只需将最后一行更改为:

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

新的部分是调用kill-new,它将字符串放入kill环。

是内置函数
缓冲文件名
提供文件的完整路径

最好的办法是让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


或者,在缓冲区的某处键入
(缓冲区文件名)
,然后在右括号上运行
C-x C-e
(这将在任何模式下工作,而不仅仅是lisp模式)

我的诀窍是做一个
C-xc-f
像打开一个文件一样,它会用当前文件路径预先填充迷你buff,
C-g
退出。比
M-:buffer file name
更快,但比任何其他方法都难看得多

我是否可以将路径名复制到系统(OS)的剪贴板,而不是kill ring,以便将该信息与其他应用程序一起使用

如果您使用xclip(Linux)、pbcopy(Mac)、putclip(Cygwin)之类的工具,您就可以这样做

我个人使用包装脚本
c
p
分别进行复制和粘贴,第一次读取标准输入,第二次写入标准输出。这样,我的所有开发平台都可以使用:

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

我发现这比使用Emacs剪贴板支持更可靠、更可配置。例如,我的
c
命令将输入复制到Linux上的所有3个剪贴板(主剪贴板、次剪贴板、剪贴板),因此我可以使用Ctrl-V或中键单击进行粘贴。

我的以下代码已经使用了很长时间。 当我在模式行中按下缓冲区名称上的鼠标中键时,它会将完整文件路径复制到kill环。当我在模式行中按下shift-mouse-2键时,它只将缓冲区名称复制到kill环

(定义复制缓冲区文件名(事件和可选bufName)
“将缓冲区文件名复制到kill ring。
如果没有与缓冲区关联的文件,只需获取缓冲区名称。
"
(互动“eP”)
(保存所选窗口)
(消息“bufName:%S”bufName)
(选择窗口(posn窗口(事件开始事件)))
(let((名称(或(除非bufName(缓冲区文件名))(缓冲区名称)))
(killring.name中的消息“已保存文件名\%s\”)
(删除新名称)
(姓名)
(定义键模式行缓冲区标识键映射[模式行鼠标-2]'复制缓冲区文件名)
(定义键模式行缓冲区标识键映射[mode line S-mouse-2]'(lambda(e)(交互式“e”)(复制缓冲区文件名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>

您可以找到有关复制缓冲区文件名的更多信息,因为[0]中的kill
正是您所需要的。它还可以选择只复制目录名或文件名


[0]

C-x C-b
显示缓冲区列表和每个缓冲区的文件路径(如果适用)。

C-x C-d
,也可通过
M-x列表目录调用,将显示当前文件的目录,您只需点击“回车”键即可清除小缓冲区。其他详细信息可用。

无需额外功能,只需

M-! pwd

C-u C-x C-b
列出当前访问文件的缓冲区

要执行标题所述的操作(在微型缓冲区中显示当前文件路径),可以执行以下操作:

M-x buffer-file-name
要在模式行中永久显示,可以使用以下命令:

(setq-default mode-line-buffer-identification
              (list 'buffer-file-name
                    (propertized-buffer-identification "%12f")
                    (propertized-buffer-identification "%12b")))
或者这个(颜色+缩写):


在emacs 24
中,缓冲区文件名是一个变量……但仍然是一个函数如果它是一个函数,那么为什么它不出现在
M-x
?asmurer中?因为它不是interactive@Talespin_Kit是的,绝对是。Elisp是“lisp-2”而不是“lisp-1”,这意味着有两个独立的名称空间(变量和函数)。因此,每个符号都有一个“功能槽”和一个“值槽”,访问哪个槽取决于上下文。实践中有许多示例(例如,任何次要模式名称都将是函数和变量)。这也是为什么您需要使用
funcall
调用存储为变量
foo
值的函数的原因,因为如果您使用
(foo)
,您将使用
foo
的函数槽,而不是值槽。这应该可以工作,但对我来说不行。(Ubuntu 14.04.1.)也就是说,
date | xclip
xclip file
如果在shell中键入,它们都可以按照广告的方式工作(将日期或文件内容存储到主文件)。但是如果我在M-之后键入这两个命令中的任何一个!在emacs中(并点击retur
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)))))