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は必要ないだろう。