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

17

这个能实现吗?

从概念上讲,一个解决方案应该适用于很多可能的配置,从在tmux窗口的不同面板中运行两个vim实例,到在不同地理区域的不同终端上运行,其中一个或两个通过网络连接(换句话说,vims由两个不同的shell进程托管,在tmux下它们本来就是如此)。

促使我考虑这个问题的情况是:

我有两个tmux面板都打开了vim,我想使用Vim复制/粘贴功能跨文件夹复制。

但只有当我把它们都运行在同一个Vim实例中时才有效,所以我只能被迫:

  1. 使用tmux的复制/粘贴功能将内容复制过去(这有点繁琐和棘手),或者
  2. 使用终端(PuTTY,iTerm2)的复制/粘贴功能将内容复制过去(这同样繁琐,但不受网络延迟的影响,但只对要复制的文本负载大小有限制,超出这个限制后,由于终端不知道文件中当前不可见部分的内容,这种方法将完全无法工作),或者
  3. 重新打开要编辑的文件,可能会丢失vim缓冲区历史记录/上下文和shell历史记录/上下文,在其中一个Vim实例中手动打开文件(对于大负载来说比1少费力点,但对小负载来说更费力)。

这有点烦人,如果我有预见性地切换到已经运行vim的适当终端以打开我的文件,那么所有这些都可以避免,但是工作流程和习惯的命运很少与方便相吻合。

所以问题是,是否存在一个命令或简单构建的(shell)脚本,允许我在独立运行的vim实例之间连接缓冲区?我很难从谷歌上得到足够的答案。

如果没有足够的答案(或者可以以合理的确定性确定 Vim 没有实现跨其实例传输缓冲区的功能),则可以采用上述第三种方法的良好实现(可绑定到键)。

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


3
将缓冲区写入文件,从文件中插入? - Karoly Horvath
删除vim搜索历史记录、vim撤销历史记录、vim命令历史记录等等(尽管看起来这是不可避免的)。 - Steven Lu
@perreal,有没有可能将vim置于监视文件更新的模式中?这样我就可以设置一个共享临时文件,实现自动同步。 - Steven Lu
1
我只是使用本地操作系统的GUI,无论是X还是aqua或其他,用鼠标剪切粘贴从终端窗口选择的文本。不确定你如何期望vim在会话之间完成这项工作,特别是如果它们在不同的系统上。 - Randy Howard
@perreal,感谢提供链接。我还找到了set autoread,这回答了我提出的问题。 - Steven Lu
显示剩余9条评论
3个回答

14
不,Vim不能在多个实例之间共享会话。这是它的设计方式,它不提供任何会话共享功能。寄存器、即时映射/设置、命令历史记录等都是局部于一个Vim会话,你无法真正对此做任何事情。
但是,您的标题有点误导人:您写了“缓冲区”,但看起来您只想从一个Vim实例复制/粘贴(涉及“寄存器”,而不是“缓冲区”)到另一个Vim实例。 是这样吗?如果是这样,为什么不简单地获取支持剪贴板的适当版本?
在一个中使用"+y,在另一个中使用"+p,即可轻松跨实例进行复制/删除。
显然,如果您的Vim实例位于不同的系统上,则这将无法正常工作。在这种情况下,源Vim中的"+y和目标Vim中提供的系统黏贴(可能需要:set paste)是最常见的解决方案。
如果您正在使用Mac,请安装MacVim并将附带的mvim shell脚本移动到路径的某个位置。您可以在终端中使用MacVim可执行文件in,使用mvim -v
如果您正在使用Linux,请从软件包管理器中安装vim-gnome软件包。
如果您正在使用Windows,请安装最新的“无奶油Vim”。
但整个问题对我来说看起来像是一个XY问题。使用Vim内置的:e[dit]命令有效地解决了似乎是您潜在问题的最佳解决方案:从许多不同的shell中编辑许多文件。

0
你无法移动缓冲区,但可以在不同的vim实例之间快速关闭和重新打开文件。如果你的缓冲区已保存,这基本上就像是“移动缓冲区”。
首先,确保你的未命名寄存器与系统范围的剪贴板共享,将以下内容添加到你的.vimrc文件中:
set clipboard^=unnamed,unnamedplus

然后使用以下方法将打开文件的完整路径复制到旧缓冲区中:
:let @+ = expand("%:p")

我会为此创建一个绑定,可选择包括先保存和关闭缓冲区,以便当您尝试在新的缓冲区中打开同一文件时,swp不会引起任何问题。
使用剪贴板中的文件完整路径,您可以切换到新的vim实例并运行:
:e <C-r>+

而且你已经准备就绪。

0
为了纪念这篇帖子的十周年,我将在回答中发布我的更新。
现在,我并没有问题描述中所提到的问题,因为基于OSC52的vim/nvim插件可以可靠地将缓冲区内容传输到主机终端的剪贴板中。我使用的插件是ojroques/nvim-osc52
然后,我会使用一些类似下面的绑定。
vim.keymap.set("n", "<leader>y", safeRequire("osc52").copy_operator, { expr = true, desc = "Copy to host term system clipboard via OSC 52" })
vim.keymap.set("n", "<leader>yy", "<leader>y_", { remap = true, desc = "Copy entire line to host term system clipboard via OSC 52" })
vim.keymap.set("x", "<leader>y", safeRequire("osc52").copy_visual, { desc = "Copy visual selection to host term system clipboard via OSC 52" })
vim.keymap.set("n", "<leader>Y", "ggVG<leader>y", { remap = true, desc = "Copy entire buffer to host clipboard via OSC 52"})

快速轻松地将任何文件缓冲区导出到系统剪贴板。这甚至适用于iOS,因为大多数终端模拟器都实现了OSC52剪贴板。

粘贴总是很容易的,直到最近复制/拷贝才成为问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接