Comment créer un raccourci clavier pour une commande de terminal

16

Je travaille souvent avec git et j'adore iTerm2 pour la possibilité de définir des raccourcis clavier pour les commandes. Par exemple, j'ai défini CTRL+ ENTERsur git status.

Est-ce possible avec gnome-terminal ou pouvez-vous recommander une autre option pour y parvenir?

mniess
la source

Réponses:

17

Vous pouvez utiliser bind -xpour lier une commande à un raccourci dans Bash. Par exemple, pour lier la git statuscommande au raccourci Crtl+, pvous pouvez utiliser:

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

Mettez-le dans un ~/.bashrcfichier pour vous en souvenir. Depuis la page de manuel:

-x keyseq: commande-shell

Entraîne l'exécution de la commande shell à chaque entrée de keyseq. Lorsque la commande shell est exécutée, le shell définit la variable READLINE_LINE sur le contenu du tampon de ligne Readline et la variable READLINE_POINT sur l'emplacement actuel du point d'insertion. Si la commande exécutée change la valeur de READLINE_LINE ou READLINE_POINT, ces nouvelles valeurs seront reflétées dans l'état d'édition.

Nykakin
la source
Impressionnant. J'utilise zsh mais qui a un équivalent appelé bindkey . Donc, pour réaliser ce que je veux, j'ai fait ceci: bindkey -s '^[^M' 'git status\n'qui se lie à ALT + ENTER.
mniess
1
bind -x '"\C-k":firefox'J'utilise ça mais ça ne marche pas
alhelal
1
Cela fonctionne en shell, mais je veux tout le temps.
alhelal
Mettez-le à la fin du ~/.bashrcfichier. Si cela ne fonctionne toujours pas, vérifiez cela
Nykakin
Plus d'informations sur l'utilisation bindpeuvent être trouvées ici: stackoverflow.com/a/4201274/712334
Josh Habdas
2

1. Ouvrez automatiquement une nouvelle fenêtre de terminal, affichant la sortie de votre commande

Comme vous devez garder le terminal ouvert après l'exécution de la commande, mettez:

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

sous une combinaison de touches de raccourci, fera le travail. Il ouvrira une nouvelle gnome-terminal fenêtre et exécutera la commande à l'intérieur.

Ajoutez-le à un raccourci

Choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:

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

à Ctrl+Enter

Remarque

Bien que votre raccourci suggéré fonctionne, vous pouvez choisir une autre combinaison de touches, puis Ctrl+ Enter, car il se heurte au moins au LibreOfficeraccourci pour passer à une nouvelle page.

Explication

Pour gnome-terminalouvrir une nouvelle fenêtre à partir de la ligne de commande et y exécuter une commande, vous pouvez utiliser:

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

Cependant, bien que la commande s'exécute correctement, la fenêtre du terminal se ferme immédiatement avant que vous puissiez lire la sortie.

La section:

read line

est alors de garder le terminal ouvert (jusqu'à ce que vous frappiez Enter) après l'exécution de la commande.

Autres commandes

De cette façon, vous pouvez exécuter n'importe quelle commande (complexe) dans le terminal, sans la fermer immédiatement:

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

affichera (s'il wmctrlest installé):

entrez la description de l'image ici

Après avoir appuyé sur Enterle terminal se fermera.

2. Exécution d'une commande dans la fenêtre gnome-terminal actuellement active

Bien sûr, vous pouvez placer une simple ligne sous une touche de raccourci (en supposant que vous avez xdotoolinstallé):

xdotool type "<command>"

Cependant, cela taperait la commande à l' aveugle , dans n'importe quelle application, et taper la commande n'est pas l'option la plus propre.

Le petit script ci-dessous donc:

  • regarde si la fenêtre active est une gnome-terminalfenêtre (par son pid)
  • si c'est le cas, il colle la commande dans la gnome-terminalfenêtre active , appuie sur Return.
    Sinon, le script ne fait rien , il ne sera donc pas collé dans d'autres applications.

Étant donné que le script prend la commande ciblée comme argument, vous pouvez placer plusieurs commandes sous plusieurs raccourcis.

Le script

#!/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)

Comment utiliser

  1. Le script a besoin xdotool

    sudo apt-get install xdotool

  2. Créez un répertoire ~/bins'il n'existe pas encore, déconnectez-vous / connectez-vous ou exécutezsource ~/.profile

  3. Copiez le script ci-dessus dans un fichier vide, enregistrez-le sous gterm_keys(sans extension) dans ~/bin, et rendez-le exécutable

Vous pouvez maintenant exécuter n'importe quelle commande, à partir d'une touche de raccourci, dans la gnome-terminalfenêtre la plus en avant en ajoutant la commande:

gterm_keys <command>

à une touche de raccourci, comme décrit dans [1]

Jacob Vlijm
la source
Salut Jacob, merci pour ta réponse. Je pense, cependant, que les solutions bind (et bindkey) sont meilleures car elles sont intégrées au shell. De cette façon, je n'écrirai pas accidentellement "git status" dans Libreoffice. ;)
mniess
@mniess Je suis d'accord que la réponse est bonne, mais pour mémoire, si vous lisez attentivement ma réponse, en imprimant dans LibreOffice, cela ne peut pas arriver . mais avez-vous juste downvote ?? C'est hilarant.
Jacob Vlijm
Je sais, le script vérifie l'application en cours d'exécution. Je n'ai pas downvote. J'ai écrit le commentaire pour vous remercier d'avoir pris le temps d'écrire une réponse aussi détaillée.
mniess
@mniess Ah, désolé de sauter aux conclusions! Les deux se sont produits parfaitement synchronisés. Je suis content que ce ne soit pas toi. "Juste" un downvote qui ne me dérange pas.
Jacob Vlijm
2

Si zsh est utilisé à la place de bash, la ligne suivante ~/.zshrcse lie git statusà ALT+ ENTER.

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

Pour obtenir ALT+ ENTERdans Bash, j'utilise cette ligne:

bind -x '"\e\C-m":git status'
mniess
la source
Comment procéder pour identifier les liaisons pour d'autres clés?
Josh Habdas
1
@JoshHabdas regardez ici unix.stackexchange.com/questions/76566/…
mniess