Mas*_*sse 2 vim single-instance
我一直是控制台 vim 用户,但最近我尝试使用 gvim。我已经进行了一些设置,这样我的控制台习惯就不会受到影响,例如使用 .
然而,用我的上网本打开多个 gvim 和终端是可怕的,很快我的 vim 空间就减少到一两厘米。充其量,窗口宽度减半,从而无法垂直分割屏幕(平铺 wm)。
我通过将 vim 别名化来解决这个问题,gvim --remote-silent并且它工作了几天,但今天我需要使用 -c '' 并意识到在 --remote-silent 后面有任何开关都会将这些开关作为文件打开。这样gvim --remote-silent --foo bar会打开两个文件:--foo 和 bar。
我为 放置了一个新别名alias vim=gvim,但我担心这会让我再次成为控制台 vim 用户,比我想象的要早。
所以问题是,以最小的努力(设置系统可能很费力)继续使用 gvim 的首选方法是什么,这样我仍然可以继续使用 vim 的全部功能。该解决方案不需要使用远程 vim,它应该只是最小化 gvim 窗口。
我来晚了,但我有一个建议。
首先,我同意@Herbert - 通常没有理由运行多个 Vim 实例(控制台或其他)。将事物保存在一个实例中的好处实在是太大了。但是,我认为有必要融入其中-c;虽然我看不出有必要自己做:D。
我认为获得此功能的最佳方法是使用--remote-sendvim 的功能而不是--remote-silent. 不过,这意味着需要编写一些 shell 脚本:
#!/bin/bash
function resolveFile
{
if [ -f "$1" ]; then
echo $(readlink -f "$1")
else
echo "$1"
fi
}
function gg
{
local opts=$(getopt -o c: --long command: -n "gg" -- "$@")
if [ $? != 0 ]; then return 1; fi
eval set -- "$opts"
cmd=""
while :
do
case "$1" in
-c|--command)
cmd="$2"
shift 2
;;
--) shift
break
;;
esac
done
if [[ -n "$cmd" ]]; then
if [[ -n "${1-}" ]]; then
cmd=":e $(resolveFile $1)<cr>$cmd<cr>"
else
cmd="$cmd<cr>"
fi
shift 1
fi
files=""
for f in $@
do
files="$files $(resolveFile $f)"
done
cmd="$cmd:args! $files<cr>"
gvim --remote-send "$cmd"
}
Run Code Online (Sandbox Code Playgroud)
我只对此进行了少量测试,但您应该能够执行以下操作:
gg -c G file1 file2 file3 file4
Run Code Online (Sandbox Code Playgroud)
这应该编辑 file1并移动到它的底部。然后,它还应该将file2,file3和添加file4到 args 列表中,以便您可以执行诸如 之类的命令:bnext。它还应该恢复到与--remote-silent您不提供-c.
我真的认为为了将命令行体验与单个 Vim 实例正确集成,跳过这些障碍是值得的。将一切都集中在一处真是太甜蜜了,让人无法放弃。