15

这可能吗?

从概念上讲,一个解决方案应该适用于许多可能的配置,从在 tmux 窗口的窗格中的不同虚拟终端中运行的两个 vim 实例,到在不同地理区域的不同机器上的不同终端中,一个或两个通过网络连接(换句话说,vim 由两个单独的 shell 进程托管,无论如何它们已经在 tmux 下)。

促使我思考这个问题的案例:

我有两个打开 vim 的 tmux 面板,我想使用 Vim yank/paste 来复制文件。

但它只有在我让它们都在同一个 Vim 实例中运行时才有效,所以我不得不:

  1. 使用 tmux 的复制/粘贴功能来获取内容(这有点乏味和挑剔),或者
  2. 使用终端(PuTTY,iTerm2)的复制/粘贴功能来获取内容(这同样乏味但不受网络延迟的影响,但是这只能在一定大小的文本有效负载下复制,此时此方法由于终端不知道文件当前不可见部分的内容,因此根本无法工作),或者
  3. 在拆分缓冲区或选项卡中的一个 Vim 实例中手动重新打开文件时会丢失 Vim 缓冲区历史记录/上下文和可能的 shell 历史记录/上下文,然后关闭另一个终端上下文(对于大型有效负载来说,比 1 更乏味,但更是如此小有效载荷)。

这有点像 PITA,如果我有远见地切换到已经运行 vim 的适当终端来打开我的文件,那么这一切都是可以避免的,但工作流程和习惯的命运很少与本来方便的相匹配。

所以问题是,是否存在允许我跨独立运行的 vim 实例加入缓冲区的命令或直接构建(shell)脚本的可能性?我很难让谷歌充分回答这个问题。

在没有足够的答案的情况下(或者如果有合理的确定性确定 Vim 不具备在其实例之间完成缓冲区传输的功能),则上述方法 3 的良好实现(可绑定到键)是可以接受的。

同时,我将进一步自定义我的 vim 配置并强迫自己使用尽可能少的 vim 实例。

4

1 回答 1

13

不,Vim 不能在多个实例之间共享会话。这就是它的设计方式,它不提供任何会话共享工具。寄存器、动态映射/设置、命令历史记录等对于 Vim 会话来说是本地的,您实际上无法对此做任何事情。


但是您的标题有点误导:您写了“缓冲区”,但看起来您只是在从一个 Vim 实例复制/粘贴(涉及“注册”,而不是“缓冲区”)到另一个之后。是对的吗?如果是这样,您为什么不简单地使用剪贴板支持为自己构建一个合适的版本呢?

"+y跨实例复制/复制和"+p在另一个实例中一样容易。

显然,如果您的 Vim 实例位于不同的系统上,这将不起作用。在这种情况下,"+y在源 Vim 和系统提供的粘贴到目标 Vim 中(可能带有:set paste)是最常见的解决方案。


如果您使用的是 Mac,请安装 MacVim 并将随附的mvimshell 脚本移动到路径中的某个位置。您可以在终端中使用 MacVim 可执行文件和mvim -v.

如果您在 Linux 上,请从包管理器中安装 vim-gnome 包。

如果您使用的是 Windows,请安装最新的“Vim without Cream”。


但对我来说,整个事情看起来像是一个 XY 问题。有效地使用 Vim 的内置:e[dit]命令可能是解决潜在问题的最佳解决方案:从许多不同的 shell 编辑许多文件。

于 2013-03-16T07:01:16.730 回答