CentOS5.2 + putty + screen + zsh + emacs21(22)でUTF-8の日本語いろいろメモ

微妙に日本語が通ってなかったところを何とかしたメモ。

まず環境。CentOSは5.2。Debian 4.0 etchでも同様の構成でうまくいく。

% cat /etc/redhat-release
CentOS release 5.2 (Final)

puttyはRelease 0.59_Gottani+Mouse_Tr_Bad。半透明化のためのパッチが当たってるバージョンを使用。半透明は後ろのドキュメントを読みながら作業できるので便利。

screenは4.00.03。現状yumで入る最新版となる。

% screen --version
Screen version 4.00.03 (FAU) 23-Oct-06

zsh。これが問題。yumで自動で入れると/bin/zshにおかれるのは4.2.6になるが、これはマズい。lsやcatで日本語を表示・入力することはできるが、何故かプロンプトに日本語を入れると化ける。

% /bin/zsh --version
zsh 4.2.6 (x86_64-redhat-linux-gnu)

そのようなわけで、適当なところから最新版をダウンロードしてきて自分で入れる必要がある。今現在は4.3.9。なお、Debianの場合は最初から4.3.2が入っているので必要ない。

インストールはtar xvzfしてcdして./configure、makeしたらsudo make installだけでいい。/etc/shellsに/usr/local/bin/zshを足したらchshでログインシェルを変更する。

% /usr/local/bin/zsh --version
zsh 4.3.9 (x86_64-unknown-linux-gnu)

次にEmacs。バージョン自体は自動でインストールされている21.4.1で問題ない。後は設定次第。22系でも良し。

% emacs --version
GNU Emacs 21.4.1

次に設定。大事なのはputty。少なくとも手元で試した範囲では、Window→Translationで選択するエンコーディングは「UTF-8」で無ければいけない。気分的には「UTF-8(CJK)」を選びたくなるが、コレを選択するとEmacsの表示が崩れるので注意。余談だがDebianでdpkg-reconfigureなどを使う際もCJK付きだと崩れる。なおTreat CJK ambiguous characters as wideのチェックはしないように。これも崩れる原因になる。

次にscreenだが、まず「-U」を付けて起動してUTF-8モードにするのが良い。おまじないに.screenrcにもdefencoding UTF-8も書いておくと安心だ。「-U」を付けておかないとなんとも微妙に問題が発生することがある。なお、どうせscreenは常用するのでputtyの設定で自動起動するようにしおくと便利だ。Connection→SSHのRemote commandに(筆者の場合ならば)screen -xRUを入れるだけだ(xで複数ターミナルで1つのスクリーンを共有、Rでscreenが起動してない場合に自動起動)。

zshの設定は適当でなんとかなる。バージョンさえ問題がなければまず問題は発生しないだろう。敢えて書くとすれば、.zshrcにexport LANG=en_US.utf8を追加してエンコーディングを指定することである。メッセージなどを日本語で表示したいならばja_JPにすること。

LANG=en_US.utf8の場合、emacsをそのまま起動するともしかすると化けるかもしれない。そういう場合は、.zshrcにalias emacs="LANG=ja_JP.utf8 emacs"とでも書いておこう。

Emacsの設定はややこしいが、21ならば概ね以下のような感じになるようだ。

(require 'un-define)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)

CentOSだけならばun-defineは必要ないかも知れないが、書いておいても問題はない。Debianだと恐らく必要になる(Mule-UCSをインストール必要があるかもしれない)。なお、もしかすると(set- language-environment "Japanese")が必要になる環境があるのかも知れないが、少なくともCentOSとDebianにおいては、これを書くと逆に文字化けが発生してしまうのを確認した。

Emacs22系の場合はun-defineは必要ないだろう。