So erstellen Sie eine Tastenkombination für einen Terminalbefehl

14

Ich arbeite oft mit Git und mochte iTerm2 wegen der Möglichkeit, Tastaturkürzel für Befehle festzulegen. Zum Beispiel setze ich CTRL+ ENTERauf git status.

Ist dies mit gnome-terminal möglich oder können Sie eine andere Option empfehlen, um dies zu erreichen?

Frau
quelle

Antworten:

16

Mit können Sie bind -xeinen Befehl an eine Verknüpfung in Bash binden. Zum Binden des git statusBefehls an die Verknüpfung Crtl+ pkönnen Sie beispielsweise Folgendes verwenden:

 bind -x '"\C-p":git status'

Legen Sie es in eine ~/.bashrcDatei, um es sich zu merken. Aus der Manpage:

-x keyseq: Shell-Befehl

Bewirkt, dass der Shell-Befehl bei jeder Eingabe von keyseq ausgeführt wird. Wenn der Shell-Befehl ausgeführt wird, setzt die Shell die Variable READLINE_LINE auf den Inhalt des Readline-Zeilenpuffers und die Variable READLINE_POINT auf die aktuelle Position der Einfügemarke. Wenn der ausgeführte Befehl den Wert von READLINE_LINE oder READLINE_POINT ändert, werden diese neuen Werte im Bearbeitungsstatus wiedergegeben.

Nykakin
quelle
Genial. Ich verwende zsh, aber das hat eine Entsprechung namens bindkey . Um das zu erreichen, was ich will, habe ich folgendes getan: bindkey -s '^[^M' 'git status\n'was an ALT + EINGABETASTE gebunden ist.
Dienstag,
1
bind -x '"\C-k":firefox'Ich benutze dies, aber es funktioniert nicht
alhelal
1
Dies funktioniert in der Shell, aber ich möchte alle Zeit.
Alhelal
Setzen Sie es am Ende der ~/.bashrcDatei. Wenn es immer noch nicht funktioniert, überprüfen Sie dies
Nykakin
Weitere Informationen zur Verwendung bindfinden Sie hier: stackoverflow.com/a/4201274/712334
Josh Habdas
2

1. Öffnen Sie automatisch ein neues Terminalfenster, in dem die Ausgabe Ihres Befehls angezeigt wird

Da Sie das Terminal geöffnet lassen müssen, nachdem der Befehl ausgeführt wurde, schreiben Sie:

gnome-terminal -e 'bash -c "git status; read line"'

erledigt die Aufgabe mit einer Tastenkombination. Es öffnet sich ein neues gnome-terminal Fenster und führt den Befehl darin aus.

Fügen Sie es einer Verknüpfung hinzu

Wählen Sie: Systemeinstellungen> "Tastatur"> "Verknüpfungen"> "Benutzerdefinierte Verknüpfungen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:

gnome-terminal -e 'bash -c "git status; read line"'

zu Ctrl+Enter

Hinweis

Obwohl Ihre vorgeschlagene Verknüpfung funktioniert, können Sie eine andere Tastenkombination als Ctrl+ auswählen Enter, da diese zumindest mit der LibreOfficeVerknüpfung kollidiert, um zu einer neuen Seite zu springen.

Erläuterung

Um ein neues gnome-terminalFenster über die Befehlszeile zu öffnen und darin einen Befehl auszuführen, können Sie Folgendes verwenden:

gnome-terminal -e 'bash -c <command>'

Obwohl der Befehl erfolgreich ausgeführt wird, wird das Terminalfenster sofort geschlossen, bevor Sie die Ausgabe lesen können.

Die Sektion:

read line

ist dann, um das Terminal offen zu halten (bis Sie drücken Enter), nachdem der Befehl ausgeführt wird.

Andere Befehle

Auf diese Weise können Sie jeden (komplexen) Befehl im Terminal ausführen, ohne ihn sofort schließen zu müssen:

$ gnome-terminal -e 'bash -c "wmctrl -d; read line"'

wird ausgegeben (falls wmctrlinstalliert):

Bildbeschreibung hier eingeben

Nach dem Drücken wird Enterdas Terminal geschlossen.

2. Führen Sie einen Befehl im derzeit aktiven Gnome-Terminal-Fenster aus

Natürlich können Sie könnten einen einfachen Einzeiler unter einer Schnelltaste platzieren (vorausgesetzt , Sie haben xdotoolinstalliert ist ):

xdotool type "<command>"

Dies würde den Befehl jedoch in jeder Anwendung blind eingeben , und die Eingabe des Befehls ist nicht die sauberste Option.

Das kleine Skript unten also:

  • prüft, ob das aktive Fenster ein gnome-terminalFenster ist (anhand seiner PID)
  • Wenn dies der Fall ist, wird der Befehl in das aktive gnome-terminalFenster eingefügt und gedrückt Return.
    Andernfalls führt das Skript keine Aktionen aus , sodass es nicht in andere Anwendungen eingefügt wird.

Da das Skript den Zielbefehl als Argument verwendet, können Sie mehrere Befehle unter mehrere Verknüpfungen setzen.

Das Drehbuch

#!/usr/bin/env python3
import subprocess
import sys
import time

app = "gnome-terminal"
s = (" ").join(sys.argv[1:])

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def front(app):
    try:
        # see if gnome-terminal is running at all (raising error if not)
        app = get(["pgrep", app]) 
    except subprocess.CalledProcessError:
        app = False
    if app:
        # if so, see if the active window belongs to gnome-terminal comparing pids)
        active = get(["xdotool", "getwindowpid", get(["xdotool", "getactivewindow"])])
        return True if app == active else False

if front(app):
    # copy command to clipboard
    cm1 = ["/bin/bash", "-c", 'printf "'+s+'" | xclip -selection clipboard']
    # paste in terminal window
    cm2 = ["xdotool", "key", "Control_L+Shift_L+v"]
    # press return
    cm3 = ["xdotool", "key", "Return"]
    for cm in [cm1, cm2, cm3]:
        subprocess.call(cm)

Wie benutzt man

  1. Das Skript benötigt xdotool

    sudo apt-get installiere xdotool

  2. Erstellen Sie ein Verzeichnis, ~/binfalls es noch nicht vorhanden ist. Melden Sie sich entweder ab oder führen Sie es aussource ~/.profile

  3. Kopieren Sie das obige Skript in eine leere Datei, speichern Sie es als gterm_keys(keine Erweiterung) in ~/binund machen Sie es ausführbar

Jetzt können Sie jeden Befehl über eine Tastenkombination im vordersten gnome-terminalFenster ausführen , indem Sie den folgenden Befehl hinzufügen:

gterm_keys <command>

zu einer Tastenkombination, wie in beschrieben [1]

Jacob Vlijm
quelle
Hallo Jacob, danke für deine Antwort. Ich denke jedoch, dass die Bind (und Bindkey) -Lösungen besser sind, da sie Shell-Builtins sind. Auf diese Weise schreibe ich nicht versehentlich "Git Status" in Libreoffice. ;)
Dienstag,
@mniess Ich bin damit einverstanden, dass die Antwort gut ist, aber wenn Sie meine Antwort sorgfältig lesen und in LibreOffice drucken, kann das nicht passieren . aber hast du gerade downvote ?? Das ist komisch.
Jacob Vlijm
Ich weiß, das Skript sucht nach der laufenden App. Ich habe nicht abgelehnt. Ich habe den Kommentar geschrieben, um Ihnen zu danken, dass Sie sich die Zeit genommen haben, eine so ausführliche Antwort zu schreiben.
Dienstag,
@mniess Ah, tut mir leid, dass ich zu den Schlussfolgerungen gesprungen bin! Die beiden passierten perfekt synchronisiert. Ich bin froh, dass du es nicht warst. "Nur" eine Ablehnung, die mir nichts ausmacht.
Jacob Vlijm
2

Im Falle zsh statt schlag, die folgende Zeile in verwendeten ~/.zshrcBinds git statusbis ALT+ ENTER.

bindkey -s '^[^M' 'git status\n'

Um ALT+ ENTERin Bash zu bekommen , benutze ich diese Zeile:

bind -x '"\e\C-m":git status'
Frau
quelle
Wie würde man die Bindungen für andere Schlüssel identifizieren?
Josh Habdas
1
@ JoshHabdas siehe hier unix.stackexchange.com/questions/76566/…
Mniess