如何在运行 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
使用 gt 或 gT 切换标签页。
或者拆分窗口编辑另一个文件:
: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 会添加一个新寄存器 &
,它映射到 tmux 的粘贴缓冲区。由于我所有的 vim 实例都在同一个 tmux 会话中,这使得在它们之间拉出/放置文本变得非常简单。
插件文档说 fakeclip 也应该适用于 gnu screen,但我没有亲自测试过。
tl;dr
安装fakeclip插件,然后就可以使用"&yyank进入tmux的缓冲区,以及 "&p 到 put 从 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-<C-y>
激活复制模式,/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.您可以按v
或V
或ctrl-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 窗格之间复制和粘贴的主要内容,如果未能解决你的问题,请参考以下文章