これは zsh Advent Calendar 2014 の 6 日目の記事です。
zsh で Enter を連打したときに順番にコマンドを実行するというのをやってみました。
参考にしたのは Zsh - Enter で ls と git status を表示すると便利 - Qiita です。
概要と実装
.zshrc
に以下のような感じで追加して空 Enter を押すと 最初は ls
で次に svn status
または git status -sb
を実行するようになります。 連打したときに終わりがわかりやすいように 3 回目は何も実行しないようにしています。
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
のように別のキーに割り当てると良いでしょう。
Disqus Comments