将当前完整文件名和文件路径发送到剪贴板的最简单方法是什么?
我现在使用的是消息缓冲区:我复制保存文件后出现的文件名。但是,我想,应该有更简单的方法。
为什么没有人告诉简单的解决方案。
只需转到您需要的缓冲区,然后按 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 从文件缓冲区转到当前目录
我用这个:
(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))))
在 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))))
如果您想写入当前缓冲区的名称/路径,您可以键入
C-u M-:
,然后输入 (buffer-file-name)
- 表示完整路径 - 或 (buffer-name)
表示缓冲区名称。
即:
M-: + ellisp expression
计算迷你缓冲区中的省略表达式
C-u
将输出写入当前缓冲区
不能完全回答问题,但如果有人偶尔使用这个或其他函数,并且不喜欢在每次启动时初始化该函数,这可能会很有用。
在 Spacemacs 发行版中,您可以按 Spacefyy。它会显示许多您可以选择复制的选项(例如缓冲区名称、文件名、带有行号的文件路径等)。
spacemacs/copy-file-name
似乎源自这篇博文: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"))))
有一个 buffer-extension - 它具有
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))))
如果您使用 Doom Emacs,可以使用
SPC f y
来完成。
这里有很多好的答案,尽管我认为对于“最简单的方法”,如问题中所述,还有改进的空间。这是我想到的(感谢其他零碎的答案):
M-:
(kill-new (buffer-file-name))
RET
这正是您所要求的——获取当前缓冲区的文件名,并将其放入“杀环”中,并且根据您的设置,也放入系统剪贴板中。 (有关该部分的更多详细信息,请参阅 emacswiki/CopyAndPaste。)
如果您想定期执行此操作,那么设置一个如其他答案中列出的功能,并将其绑定到可用的按键序列,将使经常执行此操作变得更容易。但上面的方法无需事先设置,我将其解释为更“简单”。
要将当前文件路径粘贴到缓冲区中,我看到的最简单的方法是:
C-u M-! pwd
(但这可能不适用于 Windows 系统)。
或者,您可以使用
C-x C-b
显示所有打开的缓冲区的文件路径。
这在 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
文件中。
如果你使用evil,你会自动有两个寄存器来获取当前和“备用”文件路径(如果你切换到另一个缓冲区):%和#。您可以粘贴它们,例如与“%p ersp。”#p.