如何在没有鼠标的情况下从我的xterm中复制文本?

37

我想要将从命令行运行的命令的一部分输出到另一个xterm中,或者作为另一个命令的一部分。例如:

> grep error error.log
error: can't find file ~/<some very long path>/thisfile

我希望你能帮我做到这一点:

>ls ~/<some very long path>/

我知道两种方法来做到这一点:
1.用鼠标复制~/<some very long path>/
2.使用head/tail/awk/sed/perl/cut/等的某些组合从输出中提取我所需的内容,然后将其放入反引号内。
有没有不使用鼠标即可复制文本的方法?我想到的例子是VIM中的视觉模式,但我不知道如何在xterm中执行。

相关/相同的问题在其他地方:http://superuser.com/q/555886/128768; https://dev59.com/bHI_5IYBdhLWcg3wEe1u; http://superuser.com/q/228236/128768 - Nikos Alexandris
6个回答

48
您可以使用GNU screen的复制和粘贴命令。
快速教程:
1. 打开screen:`screen`(或 `screen myprog my args here`) 2. 运行您的程序,生成您想要复制的输出。 3. 进入复制模式:`Control+a+[` 4. 将光标移动到起始点。 5. 按Enter键。 6. 将光标移动到结束点。 7. 按Enter键。 8. 粘贴:`Control+a+]`
Screen比这更强大(我用它来进行多个虚拟终端的选项卡,而无需特殊的终端仿真器,也不会在X崩溃或其他情况下失去我的会话)。要退出screen,请简单地结束您的shell会话或输入`Ctrl+a Ctrl+\`。

4
有没有办法在终端以外的其他地方粘贴文本? - Julio Marins
3
到目前为止,还没有人使用vim键绑定构建过这样的术语。 - Patrick Michaelsen

12

我发现XSel在类似的情况下非常有用。它是一个操纵X选择的工具。例如,这将把您的命令输出存储到剪贴板中:

grep error error.log | xsel -bi

9

你也可以使用 tmux,它与 screen 具有相似的功能。一旦你进入了 tmux 并且有了要复制的输出内容,你可以按照以下步骤进行复制和粘贴:

  1. 使用 Ctrl + B, [ 进入复制模式。
  2. 使用箭头键移动光标,然后使用 Ctrl + Space 开始选择。
  3. 将光标移动到要复制的文本/区域,然后使用 Alt + W 复制(这将立即退出复制模式)。
  4. 现在你可以使用 Ctrl + B, ] 粘贴(仅限于 tmux 内部)。
这些说明假定启用了emacs键绑定。对于vi绑定,请参见此comparison或按照this逐步指南操作。

3

楼主说他不想这样做,但为了后人留存,这里是一种Unix工具的方法。如果您学会了这些小型Unix实用程序,它们可以非常强大。

ls $(dirname $(grep error error.log | head -1 | cut -d“ ”-f5-))

注意:从记忆中提取的语法。


1
最简单的方法是使用byobu,它在后台使用tmuxscreen。它是一个包装工具,使得使用screentmux更加高效、快速和容易。因此,它也使得复制和粘贴变得非常简单。
一旦你进入了byobu并且有了要复制的输出,你可以按照以下步骤进行复制和粘贴:
  1. 按下 F7 进入滚动模式。此模式允许在先前命令的输出或文本编辑器正文中使用箭头键或 PageUpPageDown 键上下滚动。
  2. 使用箭头键将光标移动到要开始复制的位置。
  3. 按下并释放 Space 键。
  4. 移动光标以选择要复制的文本/区域(这看起来非常类似于 vim 的 VISUAL 模式)。
  5. 按下 Enter 进行复制(这将立即退出您的滚动模式和复制模式)。
  6. 现在,您可以使用 Alt + Insert 进行粘贴(默认仅限于 byobu,但您可以通过安装 xclip 并在 byobu 中进行一些设置来扩展启用粘贴的应用程序--> 观看 Introduction to terminal multiplexers - Part 2,从大约 42 分钟到 48 分钟)。

1

您可以使用xterm设备号直接将输出发送到相关的xterm。以下是命令。

xyz$ls /home/ankit/documents/etc/x/y/z > /dev/pts/0 

(或者是设备名称,您可以使用命令“w”来获取已打开的xterm)
试一下,希望这能解决您的问题。

3
这不会使输出结果可供重新使用。 - Dennis Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接