2014/02/09

GNU Screenの日本語表示ズレ

ブログが放置状態なので、何か書こうかなというので、GNU Screenの日本語表示ズレについてです。

Putty + Screen + Vimで日本語を表示していると、表示がずれることがあります。
具体的には以下のような文字が含まれる行を編集したりコピーペーストしたりした場合です。
×÷○□※
調べてみると、どうもScreenに問題があるようです。

ちなみに各ソフトウェアのバージョン・設定等を抜粋するとこんな感じです。
  • Putty
    • バージョン: 0.63-jp20130916
    • リモートの文字セット: UTF-8(CJK)
    • CJK用の文字幅を使用する: Off
    • 端末タイプを表す文字列: xterm-256color
  • リモートPC
    • CentOS 6.5 (x86_64)
    • $LANG: ja_JP.UTF-8
  • GNU Screen
    • yumでインストールした screen.x86_64 0:4.0.3-16.el6
    • screen -Uで起動
  • Vim
    • yumでインストールしたvim-enhanced-7.2.411-1.8.el6.x86_64
    • ~/.vimrcでset ambiwidth=double
特にPuttyのUTF-8(CJK)というのと、Vimのambiwidth=doubleはこう設定していないと、上記以外の文字("~"など)でも表示に影響が出るようです。

それでもズレるというので、これまでは表示がずれたらCtrl-lで再描画させて凌いでいたのですが、ふと気になって調べて対策してみました。

ズレですが、FreeBSDでは起こらなくて、CentOSでは起こるというのの気がつき、FreeBSD Portsに含まれているopt-cjkwidthというパッチが効きそうというのが分かりました。
それで、手動でパッチをあててビルドしたら解決かと思いきや、CentOS上でScreenがconfigure & makeではビルドできず、手間がかかりました。

さらに調べてみると、yumでインストールされるパッケージは、素のscreen-4.0.3にいくつかパッチが適用されてビルドされているようです。ということで、最終的には以下の手順でビルド・インストールしました。
  1. ScreenのSRPMパッケージをダウンロード、インストール
  2. opt-cjkwidthパッチをコピー
  3. SPECファイルを変更
  4. RPMパッケージを作成
  5. 前から入っているScreenをアンインストール
  6. 生成したRPMパッケージから修正版Screenをインストール
詳細な手順は以下のようになりました。

ScreenのSRPMパッケージをダウンロード、インストール

手っ取り早くwgetでダウンロードし、rpmコマンドでインストールします。
wget 'http://vault.centos.org/6.5/os/Source/SPackages/screen-4.0.3-16.el6.src.rpm'
rpm -ivh screen-4.0.3-16.el6.src.rpm
一般ユーザ権限で実行して、~/rpmbuild/にファイルが展開されます。

opt-cjkwidthパッチをコピー

FreeBSDの/usr/ports/sysutils/screen/files/opt-cjkwidthを~/rpmbuild/SOURCES/にコピーします。
手元にFreeBSD PCが無くても、Web上からopt-cjkwidthパッチは取ってこれると思います。

SPECファイルを変更

~/rpmbuild/SPECS/screen.specを編集します。
opt-cjkwidthパッチを適用するように他のパッチを真似て以下2行を追加します。
Patch15: opt-cjkwidth
...
%patch15 -p0 -b .cjkwidth
他のパッチはほとんどが-p1となっていますが、opt-cjkwidthは-p0にします。

RPMパッケージを作成

rpmbuildコマンドでビルドを行いRPMパッケージを作成します。
rpmbuild -bb ~/rpmbuild/SPECS/screen.spec
必要なパッケージが足りない場合はエラーメッセージが出ますので、パッケージをインストール後に再度rpmbuildコマンドを実行します。私の場合は以下のように不足パッケージをインストールしました。
sudo yum install ncurses-devel pam-devel libutempter-devel texinfo
ビルドできると~/rpmbuild/RPMS/x86_64/screen-4.0.3-16.el6.x86_64.rpmができています。

前から入っているScreenをアンインストール

yumでインストールしたScreenをアンインストールします。この作業が必要なのかよく分かっていませんが念のため。
sudo yum remove screen

生成したRPMパッケージから修正版Screenをインストール

以下のようにrpmコマンドで作成したRPMパッケージからScreenをインストールします。
sudo rpm -ivh ~/rpmbuild/RPMS/x86_64screen-4.0.3-16.el6.x86_64.rpmd

0 件のコメント:

コメントを投稿