Linux 剪贴板,包括 WSL 控制台

Linux 剪贴板,包括 WSL 控制台

我突然想到,任何给定的 Linux 控制台上都有多个剪贴板:

  • 首先是bash剪贴板,可以通过Ctrl-U / K调用,将光标之前(U)或之后(K)的所有行剪切到剪贴板中,或者Ctrl-W,剪切光标左侧的单词(是否有相应的“右侧剪切单词”?),然后按 Ctrl-Y 粘贴到其他地方。

  • 然后我们有 X 剪贴板,其设置如下(我不知道名称pbcopypbpaste来自哪里,但我已经看到这些名称数十次,所以似乎很多人出于某种原因使用该命名法):

sudo apt install xclip xsel
alias pbcopy='xclip -selection clipboard'      # To use xclip for copy
alias pbpaste='xclip -selection clipboard -o'  # To use xclip for paste
alias pbcopy='xsel --clipboard --input'        # To use xsel for copy
alias pbpaste='xsel --clipboard --output'      # To use xsel for paste
  • 此外,如果您使用 WSL,还有来自 Windows 的第三个剪贴板,您可以非常简单地将其发送到,例如echo 123 | clip.exe.要执行相反的操作并粘贴到 WSL 控制台中,您可以使用powershell.exe -noprofile Get-Clipboard > file.txt.

如果能够完全控制如何轻松地从这些不同的剪贴板发送/检索信息,那就太好了。

  • 我可以将信息通过管道传输到 X 剪贴板(使用 xclip 和 xsel),但我还没有找到将内容通过管道传输到 bash 缓冲区的方法;我们如何以编程方式输入 bash 缓冲区?

  • 如何从单个命令中的一个输出将某些内容通过管道传输到所有 4 个剪贴板(假设 和xclipxsel独立的?)(我似乎记得tee可以做到这一点,但不确定)?了解这一点后,我就能够从 4 个剪贴板中的任何一个发送接收信息。

echo 123 | <way-to-pipe-the-output-to-all-or-any-clipboards>

仅供参考,虽然没有回答上述问题。https://stackoverflow.com/questions/5130968/how-can-i-copy-the-output-of-a-command-directly-into-my-clipboard

答案1

我不知道 pbcopy 和 pbpaste 的名字从何而来

这些是 Mac 上的命令行工具。

bash 剪贴板

这并不是一个真正的剪贴板,而是一个内部缓冲区阅读线使用的库bash。它被称为杀环,遵循 emacs,并且与 emacs 中一样工作。有关更多详细信息,请参阅man bash阅读行部分。

然后我们就有了X剪贴板,其设置如下

实际上X本身与a一起工作初级和次级选择,并且选择由应用程序管理,而不是由 X 服务器管理。 X 剪贴板是对此的补充。

更糟糕的是,像 Gtk 这样的库确实有自己的自己的剪贴板

我还没有找到一种方法将东西输入 bash 缓冲区

手册页没有提到任何以某种方式操纵 Kill Ring 的方法(至少我不知道),尽管您可以重新绑定在 Kill Ring 上工作的各种命令。

如何将某些内容通过管道传输到所有 4 个剪贴板中

你不能,除非你编写自己的命令,或者使用不同的现有命令。

如果你想保持 X 选择和 Windows 剪贴板同步(因此更改一个会更改另一个),我想我已经看到了这方面的工具,但我必须再次搜索自己。

考虑到架构,让所有 bash 实例中的终止环与某些东西保持同步是行不通的。没有什么可以阻止您从 X 或 Windows 粘贴到终端中。


如果您在想“但我可以在 Windows 下使用单个剪贴板,所以我想在 WSL 下使用相同的剪贴板”:这不是它的工作原理。

答案2

有几个问题,但我认为归结为:

  • 如何通过管道连接到 Bash(技术上是 Readline)杀环
  • 如何同时通过管道传输到多个剪贴板命令

通过管道连接到 Bash/Readline 杀环

Readline 不提供任何直接操作命令。据我通过查看文档得知,除了rl_kill_text需要输入文本(或通过 插入rl_insert_text)的功能之外,它甚至不提供任何对 Kill Ring 的 API 访问。

理论您可以使用类似“sendkeys”的机制来插入要加载到杀伤环上的文本,然后“sendkeys” CtrlU.但我无法xdotool在 Windows 11 下的 WSLg xterm 窗口中使用它。

另请参阅这个问题有关将文本(理论上可以包括 的控制代码CtrlU)插入到 中的相当详细的讨论bash

但现在,我不得不将其保留为“也许这是可能的,但据我所知,还没有人弄清楚”。

奖励:通过管道连接到tmux粘贴缓冲区

我知道评论中提到了这一点,所以我想我应该添加它,因为我无法为您提供 Bash/Readline 解决方案。

这个很简单:

echo "Hello, World" | tmux load-buffer -

通过管道输出到多个命令

虽然这已经很好地涵盖了这个答案xclip就语法而言,管道中的行为存在一些细微差别。

该问题的接受答案中列出的一般结构是:

command | tee >(pipe1) >(pipe2) >(pipe3)

xclip但当这些命令之一时似乎存在一些不一致。我相信这xclip与运行时与终端分离有关。

作为解决方法,只需将管道的最终结果输出到xclip

echo "Hello, World" | tee >(clip.exe) >(tmux load-buffer -) | xclip

测试脚本:

#!/usr/bin/bash
echo "1" | xclip
echo "2" | clip.exe
echo "3" | tmux load-buffer -
echo "Hello, World" | tee >(clip.exe) >(tmux load-buffer -) | xclip
xclip -o
powershell.exe -noprofile Get-Clipboard | tr -s '\r' '\n'
tmux show-buffer 

相关内容