Copy current command at bash prompt to clipboard
我想快速键盘命令序列将当前命令在bash提示符下复制到剪贴板。
因此,例如,要将最后一个bash命令复制到剪贴板,我会按+
我目前的解决方案是使用bash管道:管道进出剪贴板
因此,要将上一个命令复制到剪贴板:
1 | echo"!!" | pbcopy |
这不是太可怕,但如果要复制的命令不是最后一个命令,等等。
实现我想要实现的目标的正确方法是什么?
以@Lauri的帖子为灵感,这是使用bind命令的解决方案:
1 2 3 4 | bind '"\C-]":"\C-e\C-u pbcopy <<"EOF" \C-y EOF "' |
ctrl-]然后将当前bash提示符中的任何内容复制到剪贴板。
要使其持久化,可以将上面的bind命令添加到
非OS-X用户必须使用适当的命令(可能是xclip)交换pbcopy。
使用引用的heredoc而不是echo + pipe技术,以便保留bash提示符中命令中的单引号和双引号。通过这种技术,例如,我能够点击ctrl-],从终端提示符复制实际的绑定命令,并将其粘贴到答案中。因此,heredoc技术在这里处理bind命令中的所有特殊字符。
你可以在bash 4中使用
1 2 | copyline() { printf %s"$READLINE_LINE"|pbcopy; } bind -x '"\C-xc":copyline' |
您可以通过运行
我也使用这个函数来复制最后一个命令:
1 2 | cl() { history -p '!!'|tr -d \ |pbcopy; } |
今天我花了相当多的时间为macOS编写一个简单的zsh实现;用法如下:
1 2 3 4 5 6 7 8 9 10 | 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 |
由于zsh会删除某些字符的参数,例如'"',我们将使用
伪代码是这样的:
1)确保命令在开头有
2)如果是,将整个命令char by char复制到temp变量
3)将temp变量传送到macOS的复制缓冲区
真实代码:
1 2 3 4 5 6 7 8 9 10 11 | 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文件中,或者在任何你想要的地方(我把它放在我的
如果有人有更优雅的解决方案,请说出来。
任何要避免使用鼠标的东西。
如果您的系统上安装了
1 2 3 4 5 | C-]: '\C-e\C-ucat <<EOF | tr -d"\ " | xsel -ib \C-y EOF ' |
或者,如果安装了
1 2 3 4 5 | C-]: '\C-e\C-ucat <<EOF | tr -d"\ " | xclip -se c \C-y EOF ' |
注意:使用来自@ Clayton答案的代码。
我使用
1 | echo"!command_number" | xclip -in |