2013-01-05 55 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