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

问题描述 投票:0回答:3

我一直是控制台 vim 用户,但最近我尝试使用 gvim。 我已经进行了设置,这样我的控制台习惯就不会受到影响,例如 使用 .

在当前目录打开 urxvt 终端

但是,使用我的上网本打开多个 gvim 和终端是 太可怕了,我的振动空间很快就缩小到一两厘米。最好, 窗口宽度减半,无法垂直分割 屏幕(平铺 wm)。

我通过将 vim 别名为

gvim --remote-silent
来解决这个问题 几天工作正常,但今天我需要使用 -c '' 和 意识到在 --remote-silent 后面有任何开关会打开这些 切换为文件。所以这样做
gvim --remote-silent --foo bar
会打开两个 文件,--foo 和 bar。

我为

alias vim=gvim
起了一个新别名,但我担心这会让我成为 再次控制台 vim 用户,比我想象的要早。

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

vim single-instance
3个回答
6
投票

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

首先,我同意@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
并移动到底部。然后,它还应该将
file2
file3
file4
添加到参数列表中,以便您可以执行诸如
:bnext
之类的命令。当您不提供
--remote-silent
时,它也应该恢复为与
-c
相同的功能。

真的认为为了将你的命令行体验与单个 Vim 实例正确集成,跳过这些障碍是值得的。将所有东西都集中在一处真是太甜蜜了,无法放弃。


1
投票

我不认为运行多个 gvim 实例是一个不错的解决方案。为什么不只为

gvim --remote-silent
使用一个别名(当您不需要额外的开关(大概是大多数时间)时使用),并为
gvim
提供另一个别名,以便在您想要添加命令行开关时使用呢?对我来说似乎很好,没有太多需要记住的。

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

Derek Wyatt 在 --remote-silent 上有有趣的视频;我认为它不能解决您的问题,但您可能有兴趣观看: 一个Vim统治他们所有人

另外,如果问题是 gvim 中的窗口分割占用了屏幕空间,请更好地利用选项卡功能(您甚至可以禁用实际的选项卡标签,但保留打开的选项卡页面的隐喻)和/或只是在缓冲区之间导航一次只有一个缓冲区可见。


0
投票

Derek Wyatt 的脚本很棒,在 MacOS 上做了一些修改:

  1. brew install gnu-getopt
  2. getopt
    替换为
    /usr/local/opt/gnu-getopt/bin/getopt
  3. 删除了函数 gg() 包装器并将其放入主脚本中,删除了“local”关键字
  4. 在最后添加,将编辑器放在前面:
    gvim --remote-expr 'remote_foreground("VIM")'

现在您可以将其放入 /usr/local/bin 并在任何地方使用它

© www.soinside.com 2019 - 2024. All rights reserved.