将当前终端提示复制到剪贴板

将当前终端提示复制到剪贴板

有没有办法复制当前写入的 bash 提示符内容?比如我写道:

ping www.google.com

这样终端中的行看起来如下:

petr@sova:~$ ping www.google.com

还没有按回车键。我想将该文本复制到剪贴板。可以吗?

通常的用例是多次点击并找到我想要复制的命令。

答案1

要剪切,请按ctrl+ u。要粘贴,请按ctrl+ y。这会将整行复制到 bash 剪贴板。如果您使用的是 X 和默认的 Ubuntu 终端,则可以使用鼠标标记内容,然后按ctrl+ shift+c进行复制,按ctrl+ shift+v进行粘贴。

答案2

  • #在命令前面添加一个(这样它就变成了注释)
  • 运行
  • 从历史记录中获取它并将其传送到剪贴板实用程序(如 xclip):history | tail -n 1 | sed "s/[[:digit:]]* //" | sed "s/^#//" | xclip

答案3

不确定为什么所有答案都这么复杂,从 bash 4.0 开始,您可以使用访问当前内容$READLINE_LINE。结合 xclip,您就有了现成的、可行的解决方案。将其添加到您的.bashrc

if [[ -n $DISPLAY ]]; then
  copy_line_to_x_clipboard () {
    printf %s "$READLINE_LINE" | xclip -selection CLIPBOARD
  }
  bind -x '"\C-y": copy_line_to_x_clipboard' # binded to ctrl-y
fi

对于 zsh

if [[ -n $DISPLAY ]]; then
    copy_line_to_x_clipboard() {
        echo -n $BUFFER | xclip -selection clipboard
        zle reset-prompt
    }
    zle -N copy_line_to_x_clipboard
    bindkey '^Y' copy_line_to_x_clipboard
fi

答案4

Vi模式解决方案

仅键盘解决方案。所有字符均按原样复制。开箱即用 - 纯 shell 解决方案,无依赖关系(显然除外xsel)。

设置

  1. 在终端中设置 vi 选项:set -o vi
  2. 别名复制未关闭此处文档:alias c2c='cat - <<"" | tr -d '"'"'\n'"'"' | xsel -b'

用法

  1. 无需按 即可将您想要的任何内容写入命令行<return>
  2. 按,<escape>然后按。整行现在应该会消失。要再次输入,请按。<d><d><i>
  3. 键入别名的名称(c2c在我的示例中)并按<return>
  4. <escape>按,<p>然后按<return><return>

好了。现在可以通过按<ctrl>+<v>(GUI)或<ctrl>+<shift>+<v>(合理的 CLI)将删除的文本粘贴到任何地方。如果您的 CLI 不合理,使之成为

fzf 解决方案

有些人喜欢 vi 模式,有些人则不然。但我认为模糊查找器是必须的。它不允许做确切地正如您所要求的,它可以做得更好!fzf 可以以高出几个数量级的效率浏览命令历史记录,而不是“多次点击”。此外,它可以在我的c2c别名中用于复制到剪贴板。目前无法很好地复制当前输入到终端的任何内容(没有鼠标),但如果某些内容在历史记录中,则只需几秒钟即可获取它。

相关内容