22

我想要一个快速的键盘命令序列,以将 bash 提示符下的当前命令复制到剪贴板。

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

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

因此,要将前面的命令复制到剪贴板:

echo "!!" | pbcopy

这还不算太糟糕,但是如果要复制的命令不是最后一个命令等等怎么办?

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

4

5 回答 5

9

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

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

ctrl-] 然后会将当前 bash 提示符上的所有内容复制到剪贴板。

为了使其持久化,您可以将上述绑定命令~/.bashrc添加到您的~/.inputrc.

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

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

于 2013-01-06T02:01:13.293 回答
7

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

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

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

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

cl() { history -p '!!'|tr -d \\n|pbcopy; }
于 2014-05-17T11:05:03.383 回答
3

我今天花了相当多的时间为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 钩子函数,当你按下回车键时会被调用,但在命令实际执行之前。

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

伪代码是这样的:

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

2)如果是这样,将整个命令逐个字符地复制到临时变量

3) 将 temp 变量通过管道传输到pbcopymacOS 的复制缓冲区中

真实代码

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目录中的文件中)。

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

于 2017-02-16T04:37:44.393 回答
2

如果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 答案的代码。

于 2013-07-27T07:33:11.370 回答
0

history用来查找要查找的命令号,然后执行以下操作:

echo "!command_number" | xclip -in
于 2018-02-10T02:31:10.440 回答