Google Code Prettify

2010年5月6日

NTEmacs 23.1.Xを使ってみる

Windowsの定番は Meadowであり、今でも十分安定している。 ただ、ベースにしてるのが Emacs 22系なので、ちょっと新しくないかなぁ。。。

今日では本家EmacsでもWindows版バイナリを配布している。Windows特有のInstallerが使いたければ、EmacsW32から入手できる。

結構、安定して使える。かつ、アイコンが奇麗だ。。。

本家バイナリはネイティブのIMEのサポートが弱い気がする。。。と思ったら、有志によってIMEのinlineパッチも作成されいる。また、 VCSの新し目のタグに有用なパッチを当てたバイナリも「NTEmacs Build History 」から入手できる。

なので有り難く使わせてもらいます。
らくちんだ。

設定

NTEmacs内部ではWin32のA系の呼び出し(ファイルI/Oやプロセス生成など)が使われるっぽいので、 現在の言語環境でのコードページに合わせなければ、奇妙な文字化けが発生する。 つまり、ファイル名とコマンド引数(processのdecoding)のcodingは shift_jis/cp932 じゃないとまずい。

と思うのだが、誰か大層語ってくれる人が見当たらないので、本当のところはさっぱり分かりません。。。

なので、「Cygwin 1.7でUTF-8サポートされたぜ!いぇーい!今時は UTF-8 ですが何か?」とは、口が裂けても言えない。。。僕は恨めしくshift_jis/cp932で使いますよ。。。へたれですから。。。

上のサイトや他多数をちょっと参考にして、今現在の次のようにしている。今でもチマチマ書き換えているのでそのうちgithubで晒しとくかなぁ。。。

Homeディレクトリの指定

ホームディレクトリ指定を環境変数HOMEで与える必要があり、Cygwinでのホームディレクトリと同じにすると混乱せずに済む。

Cygwin 1.7と組み合わせる設定

03cygwin.el

IMEの設定 (04ime.el)
;; 日本語入力を賢くしたい
;; GNU/Linux で egg-anthy を使う設定
(if (eq system-type 'gnu/linux)
(set-language-info "Japanese" 'input-method "japanese-anthy"))
;; Cocoa inline_path 対応
(if (featurep 'ns)
(set-language-info "Japanese" 'input-method "MacOSX"))
;; NTEmacs IME 対応
(when (featurep 'w32-ime)
;; W32-IME の初期化
(setq-default w32-ime-mode-line-state-indicator "[--]")
(setq w32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]"))
(dolist (args '((y-or-n-p nil nil) (yes-or-no-p nil nil)
(universal-argument t nil) (read-string nil nil)
(read-from-minibuffer nil nil) (read-key-sequence nil nil)
(map-y-or-n-p nil nil) (read-passwd t t)))
(apply 'wrap-function-to-control-ime args))
(setq w32-ime-on-cursor-color "blue")
(setq w32-ime-off-cursor-color "black")
(add-hook 'w32-ime-on-hook
'(lambda () (set-cursor-color w32-ime-on-cursor-color)))
(add-hook 'w32-ime-off-hook
'(lambda () (set-cursor-color w32-ime-off-cursor-color)))
(add-hook 'minibuffer-setup-hook
'(lambda ()
(if (ime-get-mode)
(set-cursor-color w32-ime-on-cursor-color)
(set-cursor-color w32-ime-off-cursor-color))))
(w32-ime-initialize)
(set-language-info "Japanese" 'input-method "W32-IME"))
view raw 04ime.el hosted with ❤ by GitHub
言語設定 (05lang.el)
;;
;; 日本語環境で UTF-8 をメインにする設定
;;
;; 日本語環境
(set-language-environment 'Japanese)
(cond
;; Windows系で対応
((memq system-type '(cygwin windows-nt))
(prefer-coding-system 'shift_jis-dos)
;;(prefer-coding-system 'cp932-dos)
;;(prefer-coding-system 'utf-8-unix)
;; NTEmacs内部ではWin32のA系の呼び出しが使われるっぽいので、
;; 現在の言語環境でのコードページが固定で使われるのかぁ?
;; locale-coding-system 以外では文字化けは避けられないと思う。
(when locale-coding-system
;; ファイル名はロケール依存
(setq default-file-name-coding-system locale-coding-system)
;; IMEパッチで必要らしい。
(set-keyboard-coding-system locale-coding-system))
)
;; UTF8サポートありならば、優先してUTF-8を使う
((memq 'utf-8 coding-system-list)
(prefer-coding-system 'utf-8-unix)
(setenv "LANG" "ja_JP.UTF-8")
)
)
;; 常に新規ファイルは utf-8-unix を使いたい
(if (memq 'utf-8 coding-system-list)
(setq-default buffer-file-coding-system 'utf-8-unix))
;;
view raw 05lang.el hosted with ❤ by GitHub
VCS系の設定

cygwinのsubversionやgitを使う場合、ログメッセージが文字化けするので、ちょっと設定が必要。。。

;;
;; VCS (PCL-CVS/PSVN/etc) の設定
;;
;; VCは自動的にリンクを辿って、かわりに本当のファイルを訪問
(setq vc-follow-symlinks t)
;; VC-DIR を PCL-CVS -status に近づける
(when (>= emacs-major-version 23)
(add-hook 'vc-dir-mode-hook
'(lambda ()
(define-key vc-dir-mode-map "a" 'vc-register)
(define-key vc-dir-mode-map "c" 'vc-next-action)
)))
;; for CVS
(setq cvs-diff-flags '("-u"))
;; for Subversion
(when (locate-library "psvn")
(autoload 'svn-status "psvn" nil t))
(setq svn-status-hide-unmodified t)
;; for Git / git-coreのcontribにある
(when (locate-library "git")
(autoload 'git-status "git" nil t)
(autoload 'git-blame-mode "git-blame" nil t))
;; for MaGit
(when (locate-library "magit")
(autoload 'magit-status "magit" nil t))
;; for Subversion
;; サーバ内部ではログメッセージの文字コードはUTF-8になってる。
;; なので、Windowsでクライアント等のASCII/UTF-8の文字コード以外の場合、
;; Subversionに文字コードを教える必要(コマンドスイッチ)がある。
;; なぜかコマンド引数のエンコードは、coding-system-for-write
;; または default-process-coding-system の decoding で変換される。
(when (eq system-type 'windows-nt)
(cond
;; SJISロケール
((not my-prefer-utf8-for-cygwin)
;; vc-svn.el用
(setq vc-svn-checkin-switches '("--encoding" "Shift_JIS"))
;; psvn.el 用
(setq svn-status-default-commit-arguments '("--encoding" "SJIS"))
(setq svn-status-svn-process-coding-system 'shift_jis)
(setq svn-status-svn-file-coding-system 'shift_jis)
)
;; UTF8
(t
;; vc-svn.el 用
(defadvice process-file
(around my-process-file)
(let ((coding-system-for-write 'shift_jis)) ;; ここが一番分からん
ad-do-it))
(defadvice vc-svn-checkin
(around my-vc-svn-checkin activate)
(ad-activate-regexp "my-process-file")
ad-do-it
(ad-deactivate-regexp "my-process-file"))
;; 今現在の環境(Cygwn1.7.4/LANG=ja_JP.UTF-8)では、
;; なぜかこれだけが上手くいくなぜ?
;; だれが SJIS->UTF8への変換を行っているのか?
;;
;; psvn.el 用
(setq svn-status-svn-process-coding-system 'utf-8)
(setq svn-status-svn-file-coding-system 'utf-8)
)
)
;; vc-git.el 用 (vc-git-checkin自体が小さいので置き換えた、、、)
(defadvice vc-git-checkin
(around my-vc-git-checkin activate)
(let ((files (ad-get-arg 0))
(comment (ad-get-arg 2))
(fname (make-temp-file "vc-git-")))
(let ((buffer-file-coding-system 'utf-8-unix))
(with-temp-file fname (insert comment)))
(vc-git-command nil 0 files "commit" "-F" fname "--only" "--")
(delete-file fname)
))
)
;; もう少し整理できそうなんだが、、、
view raw 50vcs.el hosted with ❤ by GitHub

、、、VC-xx.elの実装では、ログメッセージはコマンド引数で受け渡されるようになっている。 一時ファイル経由で無いとWindowsではバケバケになるのだが。。。そのうち直るのかなぁ

まとめ

あと大事な Font 設定ですね。。。次回で。

0 件のコメント:

久しぶりの投稿

かなり期間が空いてしまったが、ブログを再開してみようと思う。 2013年3月が直前の投稿だったが、頻繁に更新していた時期が 2011年11月までなので、8年間ぶりとなる。 8年間なにをしていたのかと言えば、2回転職して未だにIT技術者の職を得ている。 その...