2013-01-05 31 views
14

Vorrei una rapida sequenza di comandi da tastiera per copiare il comando corrente da un prompt di bash negli Appunti.Copia il comando corrente al prompt di bash negli appunti

Così, ad esempio, per copiare l'ultimo comando di bash negli Appunti, premere + [some command sequence] per copiarlo. Oppure, per esempio, per cercare un comando in bash hisory, vorrei usare ctrl + r, cercare, visualizzarlo al prompt dei comandi e quindi [some command sequence] per copiarlo, ecc.

La mia soluzione attuale sta usando bash tubi: Pipe to/from the clipboard

Quindi, per copiare il comando precedente per appunti:

echo "!!" | pbcopy 

che non è troppo terribile, ma cosa succede se il comando per copiare non è l'ultimo comando, ecc

Qual è il modo corretto per ottenere ciò che cerco per ottenere qui?

+0

in cui il sistema? – alinsoar

+0

OS X farà. Una soluzione Linux e OS X è l'ideale. –

risposta

8

Prendendo @ post di Lauri per l'ispirazione, ecco una soluzione che utilizza il comando bind:

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

Ctrl] quindi copierà tutto ciò che è sul prompt bash corrente negli appunti.

Per renderlo persistente, è possibile aggiungere il comando bind come sopra al proprio ~/.bashrc oppure è possibile rimuovere le virgolette esterne e rimuovere la parte "bind" della chiamata e aggiungere il risultato al numero ~/.inputrc.

Gli utenti non OS-X dovranno sostituire pbcopy con il comando appropriato, probabilmente xclip.

È stato utilizzato un heredoc quotato anziché una tecnica di echo + pipe, in modo da conservare sia le virgolette singole che le doppie nel comando al prompt bash. Con questa tecnica, ad esempio, sono riuscito a premere ctrl-], copiare il comando bind effettivo dal prompt del terminale e incollarlo qui nella risposta. Quindi la tecnica heredoc gestisce tutti i caratteri speciali nel comando bind qui.

+0

Come possiamo modificare questo comando per escludere la nuova riga alla fine da ciò che viene copiato? Se copio qualsiasi comando Terminale in questo modo, quando incollare la nuova riga finale forzerà il comando ad eseguirsi automaticamente, che non è quello che voglio - di solito c'è bisogno di modificare il comando incollato prima dell'esecuzione. Ho provato a rimuovere '\ n''s ma non funziona. – certainlyakey

+1

"Gli utenti non OS-X dovranno scambiare pbcopy con il comando appropriato, probabilmente xclip." → [vedi qui] (http://jetpackweb.com/blog/2009/09/23/pbcopy-in-ubuntu -command-line-clipboard /) –

1

Se xsel è installato nel sistema, è possibile aggiungere questo in .inputrc:

C-]: '\C-e\C-ucat <<EOF | tr -d "\\n" | xsel -ib\n\C-y\nEOF\n' 

In alternativa, se è installato xclip si potrebbe aggiungere questo:

C-]: '\C-e\C-ucat <<EOF | tr -d "\\n" | xclip -se c\n\C-y\nEOF\n' 

Avviso: Codice utilizzato dalla risposta di @ Clayton.

5

È possibile utilizzare READLINE_LINE con bind -x in bash 4:

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

È possibile installare bash 4 e rendere la shell di login di default eseguendo brew install bash;echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash.

Io uso anche questa funzione per copiare l'ultimo comando:

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

ho speso una discreta quantità di tempo oggi a scrivere una semplice implementazione zsh per MacOS; uso è il seguente:

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() è una funzione di hook zsh che viene chiamato proprio quando si preme entrare, ma prima che il comando in realtà esegue.

Dal strisce zsh argomentazioni di alcuni personaggi come '"', si consiglia di utilizzare preexec(), che consente di accedere al, comando originale non trasformati

Pseudocodice va come questa:.

1) Fare che il comando ha 'c ' all'inizio

2) in caso affermativo, copiare l'intero comando, char da char, a una variabile temporanea

3) tubo la variabile TEMP in 01.238., buffer di copia di MacOS

codice reale:

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 
} 

andare avanti e bastone le due funzioni di cui sopra nel file .zshrc, o dove vuoi (ho messo la mia in un file nella mia directory .oh-my-zsh/custom).

Se qualcuno ha una soluzione più elegante, prego parlare. Qualsiasi cosa per evitare l'uso del mouse.

0

Io uso history per trovare il numero di comando che sto cercando, poi faccio:

echo "!command_number" | xclip -in 
Problemi correlati