■ Emacs 共通の設定


【お知らせ】


<2019/02/12 追記>
漢字をプロンプトの文字化けを回避するため、利用するフックを comint-input-filter-functions から comint-output-filter-functions に変更しました。(でも、時々文字化けは発生します。原因調査中。)

<2018/07/29 追記>
decode の coding-system を設定する方法を advice から hook に変更しました。

【本題】


shell-mode で複数の漢字コードを混在して利用できるようにするための設定です。

<前提設定>
(prefer-coding-system 'utf-8-unix)

;; プロセスが出力する文字コードを判定して、process-coding-system の DECODING の設定値を決定する
(setq default-process-coding-system '(undecided-dos . utf-8-unix))
<本設定>
;; カレントバッファが shellバッファのときに、動いている process の decode の coding-system
;; の設定を undecided にする
(defun set-process-coding-system-for-decode (ignore)
  (let ((process (get-buffer-process (current-buffer))))
    (when process
      (let ((coding-system (process-coding-system process)))
        (set-process-coding-system process
                                   (coding-system-change-text-conversion
                                    (car coding-system) 'undecided)
                                   (cdr coding-system))))))

;; shellバッファで、コマンド実行結果出力前に set-process-coding-system-for-decode を実行する。
;; この設定により、shellバッファで utf-8 の出力をする UNIX コマンドと、cp932 の出力をする
;; Windows コマンドの漢字の文字化けが回避される。
(add-hook 'shell-mode-hook
          (lambda ()
            (add-hook 'comint-output-filter-functions
                      'set-process-coding-system-for-decode nil t)))
comint-mode で動作するバッファすべてに対して本設定を適用したい場合は、上記の最後の4行の設定を次の設定に置き換えてご利用ください。
(add-hook 'comint-output-filter-functions 'set-process-coding-system-for-decode)


<変更履歴>
  • 2015/05/15 このページを作成した。
  • 2015/09/10 advice を Emacs-24.4 以降の書式に見直した。
  • 2018/07/29 decoding-system を設定する方法を advice から hook に変更した。
  • 2018/09/05 一応、前提となる設定を追記した。
  • 2019/02/12 漢字をプロンプトの文字化けを回避するため、利用するフックを comint-input-filter-functions から comint-output-filter-functions に変更した。