我通常不会从 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
。
serv
Grep在服务器列表中查找 的确切值(但不区分大小写,因为 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
文件管理器
维夫姆
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 使用的评论
客户端-服务器模式有哪些实际用途?。