*git-diff* バッファでの文字化けの件,解決か?

どうもりんこおはようございます。


SaitoAtsushi さんと Plus さんのおかげで一応な形ではござんすが,
要求を満たすことが出来ました。

結論

やっていることは,*git-diff* バッファを開こうとするときに,
diff の対象ファイルのバッファのエンコーディングを見て,
んで,そのエンコーディングを元に,process-coding-system-alist を変更しているだけです。
それを,アドバイスで実現してみました。

(defadvice git-run-command-buffer (before my-git-run-command-buffer-before-advice)
  (let ((bufname (ad-get-arg 0))
        (files (ad-get-arg 6))
        from-coding f b)
    (when (equal bufname "*git-diff*")
      (if (listp files) (setq f (car files)) (setq f files))
      (cond ((get-buffer f)
             (save-excursion
               (set-buffer (get-buffer f))
               (setq from-coding buffer-file-coding-system)))
            (t (setq b (get-buffer-create f))
               (save-excursion
                 (set-buffer b)
                 (setq from-coding buffer-file-coding-system))
               (kill-buffer b)))
      (modify-coding-system-alist 'process "\\`git\\'" (cons from-coding 'undecided-dos))
      (message (format "DEBUG: %s" from-coding)))))
(ad-activate 'git-run-command-buffer)
;(ad-remove-advice 'git-run-command-buffer 'before 'my-git-run-command-buffer-before-advice)
;(ad-deactivate 'git-run-command-buffer)

余談

以下は,Elisp Manual を読んでみて自分なりにまとめたものです。

  • coding-system
    • decoding
      • input 用
    • encoding
      • output 用
  • process-coding-system-alist
  • encoding
    • undecided -> データから決定
    • 出来る限り code conversion と,end-of-line conversion を指定するべし。
    • (base coding system)-(eol conversion)
    • 例: sjis-dos, utf-8-unix

実験

やりたかったことは,ソースコードエンコーディングに対応させることでした。
で,modify-coding-system-alist で決め打ちしてしまうと,
別プロジェクト の sjis-dos なファイルのdiffを見ようとすると,化けました。
なので,どんなパターンの時に化けるかを調べてみたと言うことです。
以下は,git の process-coding-system の話です。

エンコーディング ソース git-diff 化ける?
(utf-8-unix . undecided-dos) sjis-dos sjis-dos 化ける
utf-8-unix sjis-dos 化けない
(undecided . undecided-dos) sjis-dos sjis-dos 化ける
utf-8-unix sjis-dos 化けない
(sjis-dos . undecided-dos) sjis-dos sjis-dos 化けない
utf-8-unix sjis-dos 化ける


というわけで,encoding の方は,undecided-dos で決め打ち。
なぜなら,Meadow だからというのがなんとなくの理由。
で,encoding の方は,ソースコードに合わせて指定すればよさそう。
だもんで,from-coding を調べて,
(modify-coding-system 'process "\\`git\\'" (cons from-coding 'undecided-dos))
をすればよさそう。

まとめ

アドバイス対象の関数が適切かどうか自信なし。
今のところは,git-diff だけで困っていたので,よしとする。
問題に出くわしたら修正する方向で。


というかさ,.git/config 中で指定したりするのが普通じゃないのか?
とか思ったり。これもいずれ調べる予定。


再度,SaitoAtsushi さん,Plus さんに,ありがとう!