試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

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付き)] ...」としている。これにより

  • 今年変更されたファイルやディレクトリ: 「11/01 11:22」
  • 半年以上前*1に変更されたファイルやディレクトリ: 「11/01 2006」

のような書式で表示され、分かりやすい*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 CommanderUTF-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オプション

が必要。

関連記事:

使用したバージョン:

*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.momsgunfmtして.po形式にした後で手動編集する