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

bashの場合

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

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

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

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

ちなみに、Alt キーを利用したキーバインドを登録する場合、「\e<キー名>(Alt + Cなら\ec)」といった形式で記述する。

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

ちなみに、zshでAltキーのキーバインドを登録する場合、「^[<キー名>(Alt + Cの場合は^C)」で登録する。