在vim的vim实例中移动vim中的缓冲区

时间:2013-03-16 02:10:47

标签: unix vim

这可能吗?

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

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

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

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

  1. 使用tmux的复制/粘贴功能来获取内容(这有点乏味和挑剔),或者
  2. 使用终端(PuTTY,iTerm2)的复制/粘贴功能来获取内容(这同样繁琐但不受网络延迟的影响,但是这只能达到一定大小的文本有效负载才能复制到由于终端不知道文件当前不可见部分的内容,此方法根本不起作用,或
  3. 在分割缓冲区或选项卡中的一个Vim实例中手动重新打开文件,然后关闭另一个终端上下文时,丢失Vim缓冲区历史记录/上下文以及可能的shell历史记录/上下文(对于大型有效负载而言,远比1更乏味但是小负载更是如此)。
  4. 这有点像PITA,如果我有先见之明切换到已经运行vim的合适终端来打开我的文件但是工作流程和习惯的命运很少与那些方便的相匹配。

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

    如果没有足够的答案(或者如果确定Vim不具备在其实例中完成缓冲区转移的功能),则上述方法3的良好实施(可绑定到密钥)是可以接受的。

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

1 个答案:

答案 0 :(得分:12)

不,Vim无法在多个实例之间共享会话。这是它的设计方式,它不提供任何会话共享功能。注册表,动态映射/设置,命令历史记录等是Vim会话的本地,你无法做到这一点。


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

跨实例复制/浏览就像在一个"+y和另一个"+p中一样简单。

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


如果您使用的是Mac,请安装MacVim并将随附的mvim shell脚本移动到路径中的某个位置。您可以使用mvim -v

在终端中使用MacVim可执行文件

如果您使用的是Linux,请从软件包管理器安装vim-gnome软件包。

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


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