bash/zshでキーバインドに任意のコマンドを割り当てて実行させる
Pocket

最近、zshやbashの設定を弄ってカスタムするのにちょっと凝ってるのだけど、そうやっていじってるとキーバインドでも特定のコマンドを実行させたりしたくなってくる。
bashやzshではrcファイルにbindの設定を書けばキーバインドに任意のコマンド実行を割り当てたりできるので、ちょっと忘れないように備忘で残しておく。

bashの場合

bashで、キーバインドから任意のコマンドを実行させる場合、単純に実行させるなら以下のように定義する。
なお、このときaliasは読み込まないので注意。

# 例) Ctrl + Xで「ls -la」を実行させる場合
bind -x ' "C-X": "ls -la" '

 

ただ実行するだけではなく、プロンプトに文字列を入力させてそれを実行させるようにする場合、以下のようにする。
※ Ctrl + A、Ctrl + Kのキーバインドを変えてないことが前提(Ctrl + Uでもいいのだけど、変えてる場合が多いと思うので)。

# 例) Ctrl + L でclearを実行する
# "Ctrl + A(行頭に移動)"
# "Ctrl + K(カーソル位置から後ろをすべて削除)"
# "1(定義したclearの実行)"
bind '"1": "clear\n"'
bind '"\C-l": "\C-a \C-k 1"'
Sponsored Links

zshの場合

zshの場合、キーバインドからコマンドを直接指定することはできないため、事前にfunctionを設定しておき、それをzleでロードさせて利用する。

# 例) Ctrl + Uで「cd ../」を実行させる場合
# 実行させるfunction
function __zsh_up_cd() {
    # 入力されている文字列を変数$BUFに代入
    local BUF=${BUFFER}

    # 入力されている文字列を削除
    zle kill-whole-line

    # cd ../を実行
    \cd ..

    # 1行入力させる
    zle .accept-line

    # 入力されていた文字列を再度入力する
    if [ ! ${#BUF} -eq 0 ];then
        zle -U ${BUF}
    fi
}

# functionをキーバインドで利用できるよう読み込ませる
zle -N __zsh_up_cd

# キーバインドの設定
bindkey '^U' __zsh_up_cd

 

関数から呼び出して問題がある場合、「zle -U hogehoge\n」を利用すればコンソールに文字列を直接打ち込ませることができるので、それを利用する。
なお、入力中の文字列があった場合は邪魔になるので、とりあえず全削除になる(保持させようともしたけど、どうも混ざって出力されてしまうようだ)。

# clearを実行させるためのfunction
function __zsh_clear() {
    # 入力されている文字列を削除
    zle kill-whole-line

    # clearをターミナルに文字列として流し込む
    zle -U clear$'\n'
}

zle -N __zsh_clear
bindkey '^L' __zsh_clear

 

キーバインドの設定、今までは自身の環境でしか使えないと変に癖が付きそうで敬遠してたのだけど、ssh接続先に影響を与えずに利用できることがわかって問題が解決したので、今後は色々と設定していこうと思う。

Pocket

Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*