2013-01-05 10 views
14

Ich möchte eine schnelle Tastaturbefehlsfolge, um den aktuellen Befehl an einer Bash-Eingabeaufforderung in die Zwischenablage zu kopieren.Aktuellen Befehl bei der Bash-Eingabeaufforderung in die Zwischenablage kopieren

Um zum Beispiel den letzten Bash-Befehl in die Zwischenablage zu kopieren, drücke ich + [some command sequence], um ihn zu kopieren. Oder, zum Beispiel, um nach einem Befehl in bash history zu suchen, würde ich ctrl + r verwenden, suchen, an der Eingabeaufforderung anzeigen und dann [some command sequence], um es zu kopieren usw.

Meine aktuelle Lösung verwendet bash Rohre: Pipe to/from the clipboard

also den vorherigen Befehl in die Zwischenablage zu kopieren:

echo "!!" | pbcopy 

was nicht zu schrecklich, aber was zu kopieren, wenn der Befehl, usw. nicht der letzte Befehl ist

Was ist der richtige Weg, um das zu erreichen, was ich versuche? um hier zu erreichen?

+0

in welchem ​​System? – alinsoar

+0

OS X wird tun. Eine Linux- und OS X-Lösung ist ideal. –

Antwort

8

Unter @ Lauris Beitrag für die Inspiration, hier ist eine Lösung, die den bind Befehl:

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

ctrl-] wird dann kopieren, was auch immer auf der aktuellen Bash-Eingabeaufforderung ist in die Zwischenablage.

Um es dauerhaft zu machen, können Sie den Befehl bind, wie oben zu Ihrem ~/.bashrc hinzufügen können, oder Sie können die äußeren Anführungszeichen abstreifen und entfernen Sie die ‚bind‘ Teil des Aufrufs und fügen Sie das Ergebnis Ihrer ~/.inputrc.

Nicht-OS-X-Benutzer müssen pbcopy mit dem entsprechenden Befehl, wahrscheinlich xclip, auslagern.

Anstelle einer echo + pipe-Technik wurde ein in Anführungszeichen gesetztes heredoc verwendet, so dass sowohl einfache als auch doppelte Anführungszeichen im Befehl der Bash-Eingabeaufforderung erhalten bleiben. Mit dieser Technik konnte ich zum Beispiel ctrl-] drücken, den tatsächlichen Bind-Befehl von der Terminal-Eingabeaufforderung kopieren und ihn hier in die Antwort einfügen. So behandelt die Heredoc-Technik hier alle Sonderzeichen im Bind-Befehl.

+0

Wie können wir diesen Befehl ändern, um die neue Zeile am Ende von dem, was kopiert wird, auszuschließen? Wenn ich einen Terminal-Befehl auf diese Weise kopiere, wird beim Einfügen der letzten neuen Zeile der Befehl automatisch ausgeführt, was ich nicht will - normalerweise muss der eingefügte Befehl vor der Ausführung bearbeitet werden. Ich habe versucht, '\ n's zu entfernen, aber es funktioniert nicht. – certainlyakey

+1

"Nicht-OS-X-Benutzer müssen pbcopy mit dem entsprechenden Befehl, wahrscheinlich xclip, auslagern." → [siehe hier] (http://jetpackweb.com/blog/2009/09/23/pbcopy-in-ubuntu -Kommandozeile-Zwischenablage /) –

1

Wenn xsel auf Ihrem System installiert ist, können Sie dies in .inputrc hinzufügen:

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

Alternativ, wenn xclip installiert man könnte hinzufügen, um dieses:

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

Hinweis: Benutzter Code von @ Claytons Antwort.

5

Sie können READLINE_LINE mit bind -x in Bash 4:

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

Sie können, indem Sie brew install bash;echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash bash 4 und die Standard-Login-Shell machen installieren.

Ich benutze diese Funktion auch den letzten Befehl kopieren:

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

ich heute eine anständige Menge Zeit damit verbracht, eine einfache zsh Implementierung für macOS Schreiben; Nutzung ist wie folgt:

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() ist eine zsh Hook-Funktion, die direkt aufgerufen werden, wenn Sie die Eingabetaste drücken, aber bevor der Befehl tatsächlich ausführt.

Da zsh Streifen Argumente bestimmter Zeichen wie ‚"‘, wollen wir preexec() verwenden, mit dem Sie die nicht verarbeiteten, ursprünglichen Befehl zugreifen können

Pseudocode so geht:.

1) Stellen der Befehl sicher hat 'c ' am Anfang

2) ist dies der Fall, kopieren sie den gesamten Befehl, char von char, in einer temporären Variable

3) Rohr der temporäre Variable in 01.238., macOS Kopie Puffer

Echt Code:

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 
} 

Gehen Sie voran und halten die beiden oben genannten Funktionen in Ihrer .zshrc Datei, oder wo immer Sie wollen (ich meine in meinem .oh-my-zsh/custom Verzeichnis in einer Datei speichern,).

Wenn jemand eine elegantere Lösung hat, sprechen Sie bitte. Alles zu vermeiden mit der Maus.

0

I history verwenden Sie den Befehl Nummer zu finden, die ich suche, dann mache ich:

echo "!command_number" | xclip -in 
Verwandte Themen