@znz blog

ZnZ の memo のようなもの

zshでEnterを連打したときにいろいろ実行する

| Comments

これは zsh Advent Calendar 2014 の 6 日目の記事です。

zsh で Enter を連打したときに順番にコマンドを実行するというのをやってみました。

参考にしたのは Zsh - Enter で ls と git status を表示すると便利 - Qiita です。

概要と実装

.zshrc に以下のような感じで追加して空 Enter を押すと 最初は ls で次に svn status または git status -sb を実行するようになります。 連打したときに終わりがわかりやすいように 3 回目は何も実行しないようにしています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function my_enter {
    if [[ -n "$BUFFER" ]]; then
        builtin zle .accept-line
        return 0
    fi
    if [ "$WIDGET" != "$LASTWIDGET" ]; then
        MY_ENTER_COUNT=0
    fi
    case $[MY_ENTER_COUNT++] in
        0)
            BUFFER=" ls"
            ;;
        1)
            if [[ -d .svn ]]; then
                BUFFER=" svn status"
            elif git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
                BUFFER=" git status -sb"
            fi
            ;;
        *)
            unset MY_ENTER_COUNT
            ;;
    esac
    builtin zle .accept-line
}
zle -N my_enter
bindkey '^m' my_enter

関数解説

最初の if 文で $BUFFER をチェックして入力があるときは zle .accept-line で普通に実行するようにしています。

次の if 文で $LASTWIDGET$WIDGET が違うときに MY_ENTER_COUNT というシェル変数を初期化しています。 この変数で何回目の空 Enter かを覚えておくようにしています。

そして MY_ENTER_COUNT で何回目かに応じて実行するコマンドを変えています。 頭にスペースを入れているのは setopt histignorespace と組み合わせることを想定しています。

最後に zle .accept-line で実行しています。

まとめ

空 Enter 連打でいろいろなコマンドを順番に実行できるようにしてみました。 参考にして好きなコマンドを実行できるようにすると良いのではないでしょうか。

参考元の Qiita の記事 にちょっと書いているように Enter がやり過ぎと思ったら bindkey '^J' my_enter のように別のキーに割り当てると良いでしょう。

Comments