我经常需要获取当前打开文件的简单文本副本。原因通常是:
事实是,通常的buffer-menu
或list-buffers
提供了一个方便的菜单来导航打开的缓冲区,但是将打开的文件的名称复制粘贴到终端是非常不方便的,或者执行上述任何操作。例如:我无法在一行中双击以选择完整的路径名,我无法使用kill
/ yank
emacs序列来复制路径名。
总结:我想要一种方法将打开文件列表导出到文本文件(或新缓冲区),而不需要其他数据;没有文件大小,模式或任何其他emacs元数据。
是否有命令?我可以安装一个额外的包吗?
添加Trey Jackson的解决方案,经过修改后提供了一些反馈:
(defun copy-open-files ()
"Add paths to all open files to kill ring"
(interactive)
(kill-new (mapconcat 'identity
(delq nil (mapcar 'buffer-file-name (buffer-list)))
"\n"))
(message "List of files copied to kill ring"))
答案 0 :(得分:9)
此命令将为您完成任务:
(defun copy-open-files ()
"Add paths to all open files to kill ring"
(interactive)
(kill-new (mapconcat 'identity
(delq nil (mapcar 'buffer-file-name (buffer-list)))
"\n")))
答案 1 :(得分:6)
您可以更改*Buffer List*
缓冲区的模式。默认情况下,它将处于Buffer Menu
模式,但将其更改为text-mode
或fundamental-mode
将删除所有特殊行为,允许您像常规缓冲区一样从中剪切和粘贴。可以使用delete-rectangle
轻松删除元数据。
或者,您可以使用elisp:
以编程方式访问缓冲区列表(dolist (buffer (buffer-list))
(when (buffer-file-name buffer)
(insert (buffer-file-name buffer) "\n")))
答案 2 :(得分:1)
你当然应该可以从缓冲区列表中复制和抽取。
e.g。用 C-x h M-w 复制所有内容,然后进入新的缓冲区进行编辑。