将完整文件路径复制到剪贴板

9

我正在寻找一种方法,将我正在工作的文件的完整文件名保存到剪贴板中,以便能够切换到另一个程序并粘贴,例如'C:\some\path\file.txt'。

我尝试了以下方法,但实际上几乎没有任何效果:

(defun clip-file ()
  "Put the current file name on the clipboard"
  (interactive)
  (let ((filename (if (equal major-mode 'dired-mode)
                      (file-name-directory default-directory)
                    (buffer-file-name))))
    (when filename
      (x-select-text filename))))
x-select-text 函数源自于 interprogram-cut-function,在 Copy-shortcut M-w 的帮助文件中提到该变量包含一个函数,用于保存 kill-ring 到外部程序,这样就可以从 Emacs 中复制粘贴文本到 Firefox 等应用中。
由于我在 Windows-PC 上使用 Emacs,因此不确定 x-select-text 是否可用,因为据我所知它与 Linux 的 X-Server 有关?

1
你的代码看起来很好。x-*仍然用于非X-Window的东西。他们不时地通过创建一个更通用名称的函数来清理事物,而不带有x-。但在这种情况下,x-select-text就是那个函数。 - Drew
但是显然对我不起作用。你呢? - Peter Wildemann
1
是的,对我来说似乎很好用,适用于任何Emacs版本(20-24)。例如,在Emacs中使用那个命令,然后在其他Windows应用程序中使用C-v。但是,应该扩展default-directory,使用(expand-file-name default-directory)或更好的是(file-name-directory default-directory)(如果不想要最终的“/”,则可以使用(directory-file-name (file-name-directory default-directory)))。如果不扩展目录,你可能会得到~/foobar/,例如。 - Drew
1
如果您已经处于dired模式下,则不需要它。 w将复制文件名,c-u w将复制相对文件名,c-u 0 w将复制绝对文件名。 - user797257
好的,现在它可以工作了 :) 我的.emacs文件出了问题。 - Peter Wildemann
3个回答

6
(defun copy-buffer-file-name-as-kill (choice)
  "Copy the buffer-file-name to the kill-ring"
  (interactive "cCopy Buffer Name (F) Full, (D) Directory, (N) Name")
  (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)))
          (t (message "Quit")))
    (when new-kill-string
      (message "%s copied" new-kill-string)
      (kill-new new-kill-string))))

这个很好用,但把结果放在了kill ring而不是操作系统剪贴板(如请求者所需)。 - Phil Windley
我尝试将kill-new替换为x-select-text,但在Aquaemacs(GNU Emacs 23.4.1)中它没有起作用。 - Phil Windley
它在OSX Snow Leopard 10.6.8上与Emacs Trunk的开发者版本(使用--with-ns编译)完美运行 - 我可以将结果粘贴到任何应用程序中,例如另一个文本编辑器等。 - lawlist

6
我在搜索如何使用Spacemacs将文件路径复制到剪贴板时偶然发现了这个问题。为了完整起见,并帮助其他可能通过搜索找到这个问题的人们,请注意,Spacemacs已经将此功能绑定到:
SPC f y

4

我问题中提到的代码本身没有问题,实际上是我的.emacs文件配置有误,因为我没有正确重启Emacs导致了问题。

因此,请执行以下操作:

(defun clip-file ()
  "Put the current file name on the clipboard"
  (interactive)
  (let ((filename (if (equal major-mode 'dired-mode)
                      (file-name-directory default-directory)
                    (buffer-file-name))))
    (when filename
      (x-select-text filename))))

1
工作得很好!但我想知道能不能以某种方式复制它,从而能将其粘贴到emacs缓冲区中?它似乎被添加到了我的操作系统剪贴板中,但没有添加到emacs剪贴板中。通常当我复制一些东西时,我可以将其粘贴到emacs缓冲区中。 - modulitos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接