2011年1月3日月曜日

cygwin coreutils と emacs dired

cygwin の coreutils が 8.5-2 から 8.8-1 へバージョンアップした。
ところが、これにより、ls コマンドの出力形式が、
-rwxrwxrwx  1 iizu Local 24498 2011-01-03 20:44 .emacs
から、
-rwxrwxrwx 1 iizu Local 24498 1月   3 20:44 .emacs
と変った。つまり、月日が日本語形式になった。日のほうは、数字(day-of-month)だけだが…。
しかし、emacs の dired で一部のファイル名が認識できなくなった。
これは ls コマンドの出力形式が変ったために、ファイル名を取り出すパターンマッチングに失敗しているようだ。
-rwxrwx---  1 iizu Local    38 12月 19  2003 .profile
上記のように、月が 10 ~12 と2桁なら認識するが、1~9月の1桁だと認識しない。
このファイル名を認識するパターンは、「directory-listing-before-filename-regexp」という変数で定義されている。

・/usr/share/emacs/23.2/lisp/files.el
(defvar directory-listing-before-filename-regexp
  (let* ((l "\\([A-Za-z]\\|[^\0-\177]\\)")
  ...
     ;; Japanese MS-Windows ls-lisp has one-digit months, and
     ;; omits the Kanji characters after month and day-of-month.
     ;; On Mac OS X 10.3, the date format in East Asian locales is
     ;; day-of-month digits followed by month digits.
     (mm "[ 0-1]?[0-9]")
     (east-asian
      (concat "\\(" mm l "?" s dd l "?" s "+"
          "\\|" dd s mm s "+" "\\)"
          "\\(" HH:MM "\\|" yyyy l "?" "\\)")))
月の数字のパターンは、1桁でも良いようになっているようだが、実際にはなぜかマッチしない。
他に何か理由があるのか、今の所不明である。
解決方法として、
  1. coreutils を 8.5-2 に戻す。
  2. directory-listing-before-filename-regexp を修正する。
  3. 環境変数 LANG を非日本語にする。
の3つが考えられるが、1の方法は cygwin の更新を setup でチェックする時、毎回 coreutils を 8.5-2 に戻す設定をしなければならないので、少々面倒である。
また、2の方法は、files.el を直接書き直しても、修正が反映されなかった。
そこで、3の方法で回避する。現在、emacs を起動する時、「.bashrc」で、

・.bashrc
alias e='export SHELL; env LANG=ja_JP.UTF-8 emacs &'
という alias を定義して起動している。これを、
alias e='export SHELL; env LANG=C emacs &'
と変更した。これにより、ls のコマンドの出力が
-rwxrwxrwx  1 iizu Local 24498 Jan  3 20:44 .emacs
と英語形式になるので dired でもちゃんとファイル名が認識される。
ファイル名が日本語であっても、環境変数 LANG に関係無く正しく表示されるので、当分、これでやってみる事とする。

(2011年3月15日 追記)
emacs が 23.3 にバージョンアップしたところ、上記の問題は解決した。→「cygwin emacs 23.3

0 件のコメント: