我可以编写一个脚本来告诉我当前正在vim中编辑哪些文件吗?

时间:2013-09-15 20:30:48

标签: vim

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

我正在运行Mac OS。

3 个答案:

答案 0 :(得分:1)

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

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

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

正如您所看到的,它有点涉及并可能会影响您启动Vim的工作流程。仔细想想你是否真的需要这个!

答案 1 :(得分:0)

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

如果这不是您的风格,并且您仍然希望在单独的布局中使用vim,则可以使用ps查看每个vim进程的参数并检查cwd这些过程。类似的东西:

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

请注意,如果在vim中使用多个缓冲区,则上述操作不会很有效,因为它只会列出给每个vim命令的参数,而不会列出实际的缓冲区。

答案 2 :(得分:0)

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