2013-01-05 20 views
14

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

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

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

所以,以前的命令复制到剪贴板:

echo "!!" | pbcopy 

这是不是太可怕,但如果该命令复制不是最后命令等

什么是实现我尝试的正确方法在这里实现?

+0

? – alinsoar

+0

OS X会做。 Linux和OS X解决方案非常理想。 –

回答

8

以@劳里的职位为灵感,这里是使用bind命令的解决方案:

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

CTRL-],然后将复制无论是对当前bash提示符到剪贴板。

为了保持它的持久性,您可以像上面那样将绑定命令添加到您的~/.bashrc,或者您可以去掉外部引号并删除调用的“绑定”部分并将结果添加到~/.inputrc

非OS-X用户必须将pbcopy与相应的命令(可能是xclip)交换出来。

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

+0

我们如何修改这个命令从最终被复制的东西中排除新行?如果我以这种方式复制任何终端命令,当粘贴最后一行时会自动强制命令执行,这不是我想要的 - 通常需要在执行前编辑粘贴的命令。我试图删除'\ n',但它不起作用。 – certainlyakey

+1

“非OS-X用户必须用适当的命令交换pbcopy,可能是xclip。”→[see here](http://jetpackweb.com/blog/2009/09/23/pbcopy-in-ubuntu -command线剪贴板/) –

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的回答中使用的代码。

5

您可以在bash 4使用READLINE_LINEbind -x

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

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

我也用这个功能来复制最后的命令:

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

今天我花了很多时间像样的数目写一个简单的的zsh实施MacOS的;用法如下:

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的钩子函数,但该命令实际执行之前。

由于某些字符,例如'“,我们将要使用preexec(),它允许您访问未经处理的原始命令

伪代码是这样的zsh中带参数:

1)请确保该命令在开始

2)如果是这样,通过焦炭复制整个命令,焦炭,到一个临时变量

3)管道的临时变量到,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目录)。

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

0

我用history找到我要找的命令数量,然后我做的:

在系统
echo "!command_number" | xclip -in