2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

screenで、別のウィンドウにコマンドを送る

Last updated at Posted at 2014-09-18

背景

もともとの背景は、諸々の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を評価した標準出力を送る、もよさそうかも、と思ったり。
2
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?