Come creare una scorciatoia da tastiera per un comando terminale


15

Lavoro spesso con git e ho adorato iTerm2 per la capacità di impostare scorciatoie da tastiera per i comandi. Ad esempio, ho impostatoCTRL + ENTERsu git status.

È possibile con gnome-terminal o puoi consigliare un'altra opzione per raggiungere questo obiettivo?

Risposte:


16

È possibile utilizzare bind -xper associare un comando a un collegamento in Bash. Ad esempio, per associare il git statuscomando a Crtl+ pcollegamento è possibile utilizzare:

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

Mettilo nel ~/.bashrcfile per ricordarlo. Dalla pagina man:

-x keyseq: shell-command

Fa sì che il comando shell venga eseguito ogni volta che viene inserito keyseq. Quando viene eseguito il comando shell, la shell imposta la variabile READLINE_LINE sul contenuto del buffer di linea Readline e la variabile READLINE_POINT sulla posizione corrente del punto di inserimento. Se il comando eseguito modifica il valore di READLINE_LINE o READLINE_POINT, questi nuovi valori si rifletteranno nello stato di modifica.


Eccezionale. Sto usando zsh ma questo ha un equivalente chiamato bindkey . Quindi per ottenere quello che voglio ho fatto questo: bindkey -s '^[^M' 'git status\n'che si lega ad ALT + INVIO.
mniess,

1
bind -x '"\C-k":firefox'Lo uso ma non funziona
alhelal

1
Funziona in shell, ma lo voglio sempre.
alhelal,

Mettilo alla fine del ~/.bashrcfile. Se continua a non funzionare, controlla questo
Nykakin

Maggiori informazioni su come usare bindpuò essere trovato qui: stackoverflow.com/a/4201274/712334
Josh Habdas

2

1. Apri automaticamente una nuova finestra del terminale, mostrando l'output del tuo comando

Poiché è necessario mantenere aperto il terminale dopo l'esecuzione del comando, inserendo:

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

sotto una combinazione di tasti di scelta rapida, farà il lavoro. Si aprirà un nuovo gnome-terminal finestra ed eseguirà il comando al suo interno.

Aggiungilo a una scorciatoia

Scegli: Impostazioni di sistema> "Tastiera"> "Scorciatoie"> "Scorciatoie personalizzate". Fai clic su "+" e aggiungi il comando:

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

a Ctrl+Enter

Nota

Sebbene il collegamento suggerito funzioni, è possibile scegliere un'altra combinazione di tasti quindi Ctrl+ Enter, poiché almeno si scontra con il LibreOfficecollegamento per passare a una nuova pagina.

Spiegazione

Per gnome-terminalaprire una nuova finestra dalla riga di comando ed eseguire un comando al suo interno, è possibile utilizzare:

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

Tuttavia, sebbene il comando verrà eseguito correttamente, la finestra del terminale si chiuderà immediatamente prima di poter leggere l'output.

La sezione:

read line

è quindi mantenere aperto il terminale (fino a quando non si preme Enter) dopo l'esecuzione del comando.

Altri comandi

In questo modo, è possibile eseguire qualsiasi comando (complesso) nel terminale, senza averlo chiuso immediatamente:

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

verrà emesso (se wmctrlinstallato):

inserisci qui la descrizione dell'immagine

Dopo aver premuto Enteril terminale si chiuderà.

2. Esecuzione di un comando nella finestra gnome-terminal attualmente attiva

Naturalmente si potrebbe mettere un semplice one-liner sotto un tasto di scelta rapida (ammesso che abbiate xdotoolinstallato):

xdotool type "<command>"

Questo tuttavia digitare il comando alla cieca , in qualsiasi applicazione, e digitando il comando non è l'opzione più pulita.

Il piccolo script qui sotto quindi:

  • cerca se la finestra attiva è una gnome-terminalfinestra (dal suo pid)
  • in tal caso, incolla il comando nella gnome-terminalfinestra attiva , preme Return.
    In caso contrario, lo script non fa nulla , quindi non verrà incollato in altre applicazioni.

Poiché lo script accetta il comando target come argomento, è possibile inserire più comandi in più scorciatoie.

Il copione

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

Come usare

  1. La sceneggiatura ha bisogno xdotool

    sudo apt-get install xdotool

  2. Crea un dirctory ~/binse non esiste ancora, disconnetti / esegui o eseguisource ~/.profile

  3. Copia lo script sopra in un file vuoto, salvalo come gterm_keys(senza estensione) in ~/bin, rendilo eseguibile

Ora puoi eseguire qualsiasi comando, da un tasto di scelta rapida, nella gnome-terminalfinestra in primo piano aggiungendo il comando:

gterm_keys <command>

a un tasto di scelta rapida, come descritto in [1]


Ciao Jacob, grazie per la tua risposta. Penso, tuttavia, che le soluzioni bind (e bindkey) siano migliori in quanto sono integrate nella shell. In questo modo non scriverò accidentalmente "git status" in Libreoffice. ;)
mniess

@mniess Sono d'accordo che la risposta è buona, ma per la cronaca, se leggi attentamente la mia risposta, stampando su LibreOffice, ciò non può accadere . ma hai appena votato ?? È divertente.
Jacob Vlijm,

Lo so, lo script controlla l'app in esecuzione. Non ho votato a fondo. Ho scritto il commento per ringraziarti per aver dedicato del tempo a scrivere una risposta così dettagliata.
mniess,

@mniess Ah, scusa per il salto alle conclusioni! I due avvennero perfettamente sincronizzati. Sono contento che non sei stato tu. "Solo" un downvote non mi dispiace.
Jacob Vlijm,

2

Nel caso in cui venga usato zsh invece di bash, la seguente riga si ~/.zshrclega git statusa ALT+ ENTER.

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

Per ottenere ALT+ ENTERin Bash, uso questa riga:

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

Come si potrebbe fare per identificare i binding per altre chiavi?
Josh Habdas,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.