如何从文件管理器或命令行在同一个 Vim 实例中打开新文件?

如何从文件管理器或命令行在同一个 Vim 实例中打开新文件?

我通常不会从 Vim 导航我的文件系统,而是使用文件管理器,有时甚至使用良好的旧交互式 shell(命令行)。

从命令行或基于终端的文件管理器(MC、Vifm、Ranger...)发出vim file完全违背了它们的导航目的,因为 Vim 接管了终端,阻止了 shell 或文件管理器。当然,即使这对于 GUI 文件管理器来说也是不可能的,因为它们不在终端中运行。

一般的解决方案是xterm -e vim file & 在自己的终端中打开每个所需的文件,但一段时间后,我最终会得到各种打开的终端,每个终端都有一个文件,并且循环浏览它们 AltTab变得很麻烦。

有没有办法在我的导航实用程序(无论它是什么)的新缓冲区/选项卡中打开每个新文件相同的现有的 Vim 实例?

答案1

首先确保vim --version | grep clientserver退货 +clientserver。如果它返回-而不是+,启用该功能的一个简单方法是安装 Gvim,即使我们不会使用它。在 Debian 和 Ubuntu 中sudo apt install vim-athena 安装它。对于确实想要跳过 Gvim 的有经验的用户来说,另一种选择是从带有标志的源代码构建 Vim--with-x=yes --disable-gui

现在您已经有了+clientserver,创建包含以下内容的文件vimserver

#!/bin/sh
serv=${S:-xtvim}
if vim --serverlist | grep -qxiF "$serv"; then
    vim --servername "$serv" --remote-tab "$@"
else
    xterm -e vim -p --servername "$serv" "$@" &
fi

不要忘记将其放入vimserver目录中$PATH 并使其可执行chmod +x vimserver。如果您使用其他终端,请在其手册页中查找在新终端窗口1中执行命令的适当标志。

在一些文件上进行测试(可以在参数中传递多个文件):

vimserver file1 file2
vimserver file3 file4 file5
S=xyz vimserver file6

每个文件都会在名为“XTVIM”的同一 Vim 实例的新选项卡中打开,但 除外file6,它会转到不同的实例“XYZ”。如果您希望新文件位于新缓冲区中,只需更改--remote-tab--remote并删除该-p标志即可。

解释vimserver

分配给该变量的服务器名称serv默认为“xtvim”,但如上所示,可以使用环境变量指定不同的名称S

servGrep在服务器列表中查找 的确切值(但不区分大小写,因为 Vim 强制其服务器名称为大写)。如果找到,该服务器将加载该文件,否则,将启动一个新终端并使用它的服务器。

请求焦点

当在已存在的服务器中打开文件时,终端不会获得焦点;设置一个实例名称对于窗口并添加 Xdotool 行解决了这个问题:

#!/bin/sh
serv=${S:-xtvim}
if vim --serverlist | grep -qxiF "$serv"; then
    xdotool search --classname "^$serv$" windowactivate
    vim --servername "$serv" --remote-tab "$@"
else
    xterm -name "$serv" -e vim -p --servername "$serv" "$@" &
fi

由于该-name选项,Xdotool 可以定位 Vim 窗口并向其请求焦点。有些终端缺少该选项,但有,Xdotool自版本 3.20210804.2 起--role也可以使用该选项。search

文件管理器

维夫姆

编辑~/.config/vifm/vifmrc

filextype <text/*> vimserver %f

可以通过视觉模式或标记同时打开多个文件。

午夜指挥官

编辑扩展文件~/.config/mc/mc.ext

type/text
 Open=vimserver %s

在 MC 中也可以标记多个文件。

GUI 文件管理器

对于其中许多人来说,该过程是右键单击文本文件Open with... > Custom command line / Use a custom command.在命令文本字段中,输入vimserver并标记复选框(如果有)或按将其设置为默认值的按钮。

格维姆

如果您对 Gvim 2没问题,请不要费心vimserver。只需使用 gvim --remote-tab-silent.

1:Gnome-terminal、Xfce4-terminal 和 Terminator 使用该-x标志,而不是-e.
2:Goldilocks 对 Gvim 使用的评论 客户端-服务器模式有哪些实际用途?

相关内容