背景
もともとの背景は、諸々のShell的なコマンド(pythonだったりpsqlだったりgnuplotだったりmongoだったり)に、zshの補完やヒストリの機能を持ち込めればいいのになと思った所からです。
zshで(補完、ヒストリやpercolなんかを駆使して)コマンド文字列を作り
そいつを、別のウィンドウ上で実行したい、ということです。
別のウィンドウでは、たとえばpythonが動いていたり、別のサーバだったりするかも知れません。
方法
先ず、screen -X split
などして、screenを分割しておきます。
片方は、コマンドラインを作る用の端末、もう片方では、目的のコマンドを起動しておく。
.zshrcに追加
send_command_next_windos() {
command=$BUFFER:gs/\"/\\\\\"/
screen -X eval "focus" "stuff \"$command^M\"" "focus"
print -s "$BUFFER"
}
zle -N send_command_next_windos
bindkey '^X^M' send_command_next_windos
screenのeval
コマンドは、引数をscreenのコマンドとして順番に実行します。
focus
で、分割されたウィンドウの切り替えて、stuff
は、引数を標準入力に入力します。
^Mは改行をメタ文字で入れてください。
終わったらまたfocus
で戻ってきます。
print -s
は、ヒストリに入れるみたいです。
"をエスケープするようにしたいんですけど、なんか良いやりかたは無いでしょうか?
いろいろと肉付けはできると思いますが基本的な動きとしては、こんな感じです。
- 実行したら、コマンドを消すようにしても良いかも。このままでも、いろいろ編集できて意外と便利感。
- fcコマンドを上手く使って、historyを別のものにする、とか
- 対象コマンドに応じてモードを切り替えて、引数の補完とかまでできたらいいなぁ、とか。
- 対象コマンド側で補完機能を持っているような場合(psqlなど)それが死んじゃうなぁ、とか。
- $BUFFERを送る、もいいですし、$BUFFERを評価した標準出力を送る、もよさそうかも、と思ったり。