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

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


,这使我非常接近,我要做的就是在做prefix-p之后按control-d。 br />
我尝试通过做

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是我在进行其他操作时希望拆分的布局,因此默认情况下会进入涉及拆分的绑定。

评论

确保查看下面的2014年答案,该答案比其他一些答案要新。它推荐使用tmux yank插件,效果很好。

有关Tmux 2.4(2017年4月发布)和2.6的最新答案,请参阅我的答案

Tmux 3.0a Ubuntu 20.04 unix.stackexchange.com/a/607112/148062

#1 楼

这里的文档需要换行符。例如,在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实例中使用此命令,则存在竞争条件。我不知道该怎么解决。

评论


谢谢,效果非常好,比赛条件对我来说并不重要,我只使用1次。

–数字电源
11年6月27日在20:53

为了避免出现种族问题,我建议使用广泛使用的mktemp

–悲伤
16年7月8日在19:40

@Grief好主意。在这种情况下,使用tmux进程的PID也会很好,并且可能会更容易安排(在tmux启动的shell中$ PPID)。但是如何将变量文件名(无论如何构造)放入save-buffer的参数中?我猜保存缓冲区-| …就像Grauwolf的回答一样,这完全消除了一个临时文件?

–吉尔斯'所以-不再是邪恶的'
16年7月8日在19:44



你是对的,我的错,这是不可能的。

–悲伤
16年7月8日在19:50

#2 楼

这应该起作用:

# 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"


评论


确实如此。谢谢,这比使用临时文件好得多。借助TMUX环境变量,它甚至可以自动处理多个并发会话。

–吉尔斯'所以-不再是邪恶的'
2011年7月10日在16:05

对于C-p更好的说明是:绑定C-p运行“ xclip -o | tmux load-buffer-; tmux paste-buffer”-没有引号或命令行限制问题。

–docwhat
2012-2-23在3:37



在复制模式下,tmux是否具有将选择项复制到剪贴板的钩子?

– Ehtesh Choudhury
13年2月5日在18:56

xclip -o选项对我不起作用,所以我更改为绑定C-c运行“ tmux保存缓冲区-| xclip -selection c” \;显示消息“缓冲区复制到剪贴板”

–波卡
13年8月23日在12:46



每次我以这种方式进行复制时,tmux都会停止响应任何键盘快捷键。有什么解决办法吗?

–skrat
2015年6月2日,11:59

#3 楼

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

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

如果您使用自制软件(如果您不是,为什么呢?)那么您可以这样做:

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(您应该已经使用tmux复制了内容)复制到Mac粘贴板,请使用<tmux-key> Control-c。现在可用于Command-vpbpaste

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

评论


这个答案很棒。我正在使用tmux show-buffer导致换行问题tmux save-buffer-解决了它。

–event_jr
2012年3月18日下午5:00

在tmux保存缓冲区的末尾做什么?

– hekevintran
2012年4月13日在17:58

将保存缓冲区发出到stdout。您可以将-替换为文件名,然后将其保存在此处。这样可以防止您编写(和清理)文件。

–docwhat
2012年4月15日下午4:54

从OS X 10.10开始,不再需要重新附加到用户命名空间。关于tmux和OS X的几乎所有教程和文档都提到了这一点,因为几年前复制和粘贴并不容易。如今,它(通常)是开箱即用的。

–拉斐尔·布加杰夫斯基(Rafael Bugajewski)
15年8月3日在8:01

#4 楼

从版本1.8开始增加了copy-pipe命令。它将选择内容复制到tmux缓冲区,并将其通过管道传递给命令。现在,无需前缀绑定。下面是一个示例:现在,当您在copy-mode中选择了一些文本时,y会将这些文本复制到tmux缓冲区以及OS剪贴板。但是,如果要从剪贴板将文本获取到tmux缓冲区,这没有帮助。

评论


完美运行,是最简单的解决方案。

– Naseer
2014年6月3日在18:05



在Linux下不适用于我,但此功能可以:unix.stackexchange.com/a/131074/13601

–塞巴斯蒂安·布拉斯克(Sebastian Blask)
2014年7月2日在15:45

从OS X 10.10开始,似乎没有必要重新附加到用户命名空间。

–克里斯
2015年7月23日在6:45



在capitan上工作

– olleh
2015年10月26日在6:07

这不再适用于2017年4月20日发布的Tmux 2.4。相反,您需要使用bind-key -T copy-mode-vi y send-keys -X copy-pipe“ xclip”和OS X:bind-键-T复制模式-y发送键-X复制管道“重新连接到用户命名空间pbcopy”

–詹森·阿克森(Jason Axelson)
17年12月9日在19:01

#5 楼

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

评论


这是一个很棒的清洁解决方案,应该考虑更多,因为它是比其他方法更新的答案。感谢分享!

–垄断
15年1月28日在5:00

#6 楼

这是尝试提供全面答案的一种尝试。

首先有一段历史

当第一次提出这个问题(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:

如果您使用自制软件,则应通过在终端中运行以下命令来安装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(以及它前面的\;)即可。
如果您使用的是埃马克斯街yle copy-mode而不是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

参考文献:




https://stackoverflow.com/a/21190234/175830


如果没有> /dev/null,则将tmux缓冲区复制到剪贴板将导致tmux不响应快捷方式



https://unix.stackexchange.com/a/70798/14252


Mac自定义




评论


此命令绑定键C-p运行外壳“ xclip -o | tmux加载缓冲区-; tmux粘贴缓冲区”仍然有效吗?对于tmux> 2.4

–alpha_989
18年5月30日在19:31

#7 楼

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

# 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剪贴板。

评论


我试图像您提到的那样合并两个命令,但均未成功。关于如何做的任何想法?

–拉斐尔·维加(Rafael Vega)
2013年6月6日22:25

#8 楼

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

另外,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-]以外的其他方式退出复印模式。我可以想象用更多的绑定来解决此问题,但这在大多数时候都是我想要的。

评论


stackoverflow.com/a/10954274/69663指出,在sourceforge.net/tracker / ...上有一个有关bug绑定限制的错误报告。

–锤子
2012年11月22日13:12

#9 楼

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

评论


tmux是否在共享目录中安全地创建保存缓冲区文件?否则,将其放在/ tmp中是一个安全漏洞。 cat的用法无用,并且缺少删除临时文件的功能。然后,这就是xsel vs xclip的问题,这在这里是等效的,并且您有我的(独立编写的)解决方案。

–吉尔斯'所以-不再是邪恶的'
2011年6月27日21:09



谢谢吉尔。我将更新Wiki以反映您的观点。

– Jasonwryan
11年6月27日在21:12

#10 楼

适用于Mac OS X的解决方案。请遵循以下两个步骤:


使用Chris Johnsen的变通方法:https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard
添加此代码到您的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'"





#11 楼

对已接受答案的略微修改后的变体,我已经准备好了。

除了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"


UPDATE:
以某种方式使用tmux 1.8和两个openSUSE 12.2安装,在通过管道从stdin读取tmux run-shell调用xclip时,我看到挂起。我反而决定尝试给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"


#12 楼

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

1。无响应的xclip

对我来说@Grauwolf对xclip的回答不起作用(使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,则很有可能无法直接使用。

这是因为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

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

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

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


评论


/home/linux/.tmux.conf:11:无效或未知命令:绑定键Cy运行“ tmux保存缓冲区-| xclip -i-选择剪贴板-d`tmux show-env | sed -n的[0 / 0] PLAY = // p'`> / dev / null

–用户
19年4月19日在1:59

@user显示的sed命令与我编写的命令不同...这是您在.tmux.conf中编写的命令吗?

–等离子Binturong
19-4-23在14:59



我只是复制并粘贴了您的代码。

–用户
19年4月23日在19:09

@user,很奇怪。可能有很多错误来源。首先检查您的报价是否正确。然后,您对sed熟悉吗?该命令应为:sed -n s / ^ DISPLAY = // p。或者,您可以使用cut:tmux show-env切-d'='-f2。也可能值得检查您的tmux版本。

–等离子Binturong
19-4-25在8:40



#13 楼


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


对于emacs样式绑定,有一些不同的选择。 (Vi风格应该类似吗?)emacs中用于执行“复制选择”的典型绑定是Mw,因此在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-对我来说妥协的妥协:接受对emacs-使用不同的键绑定复制到tmux。使用例如C-M-w。 (此绑定将“全局”定义-不仅在复制模式下,而且仅在复制模式下有用)

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


#14 楼

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

    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设置。

评论


谢谢! -sel clip -i解决了这个问题。虽然,我不明白为什么您需要再次指定剪贴板才能粘贴它(standard)适用于我

– Melekes
2014年6月11日11:39

#15 楼

改进的@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。

#16 楼

在具有tmux 2.2或更高版本的OS-X上,以下各项将起作用:

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"


#17 楼

我使用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"