[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:09823] Re: Emacs Shell-modeで文字化け



>>>>> plamo の No. 09821
>>>>> Message-Id: <20010516024625Z.hide@asahi-net.or.jp> で、
>>>>> "KIDO" == KIDO Hideyuki <rp9h-kd@asahi-net.or.jp>さま曰く...

KIDO> Emacs20.7 の Shell-mode で文字化けに悩んでいます。

文字化けといってもいろいろありますので,実際にどのように表示され
るかを示された方が解決が早い場合が多いと思います。

ただ,その際メイルに copy & paste したのでは,相手には別のものに
見える場合が多々ありますので,見える通りに手で打つか,それが不可
能であれば言葉で説明するというのが望ましいと思います。

KIDO> 文字化けは、ls -la コマンド出力の日付や、その他のコマンド
KIDO> のエラー表示などです。ただし、症状は初回の Shell-mode だけ
KIDO> で、いったん exit, C-x k した後、再度 M-x shell とすれば2
KIDO> 回目以降は解消します。

KIDO> 現在の .emacs の文字コード関連の記述は以下のとおりです。

[...]

これらを活かしたまま何らかの設定を追加して解決したとしても,
Emacs 的にまっとうな方法にはなり得ないと思いますので,とりあえず,
これらの設定は*削除*してしまってください。

日本語環境で,日本語 EUC を主に使うのであれば,

(set-language-environment "Japanese")
(set-default-coding-systems 'euc-jp)

だけで十分ではないかと思います。

これだけで, shell-mode で使うコマンドの出力が日本語 EUC であれ
ば,文字化けはしないと思います。

もし,これでも化けるようであれば,他の部分が悪影響を与えている可
能性がありますので,

emacs -q -no-site-file

で起動してから, *scratch* buffer に

(progn
  (set-language-environment "Japanese")
  (set-default-coding-systems 'euc-jp))

を入力し,最後の `)' の後ろで C-j してから shell-mode を起動して,
文字化けするかを確認してください。

しかし,これだけだと sub-process からの出力が日本語 EUC 以外のも
のだった場合,自動判定が効かないので文字化けしますので,次のもの
を追加してみてください。

(setq default-process-coding-system '(undecided-dos . euc-jp))

これで,プロセスからの出力文字の coding system を自動判定するよ
うになります。(プロセスへの入力は固定しなければなりませんので,
ここでは euc-jp にしてあります。)

Emacs は,サブプロセスの起動後,一度 coding system を確定すると,
それ以降はその coding system を使い続けます。そのため,途中から
文字コードが変化するような場合には対応できませんので注意してくだ
さい。

shell-mode の場合,この性質から次のようなことになります。

foo.jis foo.euc という2つのファイルがあり,それぞれ ISO-2022-JP,
日本語 EUC を含んでいる場合,起動直後に `cat foo.jis' とし,その
後 `cat foo.euc' とすると文字化けします。

これはちょっと不便ですので,私は次のようなものを ~/.emacs に書い
ています。

(setq my-comint-process-coding-system '(undecided-dos euc-jp))

(defun my-shell-mode-hook ()
  (setq comint-input-sender (function my-comint-simple-send)))

(defun my-comint-simple-send (proc string)
  (run-hooks 'my-comint-send-hook)
  (comint-send-string proc string)
  (comint-send-string proc "\n"))

(defun my-comint-send-hook ()
  (apply 'set-buffer-process-coding-system my-comint-process-coding-system))

(eval-after-load "shell"
  '(progn
     (add-hook 'shell-mode-hook 'my-shell-mode-hook)
     (add-hook 'my-comint-send-hook 'my-comint-send-hook)))

これで, `cat foo.jis' したあとに `cat foo.euc' しても化けないと
思います。もちろん,これでも `cat foo.*' には対応できません。
-- 
鈴木圭一 / keiichi@nanap.org
PGP finger print (DH/DSS)
0B32 B37E 6DE9 3BC1 68A4  4089 7AAF 2B03 ECBD 614B

Follow-Ups
[plamo:09830] Re: Emacs Shell-modeで文字化け, KIDO Hideyuki
References
[plamo:09821] Emacs Shell-modeで文字化け, KIDO Hideyuki

[検索ページ] [メール一覧]
Plamo ML 公開システム