9

我经常需要获取当前打开文件的简单文本副本。原因通常是:

  • 我想将列表发送给同事
  • 我想记录我正在处理的任何事情(通常在组织文档中)
  • 我想在 shell 上对我当前打开的文件之一进行操作。我需要为此复制粘贴路径名。

事实是,通常buffer-menulist-buffers提供方便的菜单来导航打开的缓冲区,但将打开的文件的名称复制粘贴到终端或执行上述任何操作非常不方便。例如:我不能在一行中双击来选择完整的路径名,也不能使用kill/ yankemacs 序列来复制路径名。

摘要:我想要一种将打开文件列表导出到文本文件(或新缓冲区)的方法,而不需要其他数据;没有文件大小、模式或任何其他 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"))
4

3 回答 3

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")))
于 2012-05-10T16:05:38.970 回答
6

您可以更改*Buffer List*缓冲区的模式。默认情况下,它将处于 mode Buffer Menu,但将其更改为text-modeorfundamental-mode将删除所有允许您像常规缓冲区一样剪切和粘贴的特殊行为。元数据可以很容易地用delete-rectangle.

或者,您可以使用 elisp 以编程方式访问缓冲区列表:

(dolist (buffer (buffer-list))
  (when (buffer-file-name buffer)
    (insert (buffer-file-name buffer) "\n")))
于 2012-05-10T15:57:29.320 回答
1

您当然应该能够从缓冲区列表中复制和拉取。

例如,复制所有内容,C-xhM-w然后将其拉入新缓冲区进行编辑。

于 2012-05-10T21:28:44.307 回答