zshのコマンドラインスタック(buffer stack)を表示させながら次のコマンドを入力する方法

zshにはbuffer stackという仕組みがあって、これを使用すると入力途中のコマンドを一時的に保留しておいて、別のコマンドを実行した後、再度続きから入力することができる。

以下buffer stackの使用例

# 以下は自分で入力していて、実行前にdfで確認したくなったとする
$ tar xvzf hoge.tar.gz
# ESC-q を押下
# するとbufferが空になる
$ 
# 改めてコマンドを入力
$ df -h
...
# コマンド実行後、stackに退避していた入力途中のコマンドが自動的に入力された状態になる
$ tar xvzf hoge.tar.gz

zshのブログ記事などを見たりするとこの機能が便利便利言ってる人がいるけど、私は結局使ってない。理由はいろいろあると思うけど、その理由の一つとして

  • 退避したスタックが見えない

というのがあると思ってる。この理由は結構大きいと思っていて、例えば、ある仕事をしていてPCと向き合っていたとする。そんなとき同僚に話しかけられてちょっと雑談したあと、再度PCの画面を見る。すると、いままで自分がしていた仕事がふっと頭から抜け落ちることがある。そんな自分にはbuffer stackが表示されない時点でなぜ今新しいコマンドを入力しようとしているか振り替えることができないから、あまり便利に思えなかった。

改めて調べてみると、保留しておいたコマンドを簡単に表示させておくことができたので、以下にその設定を載せる。

show_buffer_stack() {
  POSTDISPLAY="
stack: $LBUFFER"
  zle push-line
}
zle -N show_buffer_stack
bindkey "^[q" show_buffer_stack

内容は単純で、ESC-qを押す前に表示されていたコマンドをPOSTDISPLAYで表示させているだけ。課題として、再帰的なpush-lineには対応していないので、そのあたりを便利に感じている人にはこれでは不十分であること。ただ、これで不満に思っていたことが一つ解消されたので、これから活用していく良い切っ掛けになると思う。