it-swarm.cn

使tmux将缓冲区复制到剪贴板

我试图找出一种不错的方法将tmux缓冲区中的内容复制到剪贴板中。我已经尝试了几种不同的方法,例如

bind-key p select-pane -t 2 \; split-window 'xsel -i -b' \; paste-buffer

这使我非常接近,我要做的就是在我做前缀-p之后按Control-d。

我试图通过做来解决

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE\; tmux paste-buffer\; echo HERE'

但这是行不通的。实际上,如果我将其配对为

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE'

它什么也没做,所以我假设在Shell命令中,分割窗口不喜欢<<。

有任何想法吗?

编辑:您可以跳过select-pane -t 2如果您愿意的话,这并不重要。我只使用一种特定的布局,而窗格2是我在进行其他操作时希望拆分的布局,因此默认情况下会进入涉及拆分的绑定。

121
Digital Powers

这里的文档需要换行符。例如,在Shell脚本中,您可以编写

cat <<EOF >somefile; echo  done
file contents
EOF

我认为tmux不允许您在其中添加换行符,即使这样做,也不是一个好方法。如果数据本身仅包含HERE一行怎么办(例如,因为您要复制.tmux.conf)?

我建议将缓冲区内容写入一个临时文件。未经测试:

bind-key p save-buffer ~/.tmux-buffer \; run-Shell "xsel -i -b <~/.tmux-buffer && rm ~/.tmux-buffer"

如果您在两个单独的tmux实例中使用此命令,则会出现争用情况。我不知道该怎么解决。

26

这应该工作:

# move x clipboard into tmux paste buffer
bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer"
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i"
94
Grauwolf

适用于Mac OS-X的更简单的解决方案

这是基于Alex的答案,并使用了当时不存在的东西。

如果您使用的是 homebrew (如果不是,为什么不呢?),则可以这样做:

brew install reattach-to-user-namespace

然后在您的~/.tmux.conf

set-option -g default-command "reattach-to-user-namespace -l zsh" # or bash...
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

要将缓冲区从tmux复制到Mac粘贴板(您应该已经使用tmux复制了某些内容),请使用<tmux-key> Control-c。现在可用于Command-vpbpaste

要从Mac粘贴板粘贴某些内容,请使用<tmux-key> Control-v

41
docwhat

从版本1.8开始,已添加copy-pipe命令。它将选择内容复制到tmux缓冲区,并将其通过管道传递给命令。现在,不需要前缀绑定。这是一个例子:

bind -t vi-copy y copy-pipe "xclip"

# For OS X users:
bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

现在,当您在copy-mode中选择了一些文本时, y 会将文本复制到tmux缓冲区以及操作系统剪贴板。但是,如果您想将文本从剪贴板发送到tmux缓冲区,则无济于事。

40
Tyler Holien

您可能要尝试 tmux-yank插件 。它可以直接复制到系统剪贴板(OS X和Linux)以及其他一些类似的东西,例如取消当前的Shell行。

16
user80379

这是一个全面的答案。

首先一点历史

首次提出此问题时(2011年6月),将文本从Tmux复制到剪贴板必须经过两个步骤,首先将所选文本复制到Tmux的缓冲区,然后将文本从Tmux的缓冲区复制到系统剪贴板。

在1.8(2013年3月)中,添加了_copy-pipe_命令,您可以将所选文本直接复制到系统剪贴板(或其他目标)中。

然后在2.4(2017年4月)中,关键表发生了重大变化,使得此页面上的许多答案已过时。

回答原始问题

Linux

_bind-key C-y run-Shell "tmux save-buffer - | xclip -i -r > /dev/null" \; display-message "Copied tmux buffer to selection"
bind-key C-Y run-Shell "tmux save-buffer - | xclip -i -r -selection clipboard > /dev/null" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"
_

Mac

如果使用 homebrew ,则应在终端中运行以下命令来安装_reattach-to-user-namespace_:

_brew install reattach-to-user-namespace
_

然后在您的〜/ .tmux.conf中:

_bind-key C-y run-Shell "tmux save-buffer - | reattach-to-user-namespace pbcopy" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "reattach-to-user-namespace pbpaste | tmux load-buffer - ; tmux paste-buffer"
_

更短的方法(将选择内容直接从剪贴板复制并粘贴到剪贴板,以便tmux> 2.4)

注意:Linux有两个版本,因为Linux具有主要和辅助剪贴板(也称为选择)。

Linux

_bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip -r" \; display-message "Copied to selection"
bind-key -T copy-mode-vi Y send-keys -X copy-pipe "xclip -r -selection clipboard" \; display-message "Copied to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - && tmux paste-buffer"
_

Mac

_bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy" \; display-message "Copied to clipboard"
_

自定义这些命令

  • 如果您不希望该命令在状态行中告诉您它做了什么,那么只需删除_display-message_(以及它前面的_\;_)即可。

  • 如果您使用的是Emacs样式复制模式而不是vi,则只需将_copy-mode-vi_替换为_copy-mode_

  • 如果您正在运行Linux,并且要使用xsel而不是xclip,则将_xclip -r_替换为_xsel -i -p_,将_xclip -o_替换为_xsel -o -p_

  • _-r_中的_xclip -r_是可选的,它将删除最后一个换行符。这对于复制命令很有用,然后将其粘贴时将不会立即执行。

  • 如果您通过SSH建立隧道,则应咨询 https://unix.stackexchange.com/a/354581/14252

参考:

10
Jason Axelson

在尝试了不同的解决方案之后,这是我的最终设置:

# move x clipboard into tmux paste buffer
bind C-p run "xclip -o | tmux load-buffer -
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i -selection clipboard"

当您拆分时,使用保存缓冲区而不是显示缓冲区可提供真实数据,而没有换行符所示的数据。

我还使用它在tmux复制模式下开始选择/复制:

bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection

我猜有可能将复制选择与“ y”键合并,然后将其移至x剪贴板。

9
Ownatik

我不喜欢额外的按键操作,所以我想要更雄心勃勃的东西。使用[进入复制模式,突出显示正确的文本,然后按]将文本复制到剪贴板。

另外,tmux喜欢在换行的表达式中包括换行符(奇怪的是,这些换行符位于错误位置!它们不在表达式在屏幕上换行的位置)。因此,我希望C-]复制删除换行符的表达式。

在tmux 1.6上,我尝试了以下操作:

bind [ copy-mode
bind -t vi-copy ] run "tmux send-keys Enter; tmux show-buffer | xclip -i -selection clipboard;"
bind -t vi-copy C-] run "tmux send-keys Enter; tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard;"

但这没有用,因为tmux似乎不乐意将复杂的东西绑定到vi-copy表。所以我最终改为这样做:

bind [ copy-mode \;                                                        \
    bind -n ] run                                                          \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | xclip -i -selection clipboard;                     \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]" \;                                                  \
    bind -n C-] run                                                        \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard; \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]"

如果您以]或C-]以外的其他方式退出复制模式,则这将导致奇怪的事物([]或C-]在您下次使用时会变得有趣,但只有一次)。我可以想象用更多的绑定来解决此问题,但这确实是我大多数时候想要的。

7
Leif

Mac OS X的解决方案。请按照以下两个步骤操作:

  1. 使用Chris Johnsen的解决方法: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard

  2. 将此代码添加到您的tmux配置(〜/ .tmux.conf)

# paste clipboard into tmux buffer
bind v run-Shell "reattach-to-user-namespace -l zsh -c 'tmux set-buffer \\"$(pbpaste)\\"; tmux paste-buffer'"
# put tmux buffer into x clipboard
bind y run-Shell "reattach-to-user-namespace -l zsh -c 'tmux show-buffer | pbcopy'"
4
Alex Gaudio

这是我相当冗长的答案,应该解决使用xclip从远程(ssh)tmux会话复制缓冲区的两个主要问题:

1.无反应的xclip

对我来说,@ Grauwolf的 answerxclip不起作用(使tmux窗格完全无响应)。我在 Arch Wiki的Tmux页面 中找到了原因:

xclip也可以用于该目的,这与xsel不同,它在打印不适合当前语言环境的原始位流时效果更好。但是,使用xsel而不是xclip更加巧妙,因为xclip从tmux的缓冲区读取后不会关闭STDOUT。因此,tmux不知道复制任务已完成,并继续等待xclip终止,从而使tmux无响应。一种解决方法是将xclip的STDOUT重定向到/ dev/null

因此绑定应为:

bind-key C-y run "tmux save-buffer - | xclip -i -sel clip > /dev/null"

现在,如果您的tmux会话是本地的,则可以使用。

2. xclip无法连接到X

如果您通过ssh -X使用tmux -X,则很有可能直接不起作用

这是因为Shell变量$DISPLAY需要正确设置。

完整的解决方案

所以对我来说完整的解决方案是在我的~/.tmux.conf中放入以下几行:

set-option -g update-environment "DISPLAY"
bind-key C-y run "export DISPLAY=`tmux show-env | sed -n 's/^DISPLAY=//p'`; tmux save-buffer - | xclip -i -selection clipboard >/dev/null"
# Or more concise:
bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's/^DISPLAY=//p'` >/dev/null

对于主要粘贴:

bind-key C-p run "xclip -d `tmux show-env | sed -n s/^DISPLAY=//p` -o | tmux load-buffer - && tmux paste-buffer"

我不完全理解为什么在采购$DISPLAY时未正确设置.tmux.conf,所以这就是为什么我必须使用tmux show-envsed提取它的原因。

如果tmux> = 1.8,则可以使用copy-pipe修改此命令:

bind-key -t vi-copy y copy-pipe 'xclip -in -selection clipboard -d `tmux show-env | sed -n s/^DISPLAY=//p` >/dev/null'
4
PlasmaBinturong

我做了一个稍作修改的可接受答案。

除了xclip的primary默认剪贴板(使用鼠标选择和鼠标中键单击获得的默认剪贴板)之外,我还更喜欢使用系统剪贴板(Ctrl-C,Ctrl-V)。要选择系统剪贴板,您需要将-selection clipboard参数传递给xclip

同样,在将缓冲区复制到剪贴板时,我喜欢选择要复制的缓冲区的功能。使用choose-buffer完成,然后使用save-buffer将缓冲区参数传递给-b %%

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b %% - | xclip -i -selection clipboard\""
# Paste from clipboard
bind C-v run "xclip -o -selection clipboard | tmux load-buffer - ; tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b %% - | xclip -i \""
# Paste from primary
bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

PDATE:以某种方式在tmux 1.8和两个openSUSE 12.2安装中,当tmux run-Shellxclip调用并通过管道从stdin读取时,出现挂起。相反,我决定尝试xsel,这似乎可行。这些是使用xsel的等效键绑定。我还使用&&链接粘贴命令,以提高鲁棒性。

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i -b\""
# Paste from clipboard
bind C-v run "xsel -o -b | tmux load-buffer - && tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i\""
# Paste from primary
bind C-p run "xsel -o | tmux load-buffer - && tmux paste-buffer"
4
Tuxdude

在Arch Wiki上有一个使用xclip的解决方案:

# move tmux copy buffer into x clipboard
bind-key C-y save-buffer /tmp/tmux-buffer \; run-Shell "cat /tmp/tmux-buffer | xclip"

https://wiki.archlinux.org/index.php/Tmux

4
jasonwryan

这些答案中的许多对我在zsh上的Ubuntu 14.04都无效。不知道我的Shell是否与它有任何关系,但这是我的工作版本,使用 此策略 进行复制,并使用 此策略 进行粘贴。

    bind-key -t vi-copy 'v' begin-selection
    bind-key -t vi-copy 'y' copy-pipe "xclip -sel clip -i"
    bind-key ] run-Shell "xclip -sel clip -o | tmux load-buffer - ; tmux paste-buffer" 

一些注意事项:

  • 对于复制管道,我需要使用-sel clip -i指定剪贴板。该行将yank组合到tmux缓冲区,并将其发送到xclip。
  • 要实际粘贴它,我需要再次用-sel clip -o指定哪个剪贴板

现在,这对于我的vim/zsh/tmux设置非常有效。

3
brianclements

我试图找出一种不错的方法将tmux缓冲区中的内容复制到剪贴板中。我已经尝试了几种不同的方法,例如

对于emacs样式绑定,有几种不同的选择。 (Vi风格应该类似吗?)在emacs中执行“复制选择”的典型绑定是M-w,因此在tmux中具有相同的绑定将非常方便。

1-会很理想,但是不起作用(由于tmux的限制?)

unbind-key -t emacs-copy M-w
bind-key -t emacs-copy M-w copy-selection\; \
  run-Shell "tmux save-buffer - | xsel --input --clipboard"

2-对我来说妥协的妥协:在tmux中接受对emacs-copy使用不同的键绑定。使用例如C-M-w。 (此绑定将“全局”定义-不仅在复制模式下,而且仅在复制模式下有用)

bind-key -n C-M-w send-keys M-w\; \
 run-Shell "tmux save-buffer - | xsel --input --clipboard" 
3
Hugo Heden

@Leif答案的改进版本可能是:

tmux bind-key '[' run "tmux copy-mode;
tmux bind-key -n ']' run \"tmux send-keys Enter; tmux save-buffer - | xclip -i -selection clipboard;
tmux unbind-key -n ']'\";
tmux bind-key -n q run \"tmux unbind -n ']'; tmux send-keys q\";
tmux bind-key -n C-c run \"tmux unbind -n ']'; tmux send-keys C-c\""

这样,如果您以[]以外的其他方式退出复制模式,则没有任何后果,上面的代码被包裹在 tundle/tmux-yank 一个tmux插件中,用于将tmux文本复制到系统剪贴板中,在OS X和Linux上,tmux> = 1.6。

1
Javier López

在具有tmux 2.2或更高版本的OS-X上,可以使用以下功能:

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"
1
Kyle Kloepper

我使用 copyq 多行剪贴板管理器。 (它适用于Windows,OSX,Linux。)

  • ~/.tmux.conf中添加以下行:

    set-window-option -g mode-keys vi
    bind C-y run 'out=`tmux save-buffer - ` && copyq add "$out"'
    
  • cygwin要求copyq.exe中的~/.bashrc位置:

    export PATH="$PATH:/cygdrive/c/Program Files (x86)/CopyQ"
    
1
Oleg Svechkarenko