最简单的方法是将当前完整文件名和文件路径发送到剪贴板,我现在使用的是消息缓冲区:我复制出现在那里的文件名,保存文件后。但是,我认为应该有更简单的方法。
最简单的方法是将当前完整文件名和文件路径发送到剪贴板,我现在使用的是消息缓冲区:我复制出现在那里的文件名,保存文件后。但是,我认为应该有更简单的方法。
为什么没有人告诉我简单的解决方案。
只需进入您的dired缓冲区,然后按下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从文件缓冲区跳转到当前目录
C-x C-j 0 w
- LionKimbroC-x C-j C-x C-j C-0 w
来获取目录的路径,而不是使用 my/dired-copy-dirname-as-kill
。 - Ben我使用这个:
(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表达式
会在迷你缓冲区中评估一个ellisp表达式
C-u
将输出写入当前缓冲区
M-- C-M-k
(杀死上一个sexp)。猜想这有点繁琐,但可以用作宏。 - rsennaspacemacs/copy-file-name
函数似乎源自这篇博客文章: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"))))
SPC f y
会带出许多选项;例如,SPC f y y
会复制完整路径,而SPC f y Y
则会复制相对于存储库根目录的路径。非常方便! - Fred SchoenSPC f y
完成。这里有一个名为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))))
这里有很多好的答案,但我认为对于问题中描述的“最简单的方法”,还有改进的空间。以下是我想出来的(感谢其他答案提供的部分):
M-: (kill-new (buffer-file-name))
RET
这正是你要求的--获取当前缓冲区的文件名,并将其放入“kill ring”中,根据你的设置,也可能放入系统剪贴板。(有关此部分的更多详细信息,请参见emacswiki/CopyAndPaste。)
如果您想经常执行此操作,则设置一个类似其他答案中列出的函数,并将其绑定到可用的键序列上,将使其更容易频繁执行。但以上操作无需任何先前设置,我认为这更“简单”。
C-r
很搭配,尤其是如果您持久保存它的话。 - joao将当前文件路径粘贴到缓冲区中,我看到最简单的方法是执行: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
文件中。