web-dev-qa-db-fra.com

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

Je travaille souvent avec git et j'aimais iTerm2 pour la possibilité de définir des raccourcis clavier pour les commandes. Par exemple, je mets CTRL+ENTER à git status.

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

11
mniess

Vous pouvez utiliser bind -x pour lier une commande à un raccourci dans Bash. Par exemple, pour lier la commande git status à Crtl+p raccourci que vous pouvez utiliser:

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

Placez-le dans le fichier ~/.bashrc pour vous en souvenir. De la page de manuel:

-x keyseq: commande shell

Cause La commande shell doit être exécutée chaque fois que keyseq est entré. Lorsque la commande Shell est exécutée, le shell définit la variable READLINE_LINE sur le contenu du tampon de la 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.

15
Nykakin

1. Ouvrez automatiquement une nouvelle fenêtre de terminal, affichant le résultat de votre commande

Puisque 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 fenêtre new gnome-terminal et exécutera la commande qu'il contient.

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 le raccourci suggéré fonctionne, vous pouvez choisir une autre combinaison de touches, puis Ctrl+Enter, puisqu'il au moins se heurte au raccourci LibreOfficepour passer à une nouvelle page.

Explication

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

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

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

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 (si wmctrlest installé):

enter image description here

Après avoir appuyé sur Enter le terminal va fermer.

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

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

xdotool type "<command>"

Cependant, cela taperait la commande à l'aveuglette , dans toute application et en tapant la commande n'est pas l'option la plus propre.

Le petit script ci-dessous donc:

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

Comme le script utilise la commande ciblée comme argument, vous pouvez placer plusieurs commandes sous plusieurs raccourcis.

Le scénario

#!/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 de xdotoolname__

    Sudo apt-get install xdotool

  2. Créez un répertoire ~/bin s'il n'existe pas encore, déconnectez-vous/ouvrez ou exécutez source ~/.profile

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

Vous pouvez maintenant exécuter toute commande à partir d'une touche de raccourci dans la fenêtre la plus antérieure de gnome-terminal en ajoutant la commande suivante:

gterm_keys <command>

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

2
Jacob Vlijm

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

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

Obtenir ALT+ENTER dans Bash, j'utilise cette ligne:

bind -x '"\e\C-m":git status'
1
mniess