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

Copy current command at bash prompt to clipboard

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

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

我目前的解决方案是使用bash管道:管道进出剪贴板

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

1
echo"!!" | pbcopy

这不是太可怕,但如果要复制的命令不是最后一个命令,等等。

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


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

1
2
3
4
bind '"\C-]":"\C-e\C-u pbcopy <<"EOF"
\C-y
EOF
"'

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

要使其持久化,可以将上面的bind命令添加到~/.bashrc,或者可以去掉外部引号并删除调用的"bind"部分并将结果添加到~/.inputrc

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

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


你可以在bash 4中使用READLINE_LINEbind -x

1
2
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。

我也使用这个函数来复制最后一个命令:

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

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

由于zsh会删除某些字符的参数,例如'"',我们将使用preexec(),它允许您访问未处理的原始命令。

伪代码是这样的:

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

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

3)将temp变量传送到macOS的复制缓冲区pbcopy

真实代码:

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文件中,或者在任何你想要的地方(我把它放在我的.oh-my-zsh/custom目录中的文件中)。

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


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

1
2
3
4
5
C-]: '\C-e\C-ucat <<EOF | tr -d"\
" | xsel -ib
\C-y
EOF
'

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

1
2
3
4
5
C-]: '\C-e\C-ucat <<EOF | tr -d"\
" | xclip -se c
\C-y
EOF
'

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


我使用history来查找我要查找的命令编号,然后我这样做:

1
echo"!command_number" | xclip -in