Как создать сочетание клавиш для команды терминала

16

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

Возможно ли это с помощью gnome-терминала или вы можете порекомендовать другой вариант для достижения этой цели?

mniess
источник

Ответы:

17

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

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

Поместите это в ~/.bashrcфайл, чтобы запомнить это. С man-страницы:

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

Заставить команду оболочки выполняться всякий раз, когда вводится keyseq. Когда команда shell выполняется, оболочка устанавливает переменную READLINE_LINE на содержимое буфера строки Readline, а переменную READLINE_POINT - текущее местоположение точки вставки. Если выполненная команда изменит значение READLINE_LINE или READLINE_POINT, эти новые значения будут отражены в состоянии редактирования.

Nykakin
источник
Потрясающие. Я использую zsh, но у него есть эквивалент bindkey . Таким образом, чтобы добиться того, чего я хочу, я сделал это: bindkey -s '^[^M' 'git status\n'что связывает с ALT + ENTER.
mniess
1
bind -x '"\C-k":firefox'Я использую это, но не работает
alhelal
1
Это работает в оболочке, но я хочу все время.
Алхелал
Поместите это в конец ~/.bashrcфайла. Если это все еще не работает, проверьте это
Nykakin
Более подробную информацию об использовании bindможно найти здесь: stackoverflow.com/a/4201274/712334
Джош Хабдас
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 установить xdotool

  2. Создайте каталог, ~/binесли он еще не существует, выйдите из системы, войдите или запуститеsource ~/.profile

  3. Скопируйте приведенный выше скрипт в пустой файл, сохраните его как gterm_keys(без расширения) ~/binи сделайте его исполняемым.

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

gterm_keys <command>

к сочетанию клавиш, как описано в [1]

Якоб Влейм
источник
Привет Джейкоб, спасибо за твой ответ. Я думаю, что решения bind (и bindkey) лучше, так как они встроены в оболочку. Таким образом, я не буду случайно писать «git status» в Libreoffice. ;)
mniess
@mniess Я согласен, что ответ хороший, но для протокола, если вы внимательно прочитаете мой ответ, печатая в LibreOffice, этого не произойдет . но ты только понизил ?? Это весело.
Джейкоб Влейм
Я знаю, что скрипт проверяет работающее приложение. Я не понизил. Я написал комментарий, чтобы поблагодарить вас за то, что вы нашли время написать такой подробный ответ.
mniess
@mniess Ах, извините за поспешные выводы! Два произошло идеально синхронизировано. Я рад, что это был не ты. «Просто», я не против.
Джейкоб Влейм
2

Если вместо bash используется zsh, следующая строка ~/.zshrcсвязывается git statusс ALT+ ENTER.

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

Чтобы получить ALT+ ENTERв Bash, я использую эту строку:

bind -x '"\e\C-m":git status'
mniess
источник
Как можно определить привязки для других ключей?
Джош Хабдас
1
@JoshHabdas смотрите здесь unix.stackexchange.com/questions/76566/…
mniess