読者です 読者をやめる 読者になる 読者になる

GNU screenのrebuild

GNU Screen Watch: January 2011 - April 2013 - Keep It Simple, Stupidで%Eで入力待機状態が取れると言う情報を頂いたので、早速試したところ
f:id:moguriso:20130503115419p:plain
残念なことになってしまいました。使っているversionが古いのかも知れません。

$ screen --version
Screen version 4.00.03jw4 (FAU) 2-May-06

特段古いようにも見えませんが・・・。取り敢えずscreenのgitからソースを落としてきてリビルドしました。

$ cd /usr/local/src
$ sudo git clone git://git.sv.gnu.org/screen.git
Cloning into 'screen'...
remote: Counting objects: 3940, done.
remote: Compressing objects: 100% (913/913), done.
remote: Total 3940 (delta 3024), reused 3915 (delta 3011)
Receiving objects: 100% (3940/3940), 2.38 MiB | 311 KiB/s, done.
Resolving deltas: 100% (3024/3024), done.
$ cd screen/
$ sudo chown -R moguriso:moguriso ./
$ cd src/
$ ./autogen.sh 
autoheader: WARNING: Using auxiliary files such as `acconfig.h', `config.h.bot'
autoheader: WARNING: and `config.h.top', to define templates for `config.h.in'
autoheader: WARNING: is deprecated and discouraged.
autoheader: 
autoheader: WARNING: Using the third argument of `AC_DEFINE' and
autoheader: WARNING: `AC_DEFINE_UNQUOTED' allows one to define a template without
autoheader: WARNING: `acconfig.h':
autoheader: 
autoheader: WARNING:   AC_DEFINE([NEED_FUNC_MAIN], 1,
autoheader:             [Define if a function `main' is needed.])
autoheader: 
autoheader: WARNING: More sophisticated templates can also be produced, see the
autoheader: WARNING: documentation.
$ ./configure --enable-colors256 --enable-locale 
configure: WARNING: unrecognized options: --enable-locale
this is screen version 4.1.0
〜(略)〜
configuration section in config.h.
Then type 'make' to make screen. Good luck.

までは良かったのですが、makeするとerrorになります。

$ make -j5
〜(略)〜
gcc -c -I. -I.  -DETCSCREENRC='"/usr/etc/screenrc"' -DSCREENENCODINGS='"/usr/share/screen/utf8encodings"' -DHAVE_CONFIG_H -DGIT_REV=\""`git describe --always 2>/dev/null`"\" \
             -g -O2 -D_GNU_SOURCE ansi.c
ansi.c: 関数 ‘MFindUsedLine’ 内:
ansi.c:2930:12: エラー: ‘struct win’ は ‘encoding’ という名前のメンバを持っていません
make: *** [ansi.o] エラー 1

周辺コードを眺めるとtypoなのかケアレスミスか"w_"のプリフィックスが抜けてるだけなので↓なパッチをあてました。

$ git diff
diff --git a/src/ansi.c b/src/ansi.c
index 471b35f..04c9012 100644
--- a/src/ansi.c
+++ b/src/ansi.c
@@ -2927,7 +2927,7 @@ int ys, ye;
 # endif
 #endif
 #ifdef UTF8
-      if (p->encoding == UTF8)
+      if (p->w_encoding == UTF8)
        {
          if (ml->font != null && bcmp((char*)ml->font, null, p->w_width))
            break;

そして、冒頭で参照させて頂いたページで修正方法まで記載されていることに後になって気づきました...orz

$ sudo make install
$ screen --version
Screen version 4.01.00devel (GNUd94037c) 2-May-06

末尾の日付が更新されなかったのでミスったかと思いましたが、versionは確かに変わってました。
ただ、これだけだとプロセス名が常にbashです。。。

という訳でiandeth. - 続 screen の使い方を参考にさせて頂き、.bashrcを修正しました。

f:id:moguriso:20130503123854p:plain

やりたいことは出来るようになったからよしとしよう。。。

.screenrc

escape ^Tt
startup_message off
vbell off
autodetach on

shelltitle "$ |bash"

attrcolor b ".I"
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
caption always "%?%F%{= Wk}%:%{= KW}%?%-w%{=u bW}%?%?%E%{Yb}%? %n %t%{-}%+w"
defbce on 
defscrollback 10000
defmousetrack on

#caption always "%?%F%{Wk}%:%{KW}%?%?%E%{Yr}%? %n %?%F%{gW}%:%{.w}%?%?%E%{.r}%? %t%="
#caption always "%?%F%{= wk}%:%{= ww}%?%-w%{=u Wk}%n %t%{-}%+w"
#mousetrack on
#termcapinfo xterm* ti@:te@

いろいろ弄ってみました。一番何とかしたかったマウスホイール*1の挙動で、

  1. 通常の挙動ではスクロールバッファを遡って見られる(要はコンソールスクロールする)
  2. 何らかの拍子にコマンド履歴を見るようになってしまう(スクロールしなくなる)

という現象が出て非常に面倒くさかったのですが、screenの性ではなかったのかと・・・取り敢えず
f:id:moguriso:20130503173619p:plain
の最下段”キー押し下げを代替スクリーンでスクロールに使う”のチェックを外したら今のところ再現しなくなった模様です。不意のタイミングで出るので地味にいらっと来るので、コレで治ってくれると良いのですが・・・。

*1:厳密にはトラックパット