Emacs中剪贴板的文件路径

Dmy*_*sov 36 emacs

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

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

sco*_*zer 25

我用这个:

(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))))
Run Code Online (Sandbox Code Playgroud)

  • 你可以在没有临时缓冲区的情况下使用"kill-new":( let((x-select-enable-clipboard t))(kill-new filename)) (6认同)

Boz*_*sov 24

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))))
Run Code Online (Sandbox Code Playgroud)

  • 这也适用于'普通'emacs. (2认同)
  • `prelude-copy-file-name-to-clipboard` 命令不再是 Prelude 的一部分。正如删除它的提交的提交消息所建议的,请考虑使用 [`easy-kill`](https://github.com/leoliu/easy-kill) 包。 (2认同)

小智 19

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

那是:

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

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

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

  • 为了正确回答问题,可以使用"M-- CMk"(杀死最后一个性别).猜猜它有点麻烦,但可以用作宏. (2认同)
  • M-: (kill-new (buffer-file-name)) 获取剪贴板/kill-ring 的完整文件名/路径或 M-: (kill-new (buffer-name)) 只是文件名 (2认同)

Dag*_*ahl 12

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

该函数spacemacs/show-and-copy-buffer-filename似乎源于此博客文章:Emacs:显示缓冲区文件名.

(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"))))
Run Code Online (Sandbox Code Playgroud)


azz*_*msa 9

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

只需转至干燥的缓冲区,然后按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))
Run Code Online (Sandbox Code Playgroud)

PS:我个人使用Dired-Jump从文件缓冲区转到当前目录

  • 总形式为:`Cx Cj 0 w` (3认同)

Cth*_*utu 6

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


Ado*_*obe 5

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

编辑:

我用修改后的版本copy-buffer-file-name-as-kill来自buffer-extension.el:

(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))))
Run Code Online (Sandbox Code Playgroud)