4

我正在使用tmux许多窗口,而且我经常忘记我在 vim 中编辑的文件。我想打开另一个 shell,它运行一个脚本,告诉我 vim 当前正在编辑的文件的路径。

我正在运行 Mac OS。

4

3 回答 3

1

我解决这个问题的方法是查询所有远程 Vim 进程的打开缓冲区。为此,您可以使用 Vim 的客户端服务器功能。GVIM 服务器名称通常按顺序命名:GVIM, GVIM1, ...; 对于终端 Vim,您必须使用--servername参数命名它们(例如通过 shell 别名)。

然后,您可以通过--remote-expr参数查询打开的文件列表。遍历所有列出的缓冲区的简单表达式(如:ls命令所示)是:

map(filter(range(1, bufnr('$')), 'buflisted(v:val) && ! empty(bufname(v:val))'), 'bufname(v:val)')

如您所见,它有点复杂,可能会影响您启动 Vim 的工作流程。仔细想想你是否真的需要这个!

于 2013-09-16T11:34:38.720 回答
0

我知道没有办法从外部进程获取每个打开的 vim 缓冲区。您可以拥有一个 vim 实例并使用andvim编辑多个单独的文件,而不是使用单独的 tmux 布局和单独的实例来编辑多个文件。然后在该 vim 实例中,您可以使用查看所有打开文件相对于当前工作目录的路径。 也有效。:split:tabnew:ls:pwd

如果这不是您的风格并且您仍想vim在单独的布局中使用,您可以使用ps来查看每个vim进程的参数并检查这些进程的 cwd。就像是:

paste <(pgrep vim | xargs pwdx) <(pgrep vim | xargs ps -o %a | sed 1d)

请注意,如果您在 vim 中使用多个缓冲区,则上述内容将无法正常工作,因为它只会列出为每个vim命令提供的参数,而不会列出实际的缓冲区。

于 2013-09-15T20:54:12.917 回答
0

您可以调整ps -eF | grep vim脚本的管道命令。在每一行的最后,你会看到处理与“vim”相关的任何事情的不同进程。因此,您会发现 vim 当前正在编辑哪些文件(例如,'vim foo.txt'),以及为获得此结果而处于活动状态的 'grep vim'。要获得漂亮的输出,您必须使用脚本过滤所有这些。我希望这能帮到您。

于 2013-09-15T20:55:10.910 回答