将bash提示符下的当前命令复制到剪贴板

时间:2013-01-05 23:46:46

标签: macos bash

我想快速键盘命令序列将当前命令在bash提示符下复制到剪贴板。

因此,例如,要将最后一个bash命令复制到剪贴板,我会按+ [some command sequence]复制它。或者,例如,要在bash中搜索命令,我会使用ctrl + r,搜索,在命令提示符下显示它,然后[some command sequence]复制它等等。

我目前的解决方案是使用bash管道:Pipe to/from the clipboard

因此,要将上一个命令复制到剪贴板:

echo "!!" | pbcopy

哪个并不太可怕,但如果要复制的命令不是最后一个命令,那该怎么办

实现我想要实现的目标的正确方法是什么?

5 个答案:

答案 0 :(得分:9)

以@ Lauri的帖子为灵感,这是使用bind命令的解决方案:

bind '"\C-]":"\C-e\C-u pbcopy <<"EOF"\n\C-y\nEOF\n"'

ctrl-]然后将当前bash提示符下的任何内容复制到剪贴板。

要使其保持持久性,您可以将上述绑定命令添加到~/.bashrc,或者您可以删除外部引号并删除调用的“绑定”部分并将结果添加到~/.inputrc 1}}。

非OS-X用户必须使用适当的命令(可能是xclip)交换pbcopy。

使用引用的heredoc而不是echo + pipe技术,以便保留bash提示符中命令中的单引号和双引号。通过这种技术,例如,我能够点击ctrl-],从终端提示符复制实际的绑定命令,并将其粘贴到答案中。所以heredoc技术在这里处理bind命令中的所有特殊字符。

答案 1 :(得分:5)

您可以在bash 4中使用READLINE_LINE bind -x

copyline() { printf %s "$READLINE_LINE"|pbcopy; }
bind -x '"\C-xc":copyline'

您可以通过运行brew install bash;echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash安装bash 4并使其成为默认登录shell。

我也使用此功能复制最后一个命令:

cl() { history -p '!!'|tr -d \\n|pbcopy; }

答案 2 :(得分:2)

今天我花了相当多的时间为 macOS 写一个简单的 zsh 实现;用法如下:

example command:          git commit -m "Changed a few things"
command that copies:      c git commit -m "Changed a few things"

# The second command does not actually execute the command, it just copies it. 

# Using zsh, this should reduce the whole process to about 3 keystrokes:
#
# 1) CTRL + A (to go to the beginning of the line) 
# 2) 'c' + ' '
# 3) ENTER

preexec()是一个zsh hook函数,当你按Enter键但在命令实际执行之前调用它。

由于zsh会删除某些字符(如“”)的参数,因此我们需要使用preexec(),这样您就可以访问未经处理的原始命令。

Pseudocode是这样的:

1)确保命令在开头有'c '

2)如果是,则将整个命令char by char复制到临时变量

3)将temp变量传递给pbcopy,macOS的复制缓冲区

真实代码

c() {} # you'll want this so that you don't get a command unrecognized error

preexec() {
  tmp="";
  if [ "${1:0:1}" = "c" ] && [ "${1:1:1}" = " " ] && [ "${1:2:1}" != " " ]; then                                  
    for (( i=2; i<${#1}; i++ )); do
      tmp="${tmp}${1:$i:1}";  
    done
    echo "$tmp" | pbcopy;
  fi
}

继续并将上述两个函数放在.zshrc文件中,或者在任何你想要的地方(我把它放在我的.oh-my-zsh/custom目录中的文件中)。

如果有人有更优雅的解决方案,请说出来。 任何避免使用鼠标的内容

答案 3 :(得分:1)

如果系统上安装了xsel,您可以在 .inputrc 中添加:

C-]: '\C-e\C-ucat <<EOF | tr -d "\\n" | xsel -ib\n\C-y\nEOF\n'

或者,如果安装了xclip,您可以添加:

C-]: '\C-e\C-ucat <<EOF | tr -d "\\n" | xclip -se c\n\C-y\nEOF\n'

注意:来自@ Clayton答案的代码。

答案 4 :(得分:0)

我使用history查找我要查找的命令编号,然后执行:

echo "!command_number" | xclip -in