LANG=ja_JP.UTF8でGNU Screen 4.1/4.2を使って、asciiコード以外の文字を表示するNcursesアプリを動かすと画面表示がおかしくなってしまいます。
Linuxカーネルやbusyboxのmake menuconfigがまともに動作しません。
GNU Screen 4.1/4.2は最近のLinuxディストリで使われている為、対応に苦慮しています。
Table of Contents
1 表示がおかしくなる現象
CentOS 6でscreenした後にNcursesを動かした場合(正しく表示)。
CentOS7でscreenした後にNcursesを動かした場合(表示が乱れる)。
2 問題が起こるディストリと起こらないディストリ
問題が起こるディストリ。
CentOS 7、Fedora 21、Fedora 22、Ubuntu 14.04、Debian 8
問題が起こらないディストリ。
CentOS 6、Ubuntu 12.04、Debian 7
試行錯誤した結果、screenのバージョンが4.0では問題が起こりません。
ただし、Debian 7は4.1ですが問題は起きません。
パッチで修正されているのか、configureの問題なのか、4.01.xx以降で起こるのか不明です。
また、LANG=Cな環境では問題は起こりません。
3 回避策: LANGを変更する
screenコマンドを実行する前にLANGを変更します。
$ LANG=C screen # screen上でscreenする場合はLANG=Cが引き継がれる
ただし、UTF8の日本語入力ができなくなります。
LANG=Cのみで済ませる方はそもそも本問題に直面しないので本末転倒かも。
4 回避策: CentOS 6とUbuntu 12.04のGNU Screen 4.0を使う
CentOS 7の場合はCentOS 6のGNU Screenを、Debian系はUbuntu 12.04のGNU Screen 4.0をリビルドして使います。
Fedoraの場合は-Werror=format-securityオプションが有効な為、ソースコードの修正が必要になります。
4.1 CentOS 7の場合
CentOS 6のSRPMを利用します。
sudo yum update -y sudo yum install -y screen sudo yum remove -y screen sudo yum install -y rpm-build gcc sudo yum-builddep -y screen mkdir screen cd screen wget http://vault.centos.org/6.6/os/Source/SPackages/screen-4.0.3-16.el6.src.rpm rpmbuild --rebuild screen-4.0.3-16.el6.src.rpm sudo rpm -i ~/rpmbuild/RPMS/x86_64/screen-[Version].rpm
4.2 Debian系の場合
Ubuntu 12.04のソースコードを利用します。
sudo apt-get update -y sudo apt-get upgrade -y sudo apt-get install -y screen sudo apt-get remove -y screen sudo apt-get build-dep -y screen sudo apt-get install -y dpkg-dev fakeroot dpatch mkdir screen cd screen wget http://jp.archive.ubuntu.com/ubuntu/pool/main/s/screen/screen_4.0.3-14ubuntu8.dsc wget http://jp.archive.ubuntu.com/ubuntu/pool/main/s/screen/screen_4.0.3-14ubuntu8.diff.gz wget http://jp.archive.ubuntu.com/ubuntu/pool/main/s/screen/screen_4.0.3.orig.tar.gz dpkg-source -x screen_4.0.3-14ubuntu8.dsc cd screen-4.0.3/ tmp=`mktemp` grep -v "dh_installinfo" debian/rules > ${tmp} cp ${tmp} debian/rules rm -f ${tmp} dpkg-buildpackage -us -uc sudo dpkg -i ../screen_[Version].deb
dh_installinfoに問題があるようなので、infoは含めないようにします。
4.3 Fedoraの場合
CentOS 7と同じようにリビルドするとエラーになります。
screen.c: In function 'MakeNewEnv': screen.c:1876:14: error: format not a string literal and no format arguments [-Werror=format-security] Panic(0, strnomem);
Fedoraではrpmbuild実行時に-Werror=format-securityオプションがデフォルトで有効になる為です。
${HOME}/rpmbuildディレクトリにビルド用の領域ができるので、上記を修正したパッチを加えてFedora 22のSRPMを作成しました。
5 解決策: .screenrcでcjkwidth offを設定する
screenのgitのコードを試していったところ、以下のパッチで本現象が発生するようです。
commit b8fd0c833bbd910a525d270ebc8f7e87ee00cb0a Width toggle for ambiguous East Asian chars, courtesy Yi-Hsuan Hsin (#16666).
このパッチは全角文字を適切に表示する為のもののようです。
.screenrcでcjkwidth offを設定したところ、Ncursesアプリが適切に表示されました。
ターミナルソフトの設定のおかげなのか、全角文字も適切な幅で表示されています。