如何用elisp复制文件(非内容,非路径)到剪贴板?

使用场景:

在org中,有一个 [[file:d:/attach/file.txt][file.txt]] 这样的附件,我希望执行一个命令,可以获取当前光标下的路径,并复制此文件到系统剪贴板,在桌面上按C-v后,可以把这个文件复制到桌面,要如何实现?

罗嗦一点可以先link到dired 然后按 0 - w 复制这个文件的完整路径。

获取路径好弄,主要是怎么自动设置到剪贴板,使C-v的时候,能够粘贴文件?

直接在dired里移动或复制不行吗?为什么一定要到剪切板啊?

需要在桌面上找到某个文件,我通常是创建桌面快捷方式,而不是直接把文件复制到桌面去,这样感觉会把桌面搞乱

不一定是复制到桌面,也可能是其它地方或者直接C-v发送文件给别人

不习惯用dired,而且要切换到dired,定位到文件,按C,输入一串目标路径,回车,可能还要到文件管理器打开目标路径,感觉有点繁琐。

自从用了dired,知道有dired-dwim-target这个选项,我就很少用windows的文件管理器了,移动复制文件都是在dired里完成。

1赞

标题存在歧义。

在文件管理器中复制/剪切文件只是做标记,并没有把文件内容复制到剪贴板

建议标题改为:

- 如何用elisp复制文件到剪贴板?
+ 如何用elisp复制文件(非内容)到剪贴板?

否则你可能收到很多文不对题的答案。


你的这个需求,仅仅用 elisp 是做不到的,必须借助桌面提供 Api 来实现。

如果是 Windows 可参考 https://stackoverflow.com/questions/17189010/how-to-copy-cut-a-file-not-the-contents-to-the-clipboard-in-windows-on-the-com/29963268

Linux 桌面(KDE/Gnome)不知是不是集成 xclip,如果是的话,就直接用命令 https://linux.die.net/man/1/xclip-copyfile

可能是得写个外部程序来实现了。

(defun org-get-link-at-point ()
  "Get the link context at point"
  (interactive)
  (let* ((context (org-element-context))
	 (link (cadr context))
	 (type (plist-get link :type))
	 (path (plist-get link :path)))
    (kill-new (concat type ":" path))))

Edited for better coding style.