【问题标题】:Copy full file path into Copy-Paste-Clipboard将完整文件路径复制到复制粘贴剪贴板
【发布时间】:2013-09-15 13:29:27
【问题描述】:

我正在寻找一种方法来将我正在处理的文件的当前完整文件名保存到我的复制粘贴缓冲区中,以便能够切换到另一个程序并粘贴例如'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 复制粘贴到例如火狐。

我在我的 Windows-PC 上使用 Emacs,因此我不确定 x-select-text 是否可以工作,因为 AFAIK 它与 Linux 的 X-Server 有关?

【问题讨论】:

  • 您的代码对我来说看起来不错。 x-* 仍然用于非 X-Window 的东西。他们不时通过创建一个没有x- 的更通用名称的函数来清理内容。但在这种情况下,x-select-text 是唯一的。
  • 但这显然对我不起作用。适合你吗?
  • 是的,它对我来说似乎工作正常,任何 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/
  • 如果您已经处于 dired 模式,则不需要它。 w 将复制文件名,c-u w 将复制相对文件名,c-u 0 w 将复制绝对文件名。
  • 好的,现在可以了 :) 我的 .emacs 文件有问题

标签: emacs clipboard


【解决方案1】:
(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 而不是 OS 剪贴板中(如请求者所愿)。
  • 我尝试用 x-select-text 替换 kill-new 但它在 Aquaemacs (GNU Emacs 23.4.1) 中不起作用
  • 它与 OSX Snow Leopard 10.6.8 上的 Emacs Trunk 开发人员构建(构建 --with-ns)完美(“原样”)工作——我可以将结果粘贴到任何应用程序中,例如作为另一个文本编辑器等。
【解决方案2】:

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

SPC f y

【讨论】:

    【解决方案3】:

    我的问题中提到的代码有效,这是我的 .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))))
    

    【讨论】:

    • 效果很好!但我想知道是否有一种方法可以将它复制到我可以将其粘贴到 emacs 缓冲区中?它似乎被添加到我的操作系统的剪贴板,但没有被添加到 emacs 剪贴板。通常当我复制某些内容时,我可以将其粘贴到 emacs 缓冲区中。
    猜你喜欢
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2014-03-08
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多