Emacs中剪贴板的文件路径

时间:2010-03-10 12:02:48

标签: emacs

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

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

9 个答案:

答案 0 :(得分:24)

我用这个:

(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))))

答案 1 :(得分:23)

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))))

答案 2 :(得分:17)

如果要编写当前缓冲区的名称/路径,可以键入C-u M-:,然后键入(buffer-file-name) - 表示完整路径 - 或(buffer-name)表示缓冲区名称。< / p>

那是:

M-: + ellisp expression评估迷你缓冲区中的ellisp表达式

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

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

答案 3 :(得分:12)

在Spacemacs发行版中,您可以按 Space f y 在迷你缓冲区中显示缓冲区名称并将其复制到kill ring

函数spacemacs/show-and-copy-buffer-filename似乎源于此博文:Emacs: Show Buffer File Name

(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"))))

答案 4 :(得分:6)

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

只需转到干缓冲区,然后按 0 w C-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从文件缓冲区转到当前目录

答案 5 :(得分:5)

有一个buffer-extension - 它有copy-buffer-file-name-as-kill个功能。它甚至会询问您要复制的内容:名称,全名或目录名称。

修改

我使用buffer-extension.el的修改版copy-buffer-file-name-as-kill

(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 :(得分:0)

要将当前文件路径粘贴到缓冲区中,我看到的最简单的方法是:C-u M-! pwd(不过这可能不适用于 Windows 系统)。

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

答案 7 :(得分: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 文件中。

答案 8 :(得分:0)

如果您使用 Doom Emacs,则可以使用 SPC f y 来完成。