我想快速键盘命令序列将当前命令在bash提示符下复制到剪贴板。
因此,例如,要将最后一个bash命令复制到剪贴板,我会按+ [some command sequence]
复制它。或者,例如,要在bash中搜索命令,我会使用ctrl + r,搜索,在命令提示符下显示它,然后[some command sequence]
复制它等等。
我目前的解决方案是使用bash管道:Pipe to/from the clipboard
因此,要将上一个命令复制到剪贴板:
echo "!!" | pbcopy
哪个并不太可怕,但如果要复制的命令不是最后一个命令,那该怎么办
实现我想要实现的目标的正确方法是什么?
答案 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