unix - 在 vim 中跨 vim 实例移动缓冲区

标签 unix vim

这可能吗?

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

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

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

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

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

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

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

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

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

    最佳答案

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

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

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

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

    如果您使用的是 Mac,请安装 MacVim 并移动随附的 mvim路径中某处的 shell 脚本。您可以通过 mvim -v 在终端中使用 MacVim 可执行文件。 .

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

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

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

    关于unix - 在 vim 中跨 vim 实例移动缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15444823/

    相关文章:

    Unix - 在 watch 命令中使用管道(按状态分组的连接计数)

    vim - 你如何从 Vim 运行 CoffeeScript ?

    vim - 奇怪的 vimscript 冒号语法

    vim - 使用插件的重新映射之间的冲突

    linux - 从 crontab 调用时变量不返回值

    c - 如何在 unix 中跟踪文件修改?

    vim - 用于从 VIM 打开 Web 链接的 .vimrc 脚本

    vim - 如何在 VIM 中打开不同的手册页部分(使用 K 快捷键)?

    linux - 如何在 unix 中将第一列移动到最后一列?

    linux - 如何删除具有特定字符串的所有行,但不删除同一文件的特定部分中包含相同字符串的行