Hatena::ブログ(Diary)

naoyaのはてなダイアリー

December 23, 2005

GNU screen いろいろまとめ。

先日人力検索で GNU screen の設定TIPSについて質問してみたところ、かなーり役立つ設定とかをたくさん教えてもらうことができました。みなさん感謝。

そんで、教えていただいた通りにカスタマイズした結果、こんな感じのスクリーンショットが撮れました。MacOSX のターミナルです。

myscreen.png

おかげさまでかなり便利になって作業効率が上がったと思います。いろいろ教えてもらったお礼とまではいきませんが、やった設定とかをはまりどころとかも交えて紹介してみます。名付けてリバース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!

*1:MacOSX でコピペしたせいかバックスラッシュが ? になってしまってます。読み替えてくんろ。

ogijunogijun 2005/12/24 03:19 Emacsで制御文字は C-q のあとにそのcodeを入力です。
最近Vim族が勢力拡大してるので抵抗してください!

a_ia_i 2005/12/26 05:30 履歴マニアのURLはhttp://namazu.org/?satoru/unimag/3/
ではなく、http://namazu.org/~satoru/unimag/3/
ではないかと。

tf0054tf0054 2006/10/24 02:27 ”screen -U -s /bin/tcsh -m”で起動して、”.tcshrc”に”set savehist = (1000 merge)”とすれば履歴共有はtcshでもできそうです。別にtcshにそこまで拘る理由もないのですけどご参考までに。

den8den8 2009/06/30 00:04 ものすごく今さらで、もはや見ておられないかも知れないと思うのですが、
> 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
のところでエラーが出たため、Manage of Screenで確認したところ、
> bind -c REGION ^ resize
ここのサーカムフレックスは、バックスラッシュでエスケープする必要があるため、
> bind -c REGION \^ resize
となるようです。正常に動いてはいたのですが、起動時にずっとエラーが出ていたため気になっていたいたところ、最近発見しました。

naoyanaoya 2009/06/30 11:35 ああ、ほんとですね、すみません!

トラックバック - http://d.hatena.ne.jp/naoya/20051223/1135351050