Midnight Commanderを日本語(UTF-8)で使用したときのズレを回避
かなり前から存在するCLIのファイルマネージャMidnight Commander(mc)は、UTF-8な環境との相性が悪い。すでにUTF-8対応パッチ自体は出ていて、ディストリごとに、このパッチを含め、色々な修正のされたパッケージを出しているのだが、それでもUTF-8な日本語環境では表示がおかしくなるところがある。EUC-JPのロケールで実行するとズレの問題が起こらないが、その代わり、日本語を含むファイル名が化ける。
色々試してみたところ、根本的な解決というわけではないのだが、このズレの問題を回避することには成功したので、対処の作業をメモしておくことにする。
一覧のヘッダとタイムスタンプの表示がズレる不具合
デフォルトの表示形式では、左側がフォーカスされているときに
+<-/etc------------------------------v>++<-~---------------------------------v>+ | 名前 | サイズ | 更新|| 名前 | サイズ | 更新| | make.conf | 1713| 10月 25 21:26 /.. |UP--DIR| |
右側がフォーカスされているときに
+<-/etc------------------------------v>++<-~---------------------------------v>+ | 名前 | サイズ | 更新|| 名前 | サイズ | 更新| | make.conf | 1713| 10月 25 21:2||/.. |UP--DIR| |
のようになってしまう。
- ヘッダ部分が後ろに押していて、表示しきれていない上に罫線がズレている
- タイムスタンプの部分も1文字分右に出ていて、その代わり、左(上の例では「| 10月」の部分)が空いてしまっている
日本語が入るとNG?
日付のロケールに英語を使用すると、タイムスタンプの部分のズレは起こらない。
$ LC_TIME=C mc -abx
また、ヘッダ部分を含め、メッセージを英語にすることでズレは出なくなる。
$ LC_MESSAGES=C LC_TIME=C mc -abx
しかし、これだと、元々ズレない部分まで英語になり、使いにくくなってしまう。
gettextのメッセージカタログを編集して対処
以上を踏まえると、「ヘッダとタイムスタンプの部分に日本語を含まない」ようにできれば良いのでは、ということになる。前者はメッセージカタログを編集して英語に戻すことで解決するのだが、幸運なことに、後者も、タイムスタンプのフォーマットの部分が多言語化対応されていることにより、これを別の書式にするようにメッセージカタログ(場所はpo/ja.po。エンコーディングはEUC-JP)を編集することで(ソースを修正してビルドすることなく)解決する。
--- mc-4.6.1.orig/po/ja.po +++ mc-4.6.1/po/ja.po @@ -1169,7 +1169,7 @@ #: src/chmod.c:129 src/screen.c:407 msgid "Name" -msgstr "名前" +msgstr "Name" #: src/chmod.c:131 msgid "Permissions (Octal)" @@ -3270,23 +3270,23 @@ #: src/screen.c:408 src/screen.c:409 msgid "Size" -msgstr "サイズ" +msgstr "Size" #: src/screen.c:411 msgid "MTime" -msgstr "更新時刻" +msgstr "MTime" #: src/screen.c:412 msgid "ATime" -msgstr "Acess時刻" +msgstr "ATime" #: src/screen.c:413 msgid "CTime" -msgstr "変更時刻" +msgstr "CTime" #: src/screen.c:414 msgid "Permission" -msgstr "アクセス権" +msgstr "Permission" #: src/screen.c:415 msgid "Perm" @@ -3298,7 +3298,7 @@ #: src/screen.c:417 msgid "Inode" -msgstr "Iノード" +msgstr "Inode" #: src/screen.c:418 msgid "UID" @@ -3310,11 +3310,11 @@ #: src/screen.c:420 msgid "Owner" -msgstr "所有者" +msgstr "Owner" #: src/screen.c:421 msgid "Group" -msgstr "グループ" +msgstr "Group" #: src/screen.c:659 #, c-format @@ -3583,11 +3583,11 @@ #: src/util.c:701 src/util.c:727 msgid "%b %e %H:%M" -msgstr "%b %e %H:%M" +msgstr "%m/%0e %H:%M" #: src/util.c:702 src/util.c:725 msgid "%b %e %Y" -msgstr "%b %e %Y" +msgstr "%m/%0e %Y" #: src/utilunix.c:266 #, fuzzy, c-format
具体的には、「[月の省略名] [月の日付] ...」を「[月の数字]/[月の日付(0付き)] ...」としている。これにより
のような書式で表示され、分かりやすい*2/コンパクト*3/ズレ解消の一石三鳥。
これを使用するには、Midnight Commander 4.6.1のソースを用意*4して
$ tar zxf [mc-4.6.1.tar.gzの場所] $ patch -p0 < [上のパッチの場所] $ msgfmt mc-4.6.1/po/ja.po -o mc.mo $ sudo mv /usr/share/locale/ja/LC_MESSAGES/mc.mo{,.orig} $ sudo mv mc.mo /usr/share/locale/ja/LC_MESSAGES/
メッセージカタログのみ変換してコピーする。これでズレは回避でき、他の部分は日本語のままで使用できる。LC_TIMEを修正する必要もない。
修正後の表示は下のようになる。
+<-/etc------------------------------v>++<-~---------------------------------v>+ | Name | Size | MTime || Name | Size | MTime | | make.conf | 1713|10/25 21:26||/.. |UP--DIR| |
mltermで画面がぐちゃぐちゃになる + マウスが利かない
「milkjfフォントを使用する」の設定でこのフォントを使用した場合、罫線の問題なのか、矢印キーで項目を移動するときに表示が汚くなったり、設定ダイアログのレイアウトが崩れたりする。screenを使用するともっとひどくなる。
この回避策としては、-aオプションを付ける。
マウスが利かない場合(screenの中で起動した場合など)は、-xオプションを付けると使用できる。
S-Langについての追記
(2008/3/12)Midnight CommanderをUTF-8上で動かすパッチは、S-Lang(http://www.s-lang.org/)というライブラリを要求し、このS-LangにもUTF-8対応パッチが必要となっている。
S-Langのバージョン2系ではこのパッチが存在しないため、一部のずれを回避することができない(-aオプションが動作しない?)。
つまり、ずれを解消するためには
- S-Lang バージョン1.4系+UTF-8パッチ
- Midnight Commander+UTF-8パッチ
- メッセージカタログの修正
- 起動時の-aオプション
が必要。
関連記事:
使用したバージョン:
- Midnight Commander 4.6.1 (4.6.1-r4 USE="7zip X gpm ncurses nls pam -samba slang unicode")
- S-Lang 1.4.9 (1.4.9-r2 USE="cjk unicode")
*1:ソース(src/util.c)では「6x30x24x60x60(30日x6ヶ月)」の計算。touchコマンドで更新時刻をいじって実験したところ、2007/11/1の時点では、2007/5/5までが「05/05 2007」の形で表示され、5/6から「05/06 11:22」の形になっている
*2:個人的には「Jan」「Feb」のような月の名前よりも、月の数字のほうが分かりやすい
*3:ファイル/ディレクトリ名がほんの少しだけ長く表示できる
*4:もしくは、ソースを用意する代わりに、インストールされている/usr/share/locale/ja/LC_MESSAGES/mc.moをmsgunfmtして.po形式にした後で手動編集する