使用带有 --remote-silent 的单个 vim 实例

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 窗口。

Der*_*att 5

我来晚了,但我有一个建议。

首先,我同意@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 实例正确集成,跳过这些障碍是值得的。将一切都集中在一处真是太甜蜜了,让人无法放弃。