Jak utworzyć skrót klawiaturowy dla polecenia terminalu

16

Często pracuję z git i uwielbiam iTerm2 za możliwość ustawiania skrótów klawiaturowych dla poleceń. Na przykład ustawiłem CTRL+ ENTERna git status.

Czy jest to możliwe w przypadku gnome-terminal, czy możesz polecić inną opcję, aby to osiągnąć?

Mniess
źródło

Odpowiedzi:

17

Możesz użyć, bind -xaby powiązać polecenie ze skrótem w Bash. Na przykład, aby powiązać git statuspolecenie ze skrótem Crtl+ p, możesz użyć:

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

Umieść go w ~/.bashrcpliku, aby go zapamiętać. Ze strony podręcznika:

-x keyseq: shell-command

Powoduje, że polecenie powłoki powinno być wykonywane za każdym razem, gdy wprowadzany jest keyseq. Po wykonaniu polecenia powłoki powłoka ustawia zmienną READLINE_LINE na zawartość bufora linii Readline, a zmienną READLINE_POINT na bieżącą lokalizację punktu wstawiania. Jeśli wykonane polecenie zmieni wartość READLINE_LINE lub READLINE_POINT, te nowe wartości zostaną odzwierciedlone w stanie edycji.

Nykakin
źródło
Niesamowite. Używam zsh, ale ma to odpowiednik o nazwie bindkey . Aby osiągnąć to, co chcę, zrobiłem to: bindkey -s '^[^M' 'git status\n'co wiąże się z ALT + ENTER.
mniess
1
bind -x '"\C-k":firefox'Używam tego, ale nie działa
prawie
1
Działa to w powłoce, ale chcę cały czas.
wszystkie
1
Umieść go na końcu ~/.bashrcpliku. Jeśli nadal nie działa, sprawdź to
Nykakin
Więcej informacji na temat używania bindmożna znaleźć tutaj: stackoverflow.com/a/4201274/712334
Josh Habdas
2

1. Automatycznie otwórz nowe okno terminala, pokazujące wynik polecenia

Ponieważ po uruchomieniu polecenia należy pozostawić terminal otwarty, wprowadzanie:

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

pod kombinacją klawiszy skrótu wykona zadanie. Otworzy się nowe gnome-terminal okno i uruchomi w nim polecenie.

Dodaj go do skrótu

Wybierz: Ustawienia systemu> „Klawiatura”> „Skróty”> „Skróty niestandardowe”. Kliknij „+” i dodaj polecenie:

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

do Ctrl+Enter

Uwaga

Chociaż sugerowany skrót działa, możesz wybrać inną kombinację klawiszy niż Ctrl+ Enter, ponieważ przynajmniej koliduje on ze LibreOfficeskrótem, aby przejść do nowej strony.

Wyjaśnienie

Aby gnome-terminalotworzyć nowe okno z wiersza poleceń i uruchomić w nim polecenie, możesz użyć:

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

Jednak pomimo tego, że polecenie uruchomi się pomyślnie, okno terminala zostanie zamknięte bezpośrednio przed odczytaniem danych wyjściowych.

Sekcja:

read line

jest wtedy utrzymanie terminala otwartego (dopóki nie naciśniesz Enter) po uruchomieniu polecenia.

Inne polecenia

W ten sposób możesz uruchomić dowolne (złożone) polecenie w terminalu, nie zamykając go natychmiast:

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

wyświetli (jeśli wmctrljest zainstalowany):

wprowadź opis zdjęcia tutaj

Po naciśnięciu Enterterminal zostanie zamknięty.

2. Uruchomienie polecenia w aktualnie aktywnym oknie terminala gnome

Oczywiście, że mógłby postawić prosty-liner pod klawiszem skrótu (zakładając, że masz xdotoolzainstalowany):

xdotool type "<command>"

Spowodowałoby to jednak wpisanie polecenia na ślepo w dowolnej aplikacji, a wpisanie polecenia nie jest najczystszą opcją.

Mały skrypt poniżej dlatego:

  • sprawdza, czy aktywne okno jest gnome-terminaloknem (według jego pid)
  • jeśli tak, to wkleja polecenie w aktywnym gnome-terminaloknie, naciska Return.
    Jeśli nie, skrypt nic nie robi , więc nie wklei się do innych aplikacji.

Ponieważ skrypt przyjmuje komendę docelową jako argument, możesz umieścić wiele komend pod wieloma skrótami.

Scenariusz

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

Jak używać

  1. Skrypt potrzebuje xdotool

    sudo apt-get install xdotool

  2. Utwórz katalog, ~/binjeśli jeszcze nie istnieje, wyloguj się / zaloguj lub uruchomsource ~/.profile

  3. Skopiuj powyższy skrypt do pustego pliku, zapisz go jako gterm_keys(bez rozszerzenia) ~/bin, aby był wykonywalny

Teraz możesz uruchomić dowolne polecenie z klawisza skrótu w pierwszym gnome-terminaloknie, dodając polecenie:

gterm_keys <command>

do klawisza skrótu, jak opisano w [1]

Jacob Vlijm
źródło
Cześć Jacob, dzięki za odpowiedź. Myślę jednak, że rozwiązania bind (i bindkey) są lepsze, ponieważ są wbudowanymi powłokami. W ten sposób nie będę przypadkowo pisać „git status” w Libreoffice. ;)
mniess 24.03.16
@mniess Zgadzam się, że odpowiedź jest dobra, ale dla przypomnienia, jeśli uważnie przeczytasz moją odpowiedź, drukując w LibreOffice, to nie może się zdarzyć . ale czy właśnie przegłosowałeś? To przezabawne.
Jacob Vlijm
Wiem, skrypt sprawdza działającą aplikację. Nie przegłosowałem. Napisałem komentarz, aby podziękować za poświęcenie czasu na napisanie tak szczegółowej odpowiedzi.
mniess
@mniess Ah, przepraszam za przeskakiwanie do wniosków! Obie zdarzały się idealnie zsynchronizowane. Cieszę się, że to nie byłeś ty. „Tylko” głosowanie nie mam nic przeciwko.
Jacob Vlijm
2

W przypadku użycia zsh zamiast bash, następujący wiersz w ~/.zshrcwiąże się git statusz ALT+ ENTER.

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

Aby uzyskać ALT+ ENTERw Bash, używam tej linii:

bind -x '"\e\C-m":git status'
Mniess
źródło
Jak przejść do identyfikacji powiązań dla innych kluczy?
Josh Habdas
1
@JoshHabdas spójrz tutaj unix.stackexchange.com/questions/76566/…
mniess