我使用 Windows 10 中的 PuTTY 通过 SSH 访问各种 Linux 系统。在这些系统中,我经常使用 Tmux 来简化我在 Linux 环境中的生活。在 Tmux 会话中,我通常有一个或多个窗口,这些窗口被细分为多个窗格。
我经常使用鼠标在 PuTTY 中选择/复制文本,然后右键单击将其粘贴到其中。通常,当换行时,这在 Tmux 之外工作得很好,但在 tmux 会话内,我无法执行多行操作特定窗格内的选择。
我怎样才能做到这一点?
答案1
如果您要复制某些内容并将其粘贴到 tmux 中,则可以使用其内置的复制/粘贴功能。如果您启用了 vi 键绑定并使用默认设置,则将<prefix> [
进入复制模式、导航到文本、space
开始突出显示并enter
完成。然后你就可以prefix ]
在 tmux 中粘贴了。请注意,这会将复制的文本保留在 tmux 自己的缓冲区中,并且不会进入本地计算机的剪贴板。
如果需要在 PuTTY 外部粘贴,可以按住 Alt 键并用鼠标进行选择,以在窗格中进行块选择。
答案2
通过一些技巧,可以通过 PuTTY 将 tmux 缓冲区取回并返回到客户端。我使用“AUX”端口(串行打印机)的 ANSI 转义码来完成此操作。
以下只是该传输方法的一种实现:
1)在服务器端tmux.conf
添加:
# Send the tmux copy buffer to a file. The file is read for ANSI printing by "t" alias in .bashrc
bind -t vi-copy y copy-pipe 'cat > ~/.tmux-buffer'
2)在服务器端.bashrc
添加:
t() {
# Configure a PuTTY profile to send "t" as the "Remote command". This
# function will automatically reattach to an existing tmux session if one
# exists, or start a new one. This function also repeatedly sends our
# homemade tmux clipboard back to the PuTTY client in the form of an ANSI
# printer escape sequence. The contents of the homemade clipboard are
# populated by `bind -t vi-copy y copy-pipe 'cat > ~/.tmux-buffer'` in
# tmux.conf. It is expected that the PuTTY client will be configured to
# print to a "Microsoft XPS Document Writer" which saves the printer output
# to a file. The file is subsequently read by an AutoHotkey macro, and the
# contents are made available for paste.
[[ "$TERM" == "xterm" ]] || return 0 # This prevents recursive runs, in case t() is called after tmux is started.
{ while :; do tput mc5; cat ~/.tmux-buffer; tput mc4; sleep 5; done } &
tmux attach || tmux
}
3) 在客户端 (Microsoft Windows),创建新打印机:
- 添加打印机
- 创建新端口 > 本地端口
- 输入端口名称>“
PuTTY_Printer_File
” - 驱动程序 > Microsoft XPS 文档编写器
- 打印机名称 > “
PuTTY Printer
” - 可选:打印测试页并确保它显示在文件@“
%USERPROFILE%\Documents\PuTTY_Printer_File
”的内容中
4)在客户端PuTTY配置中:
- 将“终端”>“打印机将 ANSI 打印机输出发送到:”设置为新创建的名为“
PuTTY Printer
”的打印机 - 将“连接”>“SSH”>“远程命令:”设置为“
t
”(参考上面的.bashrc函数)
此时,您可以通过在 tmux 复制模式下突出显示某些文本并按 ,将 tmux 缓冲区的内容发送到 PuTTY 客户端y
。选定的文本将返回%USERPROFILE%\Documents\PuTTY_Printer_File
到客户端。如果您想更进一步并模拟从此文件中“粘贴”,您可以使用热键序列来读取文件的内容并将其插入。下面是一个利用 AutoHotKey 的示例,但如果您愿意,也可以在 PowerShell 中实现相同的结果。
5)客户端AutoHotKey宏:
;### Get contents of PuTTY ANSI printer device output and paste it
#v:: ;Winkey + v
FileRead, PuTTYPrinter, %USERPROFILE%\Documents\PuTTY_Printer_File
SendInput %PuTTYPrinter%
PuTTYPrinter = ; Free up memory
return
6)完整的使用流程:
- 使用 PuTTY 连接到服务器并通过 t() 函数将其放入 tmux。
- 当准备好选择文本进行复制时,使用 tmux 热键进行复制模式 (
Ctrl + b
,[
) - 用箭头键移动光标
- 开始选择
spacebar
- 结束选择并复制它
y
- 返回客户端运行 PuTTY,
WindowsKey + v
将粘贴选择
由于图片相当于 1,000 字,以下是所发生情况的概述:
链接:
我在 Stack Overflow 上的回答 -https://stackoverflow.com/a/41560941/3163993
视频演示/解释 -https://www.youtube.com/watch?v=kEIpE2XpDdY
答案3
解决该问题的方法是首先最大化窗格,然后使用鼠标复制文本。使用前缀-Z 最大化当前窗格。
答案4
当有多个垂直窗格时,要从一个窗格复制文本,您可以按<Alt>
然后开始拖动鼠标来复制文本块。适用于连接到远程 CentOS 服务器的 Windows 10。