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是我在进行其他操作时希望拆分的布局,因此默认情况下会进入涉及拆分的绑定。#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-v
或pbpaste
要从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-env
和sed
提取它。如果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"
评论
确保查看下面的2014年答案,该答案比其他一些答案要新。它推荐使用tmux yank插件,效果很好。有关Tmux 2.4(2017年4月发布)和2.6的最新答案,请参阅我的答案
Tmux 3.0a Ubuntu 20.04 unix.stackexchange.com/a/607112/148062