显示当前文件在迷你缓冲区中的完整路径的功能

问题描述 投票:0回答:14

我需要获取我正在使用 emacs 编辑的文件的完整路径。

  • 有这个功能吗?
  • 如果没有,那么 elisp 函数可以得到什么?
  • 如何将结果(路径名)复制到剪贴板以便可以重复使用?

我使用的是 Mac OS X 和 Aqumacs。

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

已添加

(defun 显示文件名 ()
  “显示迷你缓冲区中的完整路径文件名。”
  (交互的)
  (消息(缓冲区文件名))
  (kill-new (文件真实名称缓冲区文件名称))
)
(全局设置键“\C-cz”'显示文件名)

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

  • (文件真实名称)有什么用?
  • 我可以将路径名复制到系统(操作系统)的剪贴板,而不是杀戮环,以便我可以在其他应用程序中使用该信息吗?
emacs elisp clipboard aquamacs
14个回答
111
投票

内置函数

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

88
投票

借用Jérôme Radix的答案,如果你只是想快速查看当前缓冲区的文件路径,你可以这样做

M-: buffer-file-name

或者,在缓冲区中的某处输入

(buffer-file-name)
并在右括号上运行
C-x C-e
(这适用于任何模式,而不仅仅是 lisp 模式)。


45
投票

我的技巧是像打开文件一样执行

C-x C-f
,它会用当前文件路径预填充minibuff,
C-g
退出。比
M-: buffer-file-name
快,但比任何其他方法都丑陋得多。


17
投票

你想要的直接实现是:

(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
的调用,它将字符串放入终止环中。


13
投票

无需额外功能,只需

M-! pwd

5
投票

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


5
投票

C-x C-d
,也可通过
M-x list-directory
调用,将显示当前文件的目录,您只需按“Enter”键即可清除迷你缓冲区。更多详细信息请参见此处


4
投票

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

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

4
投票

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


2
投票

最简单的方法是

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

您可以在网站

找到更多信息

1
投票

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

如果您使用 xclip (Linux)、pbcopy (Mac)、putclip (Cygwin) 等工具,就可以实现。

我个人使用包装脚本

c
p
分别进行复制和粘贴,首先从标准输入读取,后者写入标准输出。这样,这适用于我所有的开发平台:

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

我发现这比使用 Emacs 剪贴板支持更可靠且可配置。例如,我的

c
命令将输入复制到 Linux 上的所有 3 个剪贴板(主要、辅助、剪贴板),因此我可以使用 Ctrl-V 或中键单击进行粘贴。


1
投票
我认为来自 [0] 的

copy-buffer-file-name-as-kill
正是您所需要的。它还可以选择仅复制目录名或仅复制文件名。

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


0
投票

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

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

0
投票

如果你使用evil,你可以使用:reg(ister)来显示evil寄存器。 % 将是当前路径,您也可以使用它粘贴到当前缓冲区(或 # 如果您更改了缓冲区)。

© www.soinside.com 2019 - 2024. All rights reserved.