久々に GNU Screen について書きます。
先年 Screen 界に颯爽と現れ、その 変態的なまでに 充実した .screenrc
により他人の .screenrc をコピペしてきて済ませちゃう(引用)各人の蒙を啓き、そのまま .screenrc
の新世界の扉まで開いちゃった暇人は多大な時間を浪費して、たかが画面最下部の一行を自分以外の誰も気付かないようなギークな装飾で彩り、悦に浸り、しばらくすると飽きて馬鹿馬鹿しくなり、喉元過ぎて熱さを忘れるとまたその伏魔殿に挑むという、何とも業の深いサイクルに僕が陥るきっかけとなったエントリがこちらです。
卜部昌平のあまりreblogしないtumblr – 俺の .screenrc が火を吹くぜ
http://shyouhei.tumblr.com/post/313410522/screenrc
先日、ありがたくもこのご本人から Screen についての講義を拝聴する僥倖に恵まれ、久々にサイクルが一巡し、また .screenrc
にハマってしまいました。
このブログのエントリ を書いたときからはだいぶ状況も様変わりしていますので、改めて現況をまとめてみたいと思います。
インストール
Linux の場合
Linux においては余り状況は変わっていません。相変わらず OS 標準の Screen は旧版の v4.0.3 であることが多いですので、最新のソースをレポジトリから取得してビルドするのが良いでしょう。
最新版 GNU Screen のインストール on CentOS 5.4 – blog.delphinus.dev
https://blog.delphinus.dev/2010/04/gnu-screen-on-centos-54.html
Mac の場合
Mac においてはもう一つ問題があります。公式の最新ソースにおいても以下の問題が修正されていないのでパッチが別に必要です。
screen が結合文字の後に存在しないはずの ÿ を出力しちゃうバグを直した – ドレッシングのような
http://d.hatena.ne.jp/mrkn/20101014/fix_screen_utf8_nfd_bug
$ git clone git://git.savannah.gnu.org/screen.git $ curl -LO https://raw.github.com/gist/626040/be6a04f0e64c56185ba5850415ac59dad4cd62a0/screen-utf8-nfd.patch $ cd screen $ patch -p1 < ../screen-utf8-nfd.patch $ cd src $ ./autogen.sh $ ./configure --prefix=/usr/local --enable-pam --enable-locale --enable-telnet --enable-colors256 --enable-rxvt_osc $ make && make install
6 行目の ./autogen.sh
でこけちゃう場合は autoconf
, automake
がインストールされていないものと思われます。Homebrew でインストールしちゃいましょう。
$ brew tap homebrew/dupes $ brew install autoconf $ brew install automake
homebrew/dupes
にも screen
という Formula はあるのですが、なんか HEAD からのビルドがうまくいかないので今回はパスです。
Windows(cygwin)の場合
以前は segmentation fault ばかりで全く使い物にならなかったですが、今では問題なく動くようになりました。今回示した複数行の caption なども実現可能です。
インストールは上に挙げた Linux の場合とほとんど変わりませんので、あっちのリンクを参考にしてください。
設定
さて、ここからが本題ですね。今回の目標は以下のような表示を実現することです。以下の点が特徴的かと思われます。
- メモリ・CPU・バッテリーの利用状況が表示されている。
- caption が 2 行ある。
- Last.fm の再生履歴が表示されている。
以下で解説する設定は全て Github: delphinus35/dotfiles に上げております。
メモリ・CPU・バッテリーの利用状況を表示する
これは以前の記事で解説しました。
GNU Screen の hardstatus に CPU 使用率・温度・バッテリー情報を表示する – blog.delphinus.dev
https://blog.delphinus.dev/2011/08/cpu-memory-usage-and-temp-on-screen.html
この記事では Mac での設定を挙げています。Linux で同じことやるときはググってくだせえ。(Linux ノート持ってないので試せんのです)
caption が 2 行ある。
最初に上げた記事では caption を 4 行も使う頭おかしいセッティングが掲げられていますが、僕はまだお子様なので 2 行だけでガマンしてみました。(というか、MacBook Air 11inch じゃ画面が狭い……)
詳しくはソースを直接見て頂きたいですが、肝となるのは、.screen
ディレクトリにある outer.remora-air2
と inner.remora-air2
です。
.screenrc.remora-air2(これを ~/.screenrc にコピー) | +-> .screen/outer.remora-air2 ---> .screen/backtick.pl | +-> .screen/inner.remora-air2(これがメインの設定ファイル)
source defaults caption always "%{= dd}%0`" backtick 0 0 0 $HOME/git/dotfiles/.screen/backtick.pl screen screen -qUmc $HOME/git/dotfiles/.screen/inner.remora-air2vim:se ft=screen:
outer
はその名の通り「外側」で、画面最下部の一行だけを設定するためのものです。この中で Last.fm の再生履歴を表示している一行だけを出力し、内部は別の Screen を立ち上げることで終了しています。
このように caption を一行設定→screen
呼び出し を繰り返すことで caption をどんどん増やせるんですね。うまいこと考えたもんです。
メインの設定ファイルとなる inner
については以前書いた記事を参照してください。この辺もだいぶ変わってるし書き直そうかな……。
Last.fm の再生履歴を表示する
そして肝心のこれは長くなってしまったので別記事にしました。以下に続きます。
GNU Screen の caption に Last.fm の再生履歴とかを表示する – blog.delphinus.dev
https://blog.delphinus.dev/2012/12/lastfm-history-on-gnu-screen.html
仕様上の注意
このような多段 Screen 環境では気をつけねばならないことがあります。
エスケープが増える!
Screen に指示を与えるときにはエスケープを使います。これは、標準では Ctrl + A キーです。
多段 Screen を使うときは基本的に、外側の Screen へエスケープを送ることは難しいと考えて良いです。一段ごとに Ctrl + 何かの組み合わせが増え、覚えるのも使うのも大変です。
デタッチの扱いが難しい
多段 Screen では各段階での Screen をアタッチ、デタッチすることが可能です。そんなことしても余り意味はないんですが。
多段 Screen 全体をデタッチするときは、一番外側の Screen に指示を与える必要があります。今回の設定ファイルでは外側の Screen のエスケープを Ctrl + A、内側の Screen のエスケープを Ctrl + Z にしています。デタッチしたいときは Ctrl + A D と、注意してキーを叩くようにしています。
この状態でデタッチすると、次のようになります。
[detached from 35764.ttys000.remora-air2] [perl-5.16.0][delphinus@remora-air2 ~] 2012/10/24 PM 9:23 $ screen -ls There are screens on: 35764.ttys000.remora-air2 (Detached) 35767.ttys001.remora-air2 (Attached) 2 Sockets in /tmp/uscreens/S-delphinus.
この場合は、PID 35764 の方が外側の Screen ですね。
もし間違って Ctrl + ZD でデタッチするとどうなるかというと、
[screen is terminating] [perl-5.16.0][delphinus@remora-air2 ~] 2012/10/24 PM 9:24 $ screen -ls There is a screen on: 35767.ttys001.remora-air2 (Detached) 1 Socket in /tmp/uscreens/S-delphinus.
外側の Screen が消え去ってしまいました! この状態で screen -r
しても内側の Screen しか再現されません。この辺がちと面倒です。
vim でカーソルの形状が変わらない
以前【インサートモードでカーソルを目立たせる】という記事で、ターミナル上の vim において、モードごとにカーソルの形を変える方法を書いたのですが、これが今回の設定ではうまく働きません。
エスケープシーケンスがターミナルにうまく伝わっていないのが原因だとは思うんですけどね。どうやったら解決するのかよくわかりません。
隣の芝生は青い
とかなんとか、みみっちくがんばってたらですね。tmux の方ではなんかスゴいのが出てたんですね。
erikw/tmux-powerline · GitHub
https://github.com/erikw/tmux-powerline
いいなー!これ。vim-powerline の tmux 版ですね。GNU Screen ではこんなリッチな画面は作れません。あっちに移りたくなってきたなあ。