urxvt 中是否可以用鼠标选择选项卡作为选项卡?

urxvt 中是否可以用鼠标选择选项卡作为选项卡?

我在 Arch Linux 上运行 urxvt。我可以用鼠标选择输出进行复制/粘贴。当输出包含制表符时会出现问题。所有制表符均被选择并复制为空格。这使得在复制某些输出时很难保留它们的结构。

有什么办法可以解决这个问题吗?

编辑:如果这对问题有任何影响,我正在使用 zsh。

答案1

我不知道有哪个终端可以做到这一点,我只想说一下为什么我认为没有任何终端可以做到这一点:

tab是曾经显示的众多字符之一,在屏幕上输出多个字符或移动光标。 CR(移至行首)、LF(向下)、退格(向左)以及所有移动光标或更改字符属性和/或不显示任何内容的转义序列...

urxvt 甚至无法准确获取应用程序的输出内容。当应用程序向伪终端的从属端发送 LF (\n) 时,您会注意到,大多数时候,它不仅仅像 LF 通常那样向下移动光标,它还会将光标向后移动到行的开头。这是因为 pty 驱动程序将“\n”转换为“\r\n”,然后才能从掌握urxvt 的终端一侧(您可以使用 stty 来更改该行为)。

另请注意,该选择不会捕获尾随空格。

X 选择选择显示的字符,而不是应用程序发送的用于生成该显示的字符(考虑屏幕上任何给定位置的任何字符可能已被一个或多个应用程序覆盖多次) (s))。

某些终端虽然允许捕获它们在伪终端的主端接收到的所有字符,如果不允许,您可以使用“脚本”或“屏幕”来代替。但要将应用程序的输出放入 X 选择中,您也可以简单地执行以下操作:

the-command | xsel

答案2

这个话题偶尔会在各种终端仿真器中出现。中的讨论Debian #259828 xterm:制表符后的空格在选择中表示为空格字符(对于 xterm)urxvt 的开发者有这样的评论:

我考虑在 rxvt-unicode 中实现这一点:选项卡可以在 rxvt-unicode 的数据结构中简单地表示。但是,存在语义问题:

制表符不是字符,而是光标移动。因此,没有好的方法将它们表示为制表符,就像“光标向上”或“转到 5,6”不会在选择文本中表示一样。

并接着说(实际上)urxvt 支持该功能:

如果有人关心的话,这里是 rxvt-unicode-3.8 现在如何实现 HT 字符,以及一些关于效果的初步经验。

当rxvt-unicode-3.8收到HT时,它首先计算选项卡移动(这是相对光标移动)。伊夫所有跳过的字符都是与第一个空格具有相同属性的空格,它将用(非常)宽的制表符替换这些空格(这在 rxvt-unicode 处理宽字符的方式中很容易做到,因此代码更改是有限的scr_tab 方法中的行数少于 15 行)。如果任何字符不是空格,或者属性发生变化(例如颜色),则只会移动光标。

当然,urxvt 3.8 已经发布一段时间了。但请考虑一下应用阻碍的问题:

  • 只需终端本身支持该功能(将标签存储为标签并允许选择它们),
  • 当选项卡到达右边距时,终端必须做正确的事情(该错误报告指出了没有这样做的情况),
  • 终端必须配置为使用硬标签(请参阅stty此设置),
  • 应用程序(以及 ncurses 等库)必须配置为使用硬选项卡,并且
  • screen/tmux 等应用程序必须(再次)管理选项卡作为选项卡,以便在绘制和重新绘制屏幕时将它们作为选项卡发送到终端。

仅仅因为您的应用程序将选项卡发送到屏幕并不意味着它会到达终端。它可以转换为多个级别的空间,并且如果中间级别决定屏幕无论如何都不会改变,则可以完全优化它。

对 urxvt 9.15 的快速检查表明该功能仍然有效(当然是在最简单的配置中):

$ /tmp/foo
hello   .   world
00000000  68 65 6c 6c 6f 09 2e 09  77 6f 72 6c 64 0a        |hello...world.|
0000000e
$ cat /tmp/foo
printf 'hello\t.\tworld\n' |xclip
hd

如果它不适合您,那么您的终端可能被设置为软选项卡,或者上述其他问题之一妨碍了您。

相关内容