vim 单实例脚本
在Windows上用过EmEditor的人应该知道用EmEditor打开的所有文件都会以Tab的形式共享单一的GUI,这样做的好处是,不过因为写程序的时候打开了太多的文本而把任务栏挤得满满的。在Linux下使用gvim却没有这么方便,每次打开一个文件都会新建一个新的实例,是在是很不方便。
网上常见的解决方法是使用-remote-tab选项打开,不过用过vim的人应该都会感到gvim内置的tab显示实在是很不好用,倒是一个bufexplorer的脚本非常受欢迎,该脚本以文本方式提供了tab功能,用起来非常方便。这个脚本有若干个衍生版本,我使用的是minibufexpl.vim这个版本。现在我们希望双击一个文件后能够在bufexplorer中添加一个新的tab,简单的说就是使用drop命令打开一个新的文件。
查阅vim的api(h function-list)我找到了一个解决方法, vim提供了远程执行命令的api:
remote_send({server}, {string} [, {idvar}])
发送 {string} 到 {server}。发送的字符串是输入键的序列。函数立
即返回。Vim 的服务器端不对键进行映射 |:map|。
如果给出 {idvar},将 {serverid} 保存在以它命令的变量里,此后的
remote_read() 需要使用此值。
另见 |clientserver| |RemoteReply|。
该函数在沙盘里不可用 |sandbox|。{仅当编译时加入 |+clientserver| 特性才有效}
这样我可以在命令行下执行:
gvim –remote-send “:drop [filename]” –servername “GVIM”
即可在现有的gvim实例中打开新的文件。将这一功能封装一下就变成下面的脚本:
#!/bin/sh
FILE=$1
GVIM=/usr/bin/gvimSERVER=”$(gvim –serverlist | head -n 1)”
if [ "$SERVER" != "" ]; then
$GVIM –remote-send “:drop $FILE<CR>” –servername $SERVER
$GVIM –remote-send “:call foreground()<CR>” –servername $SERVERelse
$GVIM -f $FILE
fiexit 1
该脚本在存在gvim实例的时候远程打开文件,否则启动新的实例。接下来只需要修改/usr/share/applications/gvim.desktop文件,将其中的gvim命令改为使用上面的脚本来启动就好了。