Winodws 7 で Cygwin + NTEmacs 事始め の続きでもう少し NTEmacs の設定にこだわってみる。私は数年前から UTF-8 でのみ作業するようになり、作成するファイルは特別な理由がない限り文字コード UTF-8 で編集・管理している。Windows で作業する場合にもなるべく UTF-8 な作業環境を実現したい。幸い NTEmacs を使用すればほぼ実現される。ただすべて希望通りにはいかない。今回はその試行錯誤の痕跡をメモしておく。
まず、フォント設定から。emacs for gnupack の NTEmacs は標準で「MS ゴシック」が設定されており視覚性もよく特に変更する必要はないと感じていたが、アクセント付きラテン文字などもう少し表示できる文字を増やしたい。Windows らしく英数は consolas で、日本語は MeiryoKe Gothic に変えてみた。
;;----------------------------------------------------- ;; Fonts ;;----------------------------------------------------- (set-face-attribute 'default nil :family "Consolas" :height 110) (dolist (target '(japanese-jisx0212 japanese-jisx0213-2 japanese-jisx0213.2004-1 katakana-jisx0201 )) (set-fontset-font (frame-parameter nil 'font) target (font-spec :family "MeiryoKe_Gothic" :registry "unicode-bmp" :lang 'ja)))
この設定では次のような表示になる。
また、表示画面の比較的小さなノートパソコンではフルスクリーンで作業したい。以下のように設定しておくと F11 キーでフルスクリーンと通常サイズをトグルできる (cf. EmacsWiki: Full Screen)。
;;----------------------------------------------------- ;; Fullscreen ;;----------------------------------------------------- (defvar my-fullscreen-p t "Check if fullscreen is on or off") (defun my-non-fullscreen () (interactive) (if (fboundp 'w32-send-sys-command) ;; WM_SYSCOMMAND restore #xf120 (w32-send-sys-command 61728) (progn (set-frame-parameter nil 'width 82) (set-frame-parameter nil 'fullscreen 'fullheight)))) (defun my-fullscreen () (interactive) (if (fboundp 'w32-send-sys-command) ;; WM_SYSCOMMAND maximaze #xf030 (w32-send-sys-command 61488) (set-frame-parameter nil 'fullscreen 'fullboth))) (defun my-toggle-fullscreen () (interactive) (setq my-fullscreen-p (not my-fullscreen-p)) (if my-fullscreen-p (my-non-fullscreen) (my-fullscreen))) (my-toggle-fullscreen) (global-set-key [f11] 'my-toggle-fullscreen)
さて、ここからが本題。
まずは文字コード関連の設定をなるべく UTF-8 にする。
;; Setenv (setenv "LANG" "ja_JP.UTF-8") ;; 言語環境 (set-language-environment "Japanese") ;; 文字コード (set-buffer-file-coding-system 'utf-8) (set-terminal-coding-system 'utf-8) (set-keyboard-coding-system 'utf-8) (setq default-buffer-file-coding-system 'utf-8) (set-selection-coding-system 'utf-16le-dos) ;; Shell Mode (setq shell-mode-hook (function (lambda() (set-buffer-process-coding-system 'utf-8-unix 'utf-8-unix)))) ;; Grep (defadvice grep (around grep-coding-setup activate) (let ((coding-system-for-read 'utf-8)) ad-do-it)) (setq grep-find-command "find . ! -name '*~' -type f -print0 | xargs -0 lgrep -n -Au8 -Ia ")
以上の設定で Dired Mode や Shell Mode で日本語が化けず、かつなるべく UTF-8 な環境で作業できる。M-x grep-find で文字コード混在文書を検索でき、結果は UTF-8 で表示される。
例えば、次のようなファイルを sjis, euc-japan, utf-8 で三種類用意したとする。
$ cat sjis.txt % -*- coding: sjis -*- 我思う故に我あり $ cat euc.txt % -*- coding: euc-japan -*- 我思う故に我あり $ cat utf8.txt % -*- coding: utf-8 -*- 我思う故に我あり
これらのファイルを対象に NTEmacs から検索語「我」を検索すると (M-x grep-find 我)、以下のように UTF-8 で正しく結果が返ってくる。
ところが、utf8.txt の末尾に以下の一文を追加したとする。
$ cat utf8.txt % -*- coding: utf-8 -*- 我思う故に我あり cōgitō ergō sum
この場合、同様にして「cōgitō」を検索しても正しい結果が返ってこない。
単に “c” を含む文字列がヒットしている。これは NTEmacs から外部プロセスへ引数として渡せる文字列はコードページに依存するためだそうである (外部プロセスに渡せる文字列は cp932 に制限される)。
通常はあまり気にならないかもしれないが、私はインド学仏教学を専門としており、サンスクリット語やチベット語をラテン文字転写した際のアクセント付き文字 (ā,ī,ū など) が検索語に含められないと少し困る。NTEmacs から外部プロセスに渡す検索語にさえ特殊文字を含ませなければ、検索そのものや検索結果の表示自体は UTF-8 でできているので、付け焼刃ではあるが、NTEmacs からは ASCII 翻字 (Kyoto-Harvard 方式, cf. On the Transliteration of E-Texts in Sanskrit and Tibetan) で検索語を外部プロセスに渡すことにしてみた。
次のような短いスクリプト (my-grep.sh) を用意して1、
#!/bin/bash WORD=`echo $1 | sed -f /usr/local/bin/kh2utf8-sed-command` find . ! -name '*~' -type f -print0 | xargs -0 lgrep -n -Au8 -Ia $WORD
この my-grep.sh を NTEmacs の grep-find に設定する。
(setq grep-find-command "my-grep.sh ")
これで先の「cōgitō」であれば、
というように代替文字 (s/O/ō/g) で検索すると、
というように正しく結果が返ってきた。最善策が見つかるまでこれで一時しのぎをしようと思う。
NTEmacs の設定は素人にはことさらに難しい。まだまだ試行錯誤は続きそうだ…
参考
Footnotes:
1 /usr/local/bin/kh2utf8-sed-command は Encoding conversion scripts (Indica et Buddhica) のものを少し変えて利用している。
Pingback: NT-Emacsの日本語対応 | 冒険の書