December 23, 2005
■ 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 の履歴の話とかは、高林さんの記事履歴マニアに詳しく書いてます。
ステータスラインに各ウィンドウで打ったコマンドを表示
質問の回答で最初に教えてもらったのがこの設定。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!
- screen膓
- screen膓
- http://d.hatena.ne.jp/binzo/20051223
- http://d.hatena.ne.jp/taizooo/20051224
- 開発マシンの場所
- http://d.hatena.ne.jp/KotoriKoToriko/20051226
- screen設定見直し
- Good-bye bash! Hello zsh with screen! See you again, emacs. Nic...
- http://d.hatena.ne.jp/moto0215/20051227
- http://d.hatena.ne.jp/gunshot/20060104
- http://d.hatena.ne.jp/ojos/20060111
- http://d.hatena.ne.jp/wanpark/20060118
- http://d.hatena.ne.jp/dio28/20060119
- GNU screenでUTF-8
- http://d.hatena.ne.jp/suginoy/20051224
- http://d.hatena.ne.jp/shuichi_h/20060616
- http://d.hatena.ne.jp/nora-programmer/20060717
- http://d.hatena.ne.jp/tily/20060921
- http://d.hatena.ne.jp/jpmasahiro/20060925
- http://d.hatena.ne.jp/jishiha/20061003
- http://d.hatena.ne.jp/webdoraku/20061006
- http://d.hatena.ne.jp/tily/20061010
- http://d.hatena.ne.jp/odawara/20061227
- http://d.hatena.ne.jp/kanbayashi/20070119
- http://d.hatena.ne.jp/t-imaizumi/20070206
- http://d.hatena.ne.jp/kinneko/20070206
- http://d.hatena.ne.jp/seiunsky/20070211
- [Linux] GNU Screenを使ってみた
- GNU screen メモ
- http://d.hatena.ne.jp/rsyudo/20070405
- http://d.hatena.ne.jp/hiratara/20070416
- http://d.hatena.ne.jp/ktat/20070428
- [Linux]screen使ってみる
- screen用.zshrcメモ
- http://d.hatena.ne.jp/clayfish/20070530
- http://d.hatena.ne.jp/syou6162/20070629
- http://d.hatena.ne.jp/masahi6/20070809
- http://d.hatena.ne.jp/m_hayashi/20070824
- masutaroの日記 - screen のステータスラインに実行したコマンド名...
- GNU Screenの文字化け@FreeBSD 6.x(UTF-8)
- aki03の日記 - zsh+screenの設定メモ
- [Linux][zsh]zshのまとめ
- memo_ruby - macbookのzsh+screen環境を整えてみた
- 半無限長キープ - screenで覚えたことメモ
- 半無限長キープ - その日の100行目から200行目まで読む:
- Logical and Creative - screen
- Logical and Creative - .emacs .screenrc .vimrc .zshrc作成エント...
- ゆるいネクタイ嫌いじゃない - GNU screen 自分用まとめ
- hirono_hideki 日暮途遠 - screen
- TODO: Blogを書く。 - 備忘録 screenの設定 (気分更新)
- rderaログ - screenでfortuneプログラムを実行させたいけど、うまく...
- チキン煮込みチーズミックス4辛 - CUIの開発環境
- 1917 http://ja.wikipedia.org/wiki/GNU_Screen
- 1563 http://iandeth.dyndns.org/mt/ian/archives/000646.html
- 748 http://www.itmedia.co.jp/enterprise/articles/0703/07/news017_2.html
- 714 http://b.hatena.ne.jp/
- 593 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja-JP:official_s&q=JavaScript+iterator&btnG=Google+検索&lr=
- 530 http://feed.designlinkdatabase.net/feed/outsite_2551.aspx
- 527 http://iandeth.dyndns.org/mt/ian/archives/000570.html
- 513 http://www.google.co.jp/search?q=gnu+screen&lr=lang_ja&ie=utf-8&oe=utf-8&rls=org.mozilla:ja:official&client=firefox
- 314 http://b.hatena.ne.jp/hotentry
- 308 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=DVXA,DVXA:2004-01,DVXA:ja&q=ROGUE+GALAXY



