题
我一直是控制台VIM用户,但是最近我尝试使用GVIM。我做了设置,使我的控制台习惯不会受到影响,例如在当前目录中打开URXVT终端。
但是,我的上网本可以打开多个GVIM和终端,这是可怕的,很快将我的VIM空间降低到一两厘米。充其量,窗口宽度减半,使得无法垂直拆分屏幕(瓷砖WM)。
我通过将vim缩放到这个问题来解决这个问题 gvim --remote-silent
而且工作良好几天,但是今天我需要使用-c'',并意识到在后面有任何开关 - 示波器 - 丝毫可将这些开关打开为文件。所以做 gvim --remote-silent --foo bar
打开两个文件 - foo和bar。
我为 alias vim=gvim
, ,但恐怕这会使我再次成为游戏机VIM用户,比我想象的要早。
因此,问题是,使用GVIM的首选方法是什么,并以最小的努力(设置系统可以劳动),这样我仍然可以继续使用VIM充分使用VIM。该解决方案不需要使用远程VIM,它应该只能最大程度地减少GVIM窗口。
解决方案
我迟到参加了这个聚会,但我有一个建议。
首先,我同意@herbert的观点 - 通常几乎没有理由运行多个VIM实例(控制台或其他情况)。在一个实例中保留事物的优势实在太棒了。但是,我看到需要混合 -c
;尽管我看不出需要自己做:D。
我看到的最好的方法是使用 --remote-send
vim而不是 --remote-silent
. 。但是,这意味着一些外壳脚本:
#!/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"
}
我只对此进行了少量测试,但是你 应该 能够做类似的事情:
gg -c G file1 file2 file3 file4
那应该 编辑 file1
并移至底部。然后也应该添加 file2
, file3
和 file4
到args列表,以便您可以执行命令 :bnext
. 。它也应恢复到与 --remote-silent
当您不提供 -c
.
我 真的 认为值得一试,以便将您的命令行经验与单个VIM实例正确整合在一起。将所有东西都放在一个地方太甜了,无法放弃。
其他提示
我认为没有多个GVIM实例运行是一个不错的解决方案。为什么不只是一个别名 gvim --remote-silent
当您不需要额外的开关(大概是大多数情况下)时,您会使用它,而另一个别名 gvim
对于何时要添加命令行开关?对我来说似乎很好,没有什么可记住的。
除了获得许多难以跟踪的窗口之外,每个GVIM都有自己的运行时环境,更难在不同的GVIM实例之间在缓冲区之间共享和复制数据。
德里克·怀亚特(Derek Wyatt)有有趣的视频 - 记录 - 丝丝;我认为它不会解决您的问题,但您可能有兴趣观看它:Onevimtorulethemall
另外,如果问题是GVIM内部的窗口拆分将屏幕遗产带走,请更好地利用TAB功能(您甚至可以禁用实际标签标签,但要保留“打开”选项卡页面的隐喻)和/或或者或在具有缓冲区之间在缓冲区之间导航一次只能看到一个缓冲区。