GNU screen いろいろまとめ。
先日人力検索で GNU screen の設定TIPSについて質問してみたところ、かなーり役立つ設定とかをたくさん教えてもらうことができました。みなさん感謝。
そんで、教えていただいた通りにカスタマイズした結果、こんな感じのスクリーンショットが撮れました。MacOSX のターミナルです。
おかげさまでかなり便利になって作業効率が上がったと思います。いろいろ教えてもらったお礼とまではいきませんが、やった設定とかをはまりどころとかも交えて紹介してみます。名付けてリバースNDOメソッド。ちなみに、知ってる人にはごく当然のことが当たり前のように書いてるので、あんまり役に立たないかもしれません。
hardstatus alwayslastline で最終行にウィンドウ一覧を表示
これは今回の質問とは直接関係ないのですが、やるとやらないとでかなり使い勝手が違うので。
hardstatus alwayslastline "%w"
とかすると、スクリーンショットにある通り最終行にそのとき開いてるウィンドウ一覧が出ます。実はこんな設定があるというのにしばらく気づかないでて、知ったときはショックでした。
設定行の引数には表示フォーマットを指定するわけですが、ここを色々工夫するとちょっと見た目をよくすることができます。フォーマット指示詞がかなり謎で理解するのに時間がかかりそうだったので、typester さんの設定をそのまま使わせてもらうことにしました。拝借感謝。時間が出たり、アクティブなウィンドウが青く表示されたりとか。typester さんはバックグラウンドでスクリプトを実行して新着メールとか、未読フィードの件数とかを表示してるみたいですね、いかす。
hardstatus alwayslastline "[%02c] %`%-w%{=b bw}%n %t%{-}%+w"
zsh と併用する
これも質問の回答とは関係ないのですが、screen を使うときは zsh を使うと良い。なんでかというと、zsh だと複数ウィンドウにまたがってもコマンド履歴が共有できるので。僕はコマンドを打つときはまず C-r でインクリメンタル検索で探すのが日常でして、この機能を相当ヘビーに使ってます。でも、screen を使ってウィンドウを複数に分けるようになると履歴がばらばらになって困るのですが、zsh ならその辺悩まなくて良いという点があります。
ステータスラインに各ウィンドウで打ったコマンドを表示
質問の回答で最初に教えてもらったのがこの設定。zsh が必要です。スクリーンショットでは各ウィンドウの名前が mysql とか server.pl とかになってますが、これは自分で付けた名前ではなくて、そのウィンドウで最後に打ったコマンド名が表示されてます。よく perldoc 開きっぱなしとか mysql クライアント立ち上げっぱなしとか tail -f しっぱなしとかにして他のウィンドウで作業してはそこに戻って確認みたいなことをしますが、そういうときにウィンドウ名が "zsh" とかだと「あれ、どれだっけ」みたいな話になるんですが、この方法ですべて解決!
これは id:secondlife 氏に教えてもらいました。感謝。
設定方法とかは ari's diary の 2002年6月14日の記事にあります。
ちなみにこの記事の中で、zshrc に記述するスクリプトが出てきますが、最初これをまんまコピーして動かなくて一瞬はまりました。
^[k
とかなってるところの ^[ が、制御文字でして、そのままペーストだと文字列として認識されちゃうという。vi とかだと Insert mode のときに Ctrl + v して Escape を押すと入力できます。Emacs はどうだったかな。Emacs で rc とかいじらないので知らない。
ウィンドウ分割を Emacs ライクなキーバインドで操作できるようにする
id:stealthinu さんに教えてもらった技。screen にはウィンドウ分割の機能があります。上下にウィンドウを分割してそれぞれに異なるウィンドウを表示させたりすることができて、Emacs を使ってる人には特に涙がちょちょぎれるような機能です。その反面、Emacs 使ってる人にとってはキーバインドは鬼門で、カーソル移動に思わず C-x o とか間違って打ってしまう癖があったりします。
じゃあ、screen 側を Emacs のようなキーバインドにしてしまえ! というのがこの設定です。
bind 2 split bind o focus bind 1 only bind 0 remove
というのを screenrc に書くと。
ただ、このキーバインド上書きだと、デフォルトのウィンドウ切り替えコマンドを上書いてしまうという罠があるので、
bind -c REGION 2 split bind -c REGION 1 only bind -c REGION 0 remove bind -c REGION o focus bind -c REGION \^ resize bind x command -c REGION
としてます。C-t x 2 とかキーバインドになっちゃいますが、まあ Emacs とかなり似てるのでこれで十分手になじみます。後者の話は http://subtech.g.hatena.ne.jp/secondlife/20051216/1134741917 からいただきました。
放置してるとスターウォーズの名台詞が!
idle 3600
とかすると、3600 秒操作がないと screen blanker (スクリーンセーバーみたいなもん) が起動すると id:shigeno さんから教わりました。また blankerprg で、screen blanker 起動時に好みのプログラムを設定できるということで、fortune をセットする例も教えていただきました。
fortune というのは UNIX におけるジョークプログラムで、fortune コマンドを実行する度にコンピュータサイエンスに関わるジョークを表示してくれたりする代物です。大学の研究室のマシンは、ログインすると格言がいつも表示されてたんだけど、これは fortune を実行して実現されてました。
この fortune には、表示するメッセージのデータに好きな物を設定することができます。名台詞といえばやっぱりスターウォーズだよってことで http://sourceforge.net/projects/elkware/ から fortune 用のスターウォーズ名台詞データを貰ってきて、これを使うように設定してみました。MacOSX 用の fortune コマンドは Google で調べたところ http://dsandler.org/soft/macosx/message.php が見つかりまして、ここから FreeBSD fortune のパッケージをいただいてインストールしました。
screenrc には
idle 1200 blankerprg /usr/bin/fortune starwars
と書いてます。
しばらく操作がないと画面がブランクになって
Ben (Obi-Wan) Kenobi: Use the Force, Luke!
とか、
Darth Vader: There is no escape. Don't make me destroy you. pauses Luke, you do not yet realize your importance. You have only begun to discover your power. Join me, and I will complete your training. With our combined strength, we can end this destructive conflict and bring order to the galaxy. Luke Skywalker: I'll never join you! Darth Vader: If you only knew the *power* of the dark side. Obi-wan never told you what happened to your father. Luke Skywalker: He told me enough! He told me *you* killed him. Darth Vader: No. *I* am your father.
とか表示されます。しびれる!
その他
ここで紹介した以外にも
- ウィンドウ毎にログを取る方法 (id:babie さん)
- ウィンドウごとに文字エンコードを変える方法 (id:typester さん)
- screen のキーバインドで任意のコマンドを実行する方法 (id:teny さん)
- プロジェクト毎に screenrc を用意する方法 (id:jestersera さん)
- 履歴バッファの行数を増やす設定 (id:rehash さん)
- screen で CGI をデバッグする試み (id:teny さん)
などを回答にいただきました。全部紹介するつもりだったけど書いてたら疲れてしまった、ごめんなさいw
さいごにおまけ
これは id:hideoki から教えてもらったもの。zshrc とかに
function ssh_screen(){ eval server=?${$#} screen -t $server ssh "$@" } if [ x$TERM = xscreen ]; then alias ssh=ssh_screen fi
と書いておくと*1、ssh したときに新しいウィンドウを開いてそこで ssh して、ウィンドウ名をログイン先のホスト名に自動的に名付けてくれます。便利。
思い出
思い返せば学生のころ、スーパーハカーなとある電気電子学科の教授のモニタを後ろから見てたらなんかウィンドウをキーボードで切り替えまくってすごい操作してて、あれどうやってんだろうなーって思ったことがありましたが、screen 使ってたんだなあってすごい後になって知ったという、そんなことを思い出しました。その教授は Perl と Emacs のヘビーユーザーで、あと僕の研究室の教授もそんな感じで、直接教えてもらったことはなかったけどそういう人のモニタとか打鍵を横で見ては驚きつつ真似してたというのがあります。古の道具にはフォースが宿ってる。でもフォースは理解するんではなく感じるものなんですよ! May the force be with you, always!