Emacs中剪贴板的文件路径

Emacs中剪贴板的文件路径,emacs,Emacs,将当前完整文件名和文件路径发送到剪贴板的最简单方法是什么 我现在使用的是消息缓冲区:我复制保存文件后出现的文件名。但是,我想应该有更简单的方法。我用这个: (defun my-put-file-name-on-clipboard () "Put the current file name on the clipboard" (interactive) (let ((filename (if (equal major-mode 'dired-mode)

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

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

我用这个:

(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))))
有一个-并且它有
复制缓冲区文件名作为kill
函数。它甚至会询问您要复制什么:名称、全名或目录名

编辑

我使用修改版本的
将缓冲区文件名复制为kill
from:

(将复制缓冲区文件名定义为kill(选项)
将缓冲区{name/mode}、文件{name/full path/directory}复制到kill环
(交互式“cCopy(b)缓冲区名称,(m)缓冲区主模式,(f)完整缓冲区文件路径,(d)缓冲区文件目录,(n)缓冲区文件基本名称”)
(let)((新压井管柱)
(名称(如果(均衡器主模式“直接模式”)
(直接获取文件名)
(或(缓冲区文件名“”))
(条件((等式选择?f)
(setq新压井管柱名称)
((情商选择?d)
(setq新kill字符串(文件名目录名)))
((eq选择?n)
(setq新kill字符串(文件名非目录名)))
((情商选择?b)
(setq新终止字符串(缓冲区名称)))
((eq选择?m)
(setq新终止字符串(格式“%s”主模式)))
(t(信息“退出”))
(当新压井管柱
(消息“%s已复制”新终止字符串)
(压井新压井管柱)))
在我使用中:


如果要写入当前缓冲区的名称/路径,可以键入
C-u M-:
,然后键入
(缓冲区文件名)
-作为完整路径,或者键入
(缓冲区名)
(缓冲区名)

即:

M-:+ellisp表达式
计算小缓冲区中的ellisp表达式

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


不完全回答此问题,但如果有人偶尔使用此功能或其他功能,并且不希望在每次启动时初始化该功能,则可能会很有用。

在Spacemacs发行版中,您可以按Spacefyy在minibuffer中显示缓冲区名称,并将其复制到kill ring

该函数似乎源于此博客文章:


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

只需转到你的直接缓冲区,然后按0W或C-U0W

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

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

PS:就我个人而言,我使用dired jump从文件缓冲区转到当前目录,将当前文件路径粘贴到缓冲区中,我看到的最简单的方法是:
C-u M-!pwd
(但这在Windows系统上可能不起作用)


或者,您可以使用
C-x C-b
显示所有打开缓冲区的文件路径。

这就是我在MacOS 10.15.7、GNU Emacs 27.1上的工作原理

(取消复制当前缓冲区文件名()
(互动)
(shell命令(concat“echo”(缓冲区文件名)| pbcopy”))
将keybinding设置为“C-x M-f”:

(全局设置键(kbd“C-x M-f”)'复制当前缓冲区文件名)

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

如果您使用Doom Emacs,可以使用
SPC f y

完成,而无需临时缓冲区,使用“kill new”(let((x-select-enable-clipboard t))(kill new filename))为了正确回答这个问题,可以在后面使用
M--C-M-k
(杀死最后一个sexp)。我猜它有点麻烦,但可以用作宏。M-:(kill new(缓冲区文件名))获取剪贴板的完整文件名/路径/kill ring或M-:(kill new(缓冲区名称))仅获取文件名
prelude将文件名复制到剪贴板
命令不再是prelude的一部分。正如提交的提交消息所建议的,删除它,考虑使用包。这个实现的源是短的和甜的。我会复制/粘贴到这里,这样如果链接更改,答案仍然可用。“我最喜欢这段代码了。”这是一个很好的建议。我注意到该函数最初是由其他人编写的,因此我也在该博客文章中添加了一个礼貌性链接;e、 例如,
SPC f y
复制完整路径,并且
SPC f y
复制相对于存储库根的路径。非常好!总格式为:
C-x C-j 0 w
而不是
my/dired copy dirname as kill
,您还可以使用
C-x C-j C-x C-j C-0 w
获取目录路径。
(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"))))
(defun my/dired-copy-dirname-as-kill ()
  "Copy the current directory into the kill ring."
  (interactive)
  (kill-new default-directory))