使用单个vim实例和--remote-silent

时间:2010-12-14 21:42:56

标签: vim single-instance

我一直是一个控制台vim用户,但最近我尝试使用gvim。 我做了一些设置,以至于我的控制台习惯不会受到影响,例如 使用。打开当前目录下的urxvt终端。

但是我的上网本打开了多个gvims和终端 太可怕了,迅速将我的vim空间缩小到一厘米或者两厘米。最好, 窗口宽度减半,无法垂直分割 屏幕(平铺wm)。

我通过将vim别名化为gvim --remote-silent来解决这个问题 工作好几天,但今天我需要使用-c''和 意识到有任何开关--remote-silent打开那些 切换为文件。所以做gvim --remote-silent --foo bar会打开两个 文件, - foo和bar。

我为alias vim=gvim添加了一个新别名,但我担心这会让我变成一个 再次使用console vim用户,比我想象的要快。

所以问题是,继续使用gvim的首选方法是什么, 尽可能少的努力(设置系统可能很费力),这样我就可以 仍然继续使用vim的全部功率。解决方案不需要使用 远程vim,它应该只是最小化gvim窗口。

2 个答案:

答案 0 :(得分:4)

我迟到了这个派对,但我有一个建议。

首先,我同意@Herbert - 通常没有理由运行多个Vim实例(控制台或其他)。将事物保持在一个实例中的好处太大了。但是,我认为需要混合-c;虽然我不认为有必要自己做:D。

我能看到获得此功能的最佳方式是使用vim的--remote-send功能而不是--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"
}

我只是稍微测试了一下,但你能够做以下事情:

gg -c G file1 file2 file3 file4

那应该编辑 file1并移到其底部。然后,它还应该将file2file3file4添加到a​​rgs列表中,以便您可以执行:bnext等命令。当您不提供--remote-silent时,它还应恢复为与-c相同的功能。

确实认为值得跳过这些箍,以便将您的命令行体验与单个Vim实例正确集成。把所有东西放在一个地方太甜蜜了,不能放弃。

答案 1 :(得分:1)

我不认为运行多个gvim实例是一个不错的解决方案。为什么不只有一个gvim --remote-silent的别名,当你不需要额外的开关时(大概是大部分时间),而另一个别名只有gvim,当你想添加命令时...线路开关?对我来说似乎很好,没有多少要记住。

除了获得许多难以跟踪的窗口之外,运行多个gvim实例的主要不愉快之处在于每个gvim都有自己的运行时环境,更难以在不同gvim实例的缓冲区之间共享和复制数据。 / p>

德里克·怀亚特(Derek Wyatt)有一段有趣的视频 - 远程沉默;我认为它不能解决您的问题,但您可能有兴趣观看它: OneVimToRuleThemAll

此外,如果问题是gvim中的窗口拆分正在占用屏幕空间,请更好地使用选项卡功能(您甚至可以禁用实际的选项卡标签,但保持打开标签页的隐喻)和/或只是在两者之间导航缓冲区,同时一次只能看到一个缓冲区。