コマンドバッファスタック

概要

Zsh というシェルには、コマンドバッファスタック(コマンドラインスタック)と呼ばれる機能があります。何かコマンドを打っている途中で他の作業がしたくなった時、今まで打ったものを一時的に退避させておき、後で再利用する機能です。次のスクリプトは、PowerShell でコマンドバッファスタックを実装するものです。

ダウンロード

準備

このスクリプトを一度だけ実行すると、コマンドバッファスタックが使えるようになります。profile.ps1 に登録しておけば、その都度手動で実行する必要がなく、便利です。

用例

スタックにプッシュするには、行末に「#」をつけて TAB キーを押します。

PS> Get-ChildItem#

TAB キーを押して、行末の「#」が消えれば成功です。

PS> Get-ChildItem

スタックからポップするには、「#」のみの行で TAB キーを押します。ESC キーを押してコマンドラインをクリアし、「#」を入力してください。

PS> #

TAB キーを押すと、先ほどプッシュしたコマンドラインが現れます。

PS> Get-ChildItem

スタックには、メモリの許す限りプッシュすることができます。プッシュされたコマンドは、一番最後にプッシュされたものから順にポップされます。

実装

このスクリプトは、グローバル変数 $CommandBufferStack を定義します。スタック本体は、$CommandBufferStack.Stack で保持される System.Collections.Stack 型のオブジェクトです。

スタックへのアクセスは、タブ補完を使って行われます。つまり、Set-CommandBufferStack.ps1 は、Function:TabExpansion を書き換えます。

しかし、心配しないでください。このスクリプトの実行時に TabExpansion 関数が定義されていた場合、その関数は、 $CommandBufferStack.Original.Script に保存されており、行末に「#」が無かった場合に呼び出されますので、今まで通り使うことができます。

スクリプトで実装しているため、Zsh での実装に比べて多少キータイプ数は増えます。Zsh と同じものを作ろうと思えば、powershell.exe に代わるホストを作るのが最良でしょうし、恐らくそれほど難しくないでしょう。そうすれば、キーボードショートカットでプッシュできたり、コマンド実行後に自動ポップできたりと、利便性の高い仕様が実装できます。加えて powershell.exe 自身の問題、つまり日本語でカーソル位置がずれたり二重に表示されたりするバグもついでに修正できるし、いろんな便利な機能も追加できます。しかし、私は powershell.exe にこだわりたい気持ちがあります。高機能なシェルを使いたい人は PowerGUI を使うでしょうから。

追記

2008年4月21日追記:
このスクリプトは、コマンドラインに引用符が含まれている場合に期待した動作にならないことがわかりました。修正済みのものをコマンドバッファスタック(2)に掲載していますので、そちらをご覧ください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です