web-dev-qa-db-ja.com

端末コマンドのキーボードショートカットを作成する方法

私は頻繁にgitを使用し、コマンドのキーボードショートカットを設定できるiTerm2が大好きでした。たとえば、私は設定します CTRL+ENTER git statusに。

これはgnome-terminalで可能ですか、またはこれを達成するために別のオプションを推奨できますか?

11
mniess

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の値を変更すると、それらの新しい値は編集状態に反映されます。

15
Nykakin

1.新しいターミナルウィンドウを自動的に開き、コマンドの出力を表示します

コマンドを実行した後、ターミナルを開いたままにする必要があるため、次のように入力します。

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

ショートカットキーの組み合わせの下で、仕事をします。 newgnome-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 image description here

を押した後 Enter ターミナルが閉じます。

2.現在アクティブなgnome-terminalウィンドウでコマンドを実行する

もちろん、ショートカットキーの下にシンプルなワンライナーを配置できました(xdotoolがインストールされていると仮定):

xdotool type "<command>"

ただし、これはコマンドblindlyanyアプリケーション、およびtypingを入力しますこのコマンドは最もクリーンなオプションではありません。

したがって、以下の小さなスクリプト:

  • アクティブなウィンドウがgnome-terminalウィンドウであるかどうかを確認します(pidによる)
  • その場合、アクティブなgnome-terminalウィンドウにコマンドをpastes、押します Return
    そうでない場合、スクリプトはnothingを行うため、他のアプリケーションに貼り付けられません。

スクリプトはターゲットコマンドを引数として受け取るため、複数のショートカットの下に複数のコマンドを配置できます。

スクリプト

#!/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ウィンドウでanyコマンドを実行できます。

gterm_keys <command>

[1]で説明されているショートカットキー

2
Jacob Vlijm

Bashの代わりにzshが使用される場合、~/.zshrcの次の行はgit statusをバインドします ALT+ENTER

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

取得するため ALT+ENTER Bashでは、次の行を使用します。

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