Emacs 中剪贴板的文件路径

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

将当前完整文件名和文件路径发送到剪贴板的最简单方法是什么?

我现在使用的是消息缓冲区:我复制保存文件后出现的文件名。但是,我想,应该有更简单的方法。

emacs
11个回答
49
投票

为什么没有人告诉简单的解决方案。

只需转到您需要的缓冲区,然后按 0 wC-u 0 w

这将调用

dired-copy-filename-as-kill
,它会为您提供文件的完整路径。如果您想要当前目录,只需删除其末尾的文件,或者您可以使用下面的功能,然后将其绑定到您喜欢的任何键。

(defun my/dired-copy-dirname-as-kill ()
  "Copy the current directory into the kill ring."
  (interactive)
  (kill-new default-directory))

PS:我个人使用 dired-jump 从文件缓冲区转到当前目录


33
投票

我用这个:

(defun my-put-file-name-on-clipboard ()
  "Put the current file name on the clipboard"
  (interactive)
  (let ((filename (if (equal major-mode 'dired-mode)
                      default-directory
                    (buffer-file-name))))
    (when filename
      (with-temp-buffer
        (insert filename)
        (clipboard-kill-region (point-min) (point-max)))
      (message filename))))

27
投票

Emacs Prelude 中我使用:

(defun prelude-copy-file-name-to-clipboard ()
  "Copy the current buffer file name to the clipboard."
  (interactive)
  (let ((filename (if (equal major-mode 'dired-mode)
                      default-directory
                    (buffer-file-name))))
    (when filename
      (kill-new filename)
      (message "Copied buffer file name '%s' to the clipboard." filename))))

23
投票

如果您想写入当前缓冲区的名称/路径,您可以键入

C-u M-:
,然后输入
(buffer-file-name)
- 表示完整路径 - 或
(buffer-name)
表示缓冲区名称。

即:

M-: + ellisp expression
计算迷你缓冲区中的省略表达式

C-u
将输出写入当前缓冲区

不能完全回答问题,但如果有人偶尔使用这个或其他函数,并且不喜欢在每次启动时初始化该函数,这可能会很有用。


18
投票

在 Spacemacs 发行版中,您可以按 Spacefyy。它会显示许多您可以选择复制的选项(例如缓冲区名称、文件名、带有行号的文件路径等)。

函数

spacemacs/copy-file-name
似乎源自这篇博文:Emacs:显示缓冲区文件名

(defun camdez/show-buffer-file-name ()
  "Show the full path to the current file in the minibuffer."
  (interactive)
  (let ((file-name (buffer-file-name)))
    (if file-name
        (progn
          (message file-name)
          (kill-new file-name))
      (error "Buffer not visiting a file"))))

6
投票

有一个 buffer-extension - 它具有

copy-buffer-file-name-as-kill
功能。它甚至会询问您要复制什么:姓名、全名或目录名称。

编辑

我使用来自

copy-buffer-file-name-as-kill
buffer-extension.el
的修改版本:

(defun copy-buffer-file-name-as-kill (choice)
  "Copyies the buffer {name/mode}, file {name/full path/directory} to the kill-ring."
  (interactive "cCopy (b) buffer name, (m) buffer major mode, (f) full buffer-file path, (d) buffer-file directory, (n) buffer-file basename")
  (let ((new-kill-string)
        (name (if (eq major-mode 'dired-mode)
                  (dired-get-filename)
                (or (buffer-file-name) ""))))
    (cond ((eq choice ?f)
           (setq new-kill-string name))
          ((eq choice ?d)
           (setq new-kill-string (file-name-directory name)))
          ((eq choice ?n)
           (setq new-kill-string (file-name-nondirectory name)))
          ((eq choice ?b)
           (setq new-kill-string (buffer-name)))
          ((eq choice ?m)
           (setq new-kill-string (format "%s" major-mode)))
          (t (message "Quit")))
    (when new-kill-string
      (message "%s copied" new-kill-string)
      (kill-new new-kill-string))))

6
投票

如果您使用 Doom Emacs,可以使用

SPC f y
来完成。


4
投票

这里有很多好的答案,尽管我认为对于“最简单的方法”,如问题中所述,还有改进的空间。这是我想到的(感谢其他零碎的答案):

M-:

(kill-new (buffer-file-name))
RET

这正是您所要求的——获取当前缓冲区的文件名,并将其放入“杀环”中,并且根据您的设置,也放入系统剪贴板中。 (有关该部分的更多详细信息,请参阅 emacswiki/CopyAndPaste。)

如果您想定期执行此操作,那么设置一个如其他答案中列出的功能,并将其绑定到可用的按键序列,将使经常执行此操作变得更容易。但上面的方法无需事先设置,我将其解释为更“简单”。


0
投票

要将当前文件路径粘贴到缓冲区中,我看到的最简单的方法是:

C-u M-! pwd
(但这可能不适用于 Windows 系统)。

或者,您可以使用

C-x C-b
显示所有打开的缓冲区的文件路径。


0
投票

这在 MacOS 10.15.7、GNU Emacs 27.1 上对我有用

(defun copy-current-buffer-file-name ()
  (interactive)
  (shell-command (concat "echo " (buffer-file-name) " | pbcopy")))

将键绑定设置为“C-x M-f”:

(global-set-key (kbd "C-x M-f") 'copy-current-buffer-file-name)

仅供参考:对于真正的初学者阅读本文,您需要将这些行添加到您的

init.el
文件中。


0
投票

如果你使用evil,你会自动有两个寄存器来获取当前和“备用”文件路径(如果你切换到另一个缓冲区):%和#。您可以粘贴它们,例如与“%p ersp。”#p.

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