如何在运行 vim 实例的不同 tmux 窗格之间复制和粘贴

Posted

技术标签:

【中文标题】如何在运行 vim 实例的不同 tmux 窗格之间复制和粘贴【英文标题】:How to copy and paste between different tmux panes running vim instances 【发布时间】:2012-06-18 01:35:00 【问题描述】:

示例:复制到一个 tmux 窗格(通过 vim),然后切换到另一个窗格(运行另一个 vim 实例)并使用 vim paste 命令粘贴。我知道这可以通过 tmux(使用 prefix+])来完成,但如果我可以使用 vim 绑定复制和粘贴,那将非常方便,因为我只是在运行 vim 的不同窗格之间切换。

有什么想法吗?

【问题讨论】:

tmux 窗格是否在不同的主机上运行 vim?如果不是,我只运行一个 vim 实例并使用 vim 缓冲区打开 2 个文件并在缓冲区之间粘贴。 这可能是您的 vim 版本没有在剪贴板支持下编译的问题 - 请参阅下面的 @DmitrySemenov 的答案 【参考方案1】:

抱歉,我试图说服你使用 vim 的内置功能。


为了方便copy/paste,您可以在另一个标签页中打开文件:

:tabe /path/to/another/file

使用 gtgT 切换标签页。


或者拆分窗口编辑另一个文件:

:sp /path/to/another/file

使用 Ctrl-ww 切换窗口。 要垂直拆分窗口,请使用:vsp file


更新:

这是我的.tmux.conf 文件:

# vim
setw -g mode-keys vi
bind [ copy-mode
bind -t vi-copy v begin-selection
bind -t vi-copy y copy-selection
bind -t vi-copy V rectangle-toggle
bind ] paste-buffer

# buffer
bind Space choose-buffer

我只在需要复制终端输出时使用它们。

【讨论】:

或者旋转缓冲区,复制到剪贴板怎么样? 有没有办法直接通过tmux做呢?我在不同的目录中打开了不同的窗格,有时不方便使用 :tabe 或 :sp 并输入长路径。切换窗格和粘贴要容易得多。 我将prefix-[,] 保留为默认值。因为我已经背诵了它们。您可以将它们配置为您想要的。 我认为有理由不只使用单个 vim 实例。例如,您可能只想在终端中打开三个窗格:一个半屏编辑会话、一个第四屏编辑会话和一个第四屏终端。我不确定这可以通过一个 vim 实例来完成。 对于较新版本的 tmux,它是 bind-key -T copy-mode-vi ... 而不是 bind-key -t vi-copy ...【参考方案2】:

我已经使用这个方便的绑定好几年了 :)

" copy to buffer
vmap <C-c> :w! ~/.vimbuffer<CR>
nmap <C-c> :.w! ~/.vimbuffer<CR>
" paste from buffer
map <C-p> :r ~/.vimbuffer<CR>

【讨论】:

没错,它没有复制到系统剪贴板。但它满足了这个问题的要求:)【参考方案3】:

我目前在工作时被一台运行 Windows 的笔记本电脑困住了,但我在运行 Linux 的服务器上完成了所有开发工作,所以我最终整天在 PuTTY 上的 tmux 会话中工作。

我想在我的 tmux 会话中在不同窗口中运行的 vim 实例之间复制文本。我尝试使用* 寄存器复制到系统剪贴板,但由于我是通过 PuTTY 连接的,所以我没有 X 会话,所以 is 没有系统剪贴板,即使我启动gVim 代替 vim。 (我可能已经能够使用 x-forwarding 或其他东西来解决这个问题,但我不想在 Windows 上安装 x-server。)

我认为应该有一种方法可以使用 vim 中的 tmux 复制/粘贴缓冲区来代替系统键盘,果然有人写了a plugin for that。

安装 fakeclip 会添加一个新寄存器 &amp;,它映射到 tmux 的粘贴缓冲区。由于我所有的 vim 实例都在同一个 tmux 会话中,这使得在它们之间拉出/放置文本变得非常简单。

插件文档说 fakeclip 也应该适用于 gnu screen,但我没有亲自测试过。


tl;dr

安装fakeclip插件,然后就可以使用"&yyank进入tmux的缓冲区,以及 "&pput 从 tmux 的缓冲区。

【讨论】:

【参考方案4】:

虽然我同意只使用一个 vim 实例会更好,但您也可以单独使用 tmux。它有一个内置的复制模式。我的 tmux.conf 设置如下:

  setw -g mode-keys vi
  unbind [
  unbind p
  bind C-y copy-mode
  bind p paste-buffer
  bind -t vi-copy v begin-selection
  bind -t vi-copy y copy-selection
  bind -t vi-copy Escape cancel

所以你可以使用prefix-&lt;C-y&gt; 激活复制模式,/search term 作为示例去你想要的地方,v 视觉选择,y 拉入 tmux。然后转到其他 vim 会话并进入插入模式。使用 prefix-p 粘贴 tmux 粘贴缓冲区中的内容。还有一些方法可以将 tmux 的粘贴缓冲区复制到系统剪贴板。

【讨论】:

为什么使用一个 vim 实例更好?这肯定与拥有不同工作空间的想法不相容吗?当我有 5 个不相关的大型项目要处理时,这似乎不太实用。 主要是意见和/或 CPU 效率问题。这是一段视频:vimeo.com/4446112【参考方案5】:

您可以使用 vim 绑定将内容复制到剪贴板,然后切换到窗格并粘贴它。 以下键绑定可能会很方便。

noremap ty "+y
noremap tY "+Y  // copy a whole line to the clipboard
noremap tp "+p  // put the text from clipboard after the cursor 
noremap tP "+P  // put the text from clipboard before the cursor 

"+ 寄存器用于在 Vim 中访问系统的剪贴板。

一些有用的提示: 1.您可以按vVctrl-v进入可视模式,然后选择要拉取的内容,然后按ty将其复制到剪贴板。 2.ty可以与其他动作组合。例如,tyaw 可用于将光标下的单词复制到剪贴板。 tyib 复制括号内的内容。 tyi"复制双引号内的文字等...

更多解释请参见How to make vim paste from (and copy to) system's clipboard?。

【讨论】:

为了任何可能不知道这些命令的人,您能否添加每个命令的解释?这将使答案更有用! @PetahChristian 我很惊讶我的回答应该引起注意!我现在扩展我的答案。如果有歧义或语法错误(我不是以英语为母语的人),请告诉我:)【参考方案6】:

这适用于 neovim。

执行:checkhealth,你会发现类似这样的东西:

## Clipboard (optional)
  - OK: Clipboard tool found: tmux

如果没有,可能需要将 tmux 升级到最新版本 2.9。

然后在'~/config/nvim/init.vim'中加入如下代码

set clipboard+=unnamedplus

【讨论】:

【参考方案7】:

Fedora24 上的解决方案

你需要使用 vimx 而不是 vim

放入你的 .bashrc 或 .zshrc

alias vi='vimx'
alias vim='vimx'

然后您可以轻松地在 vims/tmux 面板之间复制


$ vim --version | grep clipboard
-clipboard       +insert_expand   +path_extra      -toolbar
+eval            +mouse_dec       +statusline      -xterm_clipboard

$ vimx --version | grep clipboard
+clipboard       +insert_expand   +path_extra      +toolbar
+eval            +mouse_dec       +statusline      +xterm_clipboard

vimx 是你很可能已经安装的 vim-enhanced-2:7.4.1868-1.fc24.x86_64 的一部分

【讨论】:

【参考方案8】:

控制+插入 = 复制

shift+insert = 粘贴

【讨论】:

以上是关于如何在运行 vim 实例的不同 tmux 窗格之间复制和粘贴的主要内容,如果未能解决你的问题,请参考以下文章

tmux

tmux安装与使用

tmux & vim 操作

tmux & vim 操作

【Linux操作】---终端神器tmux

无法在 vscode 中使用 alt+箭头切换 tmux 窗格