Як створити комбінацію клавіш для команди терміналу


16

Я часто працюю з git і люблю iTerm2 для можливості встановлення комбінацій клавіш для команд. Наприклад, я встановив CTRL+ ENTERдо git status.

Чи можливо це за допомогою gnome-terminal або ви можете порекомендувати інший варіант для досягнення цього?

Відповіді:


17

Ви можете використовувати bind -xприв'язку команди до ярлика в Bash. Наприклад, для прив’язки git statusкоманди до ярлика Crtl+ pви можете використовувати:

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

Покладіть його у ~/.bashrcфайл, щоб запам'ятати його. З чоловічої сторінки:

-x keyseq: оболонка-команда

Причини командної оболонки виконувати щоразу, коли вводиться keyseq. Коли команда shell-команда виконується, оболонка встановлює змінну READLINE_LINE на вміст буфера рядків Readline, а змінну READLINE_POINT - на поточне розташування точки вставки. Якщо виконана команда змінить значення READLINE_LINE або READLINE_POINT, ці нові значення будуть відображені у стані редагування.


Дивовижно. Я використовую zsh, але він має еквівалент bindkey . Отже, щоб досягти того, що я хочу, я зробив це: bindkey -s '^[^M' 'git status\n'що пов'язує ALT + ENTER.
mniess

1
bind -x '"\C-k":firefox'Я використовую це, але не працює
alhelal

1
Це працює в оболонці, але я хочу весь час.
alhelal

1
Помістіть його в кінці ~/.bashrcфайлу. Якщо це все ще не працює, перевірте це
Нікакін

Більш детальну інформацію про використання bindможна знайти тут: stackoverflow.com/a/4201274/712334
Джош Habdas

2

1. Автоматично відкрийте нове вікно терміналу, показуючи вихід вашої команди

Оскільки вам потрібно тримати термінал відкритим після запуску команди, поставивши:

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

під комбінацією клавіш швидкого доступу, зробить цю роботу. Це відкриє нове gnome-terminal вікно і запустить команду всередині нього.

Додайте його до ярлика

Виберіть: Налаштування системи> "Клавіатура"> "Ярлики"> "Спеціальні ярлики". Клацніть "+" і додайте команду:

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

до Ctrl+Enter

Примітка

Незважаючи на те, що запропонований ярлик працює, ви можете вибрати іншу комбінацію клавіш, а потім Ctrl+ Enter, оскільки вона принаймні стикається з LibreOfficeярликом, щоб перейти на нову сторінку.

Пояснення

Щоб відкрити нове gnome-terminalвікно з командного рядка та виконати команду в ньому, ви можете використовувати:

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

Однак, хоча команда буде запущена успішно, вікно терміналу закриється негайно, перш ніж ви зможете прочитати вихід.

Розділ:

read line

значить, тримати термінал відкритим (поки ви не натиснете Enter) після запуску команди.

Інші команди

Таким чином, ви можете запустити будь-яку (складну) команду в терміналі, не закриваючи її відразу:

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

виведе (якщо wmctrlвстановлено):

введіть тут опис зображення

Після натискання Enterтермінал закриється.

2. Запуск команди в активному вікні терміналу gnome

Звичайно, ви можете розмістити простий однокласник під ярликом (якщо ви xdotoolвстановили):

xdotool type "<command>"

Однак це може вводити команду наосліп у будь-якій програмі, а введення команди - не найпростіший варіант.

Малий сценарій нижче:

  • виглядає, якщо активне вікно - це gnome-terminalвікно (за його pid)
  • якщо це так, він вставляє команду в активне gnome-terminalвікно, натискає Return.
    Якщо ні, то сценарій нічого не робить , тому він не вставитиметься в інші програми.

Оскільки сценарій приймає цільову команду як аргумент, ви можете помістити кілька команд під декілька ярликів.

Сценарій

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

Як користуватись

  1. Сценарій потребує xdotool

    sudo apt-get install xdotool

  2. Створіть керівництво, ~/binякщо він ще не існує, або вийдіть із системи, або запустити йогоsource ~/.profile

  3. Скопіюйте вище скрипт у порожній файл, збережіть його як gterm_keys(без розширення) ~/bin, зробіть його виконуваним

Тепер ви можете запустити будь-яку команду із клавіші швидкого доступу в передньому gnome-terminalвікні, додавши команду:

gterm_keys <command>

до клавіші швидкого доступу, як описано в [1]


Привіт Якобе, дякую за вашу відповідь. Я думаю, що рішення, пов'язані (і bindkey), краще, оскільки вони вбудовані в оболонки. Таким чином я випадково не напишу "git status" у Libreoffice. ;)
mniess

@mniess Я погоджуюся, що відповідь хороший, але для запису, якщо ви уважно прочитаєте мою відповідь, друкуючи в LibreOffice, цього не може статися . але ти щойно знизив ?? Це весело.
Яків Влійм

Я знаю, скрипт перевіряє працюючий додаток. Я не став голосом. Я написав коментар, щоб подякувати за те, що ви знайшли час, щоб написати таку детальну відповідь.
месс

@mniess Ах, вибачте, що прискочив до висновків! Двоє сталися ідеально синхронізованими. Я радий, що це не ти. "Просто" потворний голос, який я не проти.
Яків Влійм

2

У випадку, якщо zsh використовується замість bash, наступний рядок у ~/.zshrcприв'язці git statusдо ALT+ ENTER.

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

Щоб отримати ALT+ ENTERу Bash, я використовую цей рядок:

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

Як можна було б ідентифікувати прив’язки для інших ключів?
Джош Хабдас

1
@JoshHabdas дивіться тут unix.stackexchange.com/questions/76566/…
mniess
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.