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


68

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

有任何想法吗?


1
tmux窗格在不同主机上运行vim吗?如果没有,我将只运行一个vim实例,并使用vim缓冲区打开2个文件并粘贴在缓冲区之间。
sashang 2012年

这可能是您的vim版本未与剪贴板支持一起编译的问题-请参阅下面的
@DmitrySemenov

Answers:


48

抱歉,我试图说服您使用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

仅在需要复制终端输出时才使用它们。


或旋转缓冲区,KEV如何复制到剪贴板?
Eric Fortis 2012年

1
有没有办法直接通过tmux做到这一点?我在不同的目录中打开了不同的窗格,有时:tabe或:sp键入长路径并不方便。切换窗格和粘贴要容易得多。
gylaz 2012年

我保留prefix-[,]默认设置。因为我已经学会了它们。您可以将它们配置为所需的内容。
kev 2012年

1
我认为有理由不仅仅使用单个vim实例。例如,您可能只希望在终端中打开三个窗格:一个半屏幕编辑会话,一个第四屏幕编辑会话和一个第四屏幕终端。我不确定这可以通过一个vim实例来完成。
Zach Conn 2013年

2
对于tmux的较新版本,它bind-key -T copy-mode-vi ...代替了bind-key -t vi-copy ...
chrimuelle

21

我已经使用了这种方便的绑定多年:)

" 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
确实,它没有复制到系统剪贴板。但是它满足了这个问题的要求:)
chenkaie 2015年

14

我目前只能在运行Windows的笔记本电脑上工作,但我的所有开发工作都是在运行Linux的服务器上进行的,因此最终我整天都在PuTTY的tmux会话中工作。

我想在tmux会话中的不同窗口中运行的vim实例之间复制文本。我尝试使用*寄存器复制到系统剪贴板,但是由于我是通过PuTTY连接的,所以我没有X会话,因此即使我启动gVim而不是vim没有系统剪贴板。(我可能已经能够使用x转发或某种方法来解决此问题,但是我不想在Windows上安装x服务器。)

我认为应该有一种方法可以使用vim的tmux复制/粘贴缓冲区代替系统键盘,并确保有足够的人为此编写了插件

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

插件文档说,fakeclip也应该可以在gnu屏幕上使用,但是我还没有亲自测试过。


tl; dr

安装fakeclip插件,然后就可以使用"&y,以抽出到TMUX的缓冲区,"&p从TMUX的缓冲区。


12

尽管我同意最好只使用一个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-<C-y>用来激活复制模式,/search term例如,转到所需的位置,v以可视方式进行选择,然后拉y入tmux。然后进入其他vim会话并进入插入模式。使用prefix-p粘贴有什么在TMUX粘贴缓冲区。还有一些方法可以将tmux的粘贴缓冲区复制到系统剪贴板。


1
为什么使用一个vim实例更好?当然这与拥有不同工作空间的想法不相容吗?当我有5个大型的,无关的项目需要处理时,这似乎不太实用。
Will Vousden

主要是意见和/或CPU效率问题。以下是观看视频:vimeo.com/4446112
Conner

3

您可以使用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中系统的clipborad。

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

另请参阅如何使Vim从系统剪贴板粘贴(并复制到系统)?进一步解释。


为了可能不知道这些命令的任何人,您能否为每个命令添加一个解释?这将使答案更有用!

@PetahChristian我很惊讶应该注意到我的回答!我现在扩大答案。如果存在歧义或语法错误(我不是英语母语人士),请让我知道:)
knight42

2

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的一部分


2

这在neovim中有效。

执行:checkhealth,您将发现以下内容:

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

如果没有,也许您需要将tmux升级到最新版本2.9。

然后在“〜/ config / nvim / init.vim”中添加以下代码

set clipboard+=unnamedplus

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.