*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 を読んでみて自分なりにまとめたものです。
実験
やりたかったことは,ソースコードのエンコーディングに対応させることでした。
で,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 さんに,ありがとう!