NTEmacs 23.1 のインストール・設定

追記:2010-06-05 NTEmacs23.2がリリースされたので、新しい記事を書きました。

この記事を書いた2009-10-27のあと、IMEパッチも改善されました。

2010年6月現在では、IME関連で突然異常終了するようなこともなくなっていますよ。


テキストエディタEmacs(イーマックス)のバージョン23がリリースされた。
Unicode関連がよくなっているようなので、Windowsに導入してみる。


Windowsで動作するバイナリは、バージョン23については
Meadow   http://www.meadowy.org/meadow/

ntemacs-jp   http://ntemacsjp.sourceforge.jp/
には用意されていない。


2ちゃんねる
NTEmacs スレッド 2」http://pc12.2ch.net/test/read.cgi/software/1221125611/l50
で、日本語向け修正がされたバイナリが配布されているが、アップローダに上げてあるので、そのうちファイルがなくなるかもしれない。


http://ai11.net/2009/misc/
にファイルを再アップしておいた。

インストール


まず、以下がアプリケーション全体なので、これを展開する。
2ch-NTEmacs-thread-2-214-Si_49674.7z-emacs-23.1-binary-2.7z


次に、修正ファイルのみ含んだこれを展開して、さっきのフォルダの中に上書きコピーする。
2ch-NTEmacs-thread-2-228-He_246593.zip


'bin/runemacs.exe' のショートカットを適当なところに置く。
プロパティを開き、「リンク先」の最後に -rv と付ける。←これは背景を黒にするための設定(reverse video)なので、必要ない人はつけなくてよい。



WindowsXPの[スタート/コントロールパネル/システム/詳細設定/環境変数]で、HOME を c:\home に指定する。

c:\home に、以下の'.emacs' と '.ntemacs23' を置く。このファイルは '.'で始まるため、Windowsのメモ帳などでは作成できない。Emacsからなら作成・保存できる。


これで、NTEmacs22-jpで問題だった「確定Undo(再変換)で文字が消えるバグ http://ai11.net/2008/02/04/ 」も解消されて、常用できるようになった。


ただし、IMEで入力中に文字がずれたり大きさがおかしなことがある。
調べてみると、ずれる場合と正常な場合があった。

フォント設定

(set-default-font "Verdana-9")
(set-fontset-font (frame-parameter nil 'font)
                                    'japanese-jisx0208
                                    '("MS ゴシック" . "unicode-bmp"))

の設定でビットマップ表示だと、入力中は以下のように数ピクセル上にずれる。入力中のフォントも「MS ゴシック」ではなく「MS Pゴシック」なので、入力中は文字幅が少し狭くなっている。


(set-default-font "Terminus-12")
(set-fontset-font (frame-parameter nil 'font)
                                    'japanese-jisx0208
                                    '("小塚明朝 Pro R" . "unicode-bmp"))

の設定でビットマップ表示だと、IMEで入力中の表示だけ「MS Pゴシック」の小さいサイズで、違和感がありすぎ。


(set-default-font "M+2VM+IPAG circle-12")

の設定でアウトライン表示 (WindowsXPの「標準」アンチエイリアス) だと、IME入力中も文字サイズもフォントも正常だ。


アウトライン表示 (gdi++ Helium he081225 を使用) でも正常だ。

設定

現在の私の設定ファイルだ。

.emacs
;;; -*- mode: lisp-interaction; syntax: elisp -*-
;;     Time-stamp: <Oct 26 2009>

;; keyset
(global-set-key "\C-h" 'backward-delete-char) ;C-h as BackSpace
(global-set-key "\M-?" 'help-for-help)        ;M-? as help
(global-set-key "\C-q" 'dabbrev-expand)
;(global-set-key "\C-q" 'quoted-insert)       ;C-q original
;(global-set-key "\C-x\C-b" 'buffer-menu)


(cd "~")                            ;start on home directory
(setq-default indent-tabs-mode nil) ;When pushing [TAB], spaces are input.

;; distinguishing Emacsen
(cond
 ((and (featurep 'meadow) (= emacs-major-version 22))
  (load "~/.meadow3"))
 ((and (equal system-type 'windows-nt) (= emacs-major-version 23))
  (load "~/.ntemacs23"))
 ((and (equal system-type 'windows-nt) (= emacs-major-version 22))
  (load "~/.ntemacs22"))
 ((= emacs-major-version 23)
  (load "~/.emacs23"))
 ((= emacs-major-version 22)
  (load "~/.emacs22"))
 ((= emacs-major-version 21)
  (load "~/.emacs21"))
)
;; end of file
.ntemacs23
;; -*- mode: lisp-interaction; syntax: elisp -*-
;;     Time-stamp: <Oct 27 2009>

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 日本語環境の設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(set-language-environment "Japanese")
(set-keyboard-coding-system 'japanese-shift-jis)

;; UTF-8⇔Legacy Encoding (EUC-JP や Shift_JIS など)をWindowsで変換
;;http://nijino.homelinux.net/emacs/emacs23-ja.html
;; encode-translation-table の設定
(coding-system-put 'euc-jp :encode-translation-table
                   (get 'japanese-ucs-cp932-to-jis-map 'translation-table))
(coding-system-put 'iso-2022-jp :encode-translation-table
                   (get 'japanese-ucs-cp932-to-jis-map 'translation-table))
(coding-system-put 'cp932 :encode-translation-table
                   (get 'japanese-ucs-jis-to-cp932-map 'translation-table))
;; charset と coding-system の優先度設定
(set-charset-priority 'ascii 'japanese-jisx0208 'latin-jisx0201
                      'katakana-jisx0201 'iso-8859-1 'cp1252 'unicode)
(set-coding-system-priority 'utf-8 'euc-jp 'iso-2022-jp 'cp932)


;; フォント設定
(set-default-font "Verdana-9")
(set-fontset-font (frame-parameter nil 'font)
                                    'japanese-jisx0208
                                    '("MS ゴシック" . "unicode-bmp"))

;(set-default-font "M+2VM+IPAG circle-12")

;; IME の設定
(w32-ime-initialize)
(define-key isearch-mode-map "\C-k" 'isearch-edit-string) ; i-search に入ったとき、C-k すれば日本語が通る
(global-set-key '[non-convert] 'kkc-cancel) ; i-searchしたときquail/KKCが(勝手に起動して)終了しないので終了する
(global-set-key "\C-\\" 'quail-inactivate) ; quail/KKCが起動したとき停止

;;ime の ON/OFF でカーソルの色を変える
(set-cursor-color "snow1")
;(add-hook 'w32-ime-on-hook
;;          (function (lambda () (set-cursor-color "CornflowerBlue"))))
;          (function (lambda () (set-cursor-color "green"))))
;(add-hook 'w32-ime-off-hook
;          (function (lambda () (set-cursor-color "snow1"))))
(add-hook 'input-method-activate-hook
          (function (lambda () (set-cursor-color "green"))))
(add-hook 'input-method-inactivate-hook
          (function (lambda () (set-cursor-color "snow1"))))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 画面設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;; フレームの設定
(setq default-frame-alist
      (append (list
               ;; サイズ・位置
               '(width . 120)  ; 横幅(文字数)
               '(height . 50) ; 高さ(行数)
               '(top . 0)    ; フレーム左上角 y 座標
               '(left . 0)   ; フレーム左上角 x 座標
               )
              default-frame-alist))

; elisp変数表示のとき途中で省略しない
(setq eval-expression-print-level nil)
(setq eval-expression-print-length nil)

;; erase memubar, scrollbar
(menu-bar-mode -1)   ;画面上に出るメニュー(文字)を消す
(scroll-bar-mode -1) ;画面横に出るスクロールバーを消す
(tool-bar-mode -1)   ;画面上に出るツールバー(アイコン画像)を消す
(setq cursor-in-non-selected-windows nil)
                     ;非active windowにはカーソルを表示しない
(transient-mark-mode t)  ;選択したとき色がつくようにする

;; color
(global-font-lock-mode t)            ;font-lock use-all
;; リージョンに色をつける
(setq transient-mark-mode t)

;;; タブ, 全角スペースを表示する
;;;
(defface my-face-b-1 '((t (:background "gray15"))) nil)
(defface my-face-b-2 '((t (:background "gray26"))) nil)
(defface my-face-u-1 '((t (:foreground "SteelBlue" :underline t))) nil)
(defvar my-face-b-1 'my-face-b-1)
(defvar my-face-b-2 'my-face-b-2)
(defvar my-face-u-1 'my-face-u-1)
(defadvice font-lock-mode (before my-font-lock-mode ())
  (font-lock-add-keywords
   major-mode
   '(("\t" 0 my-face-b-2 append)
     (" " 0 my-face-b-1 append)
     ("[ \t]+$" 0 my-face-u-1 append)
     )))
(ad-enable-advice 'font-lock-mode 'before 'my-font-lock-mode)
(ad-activate 'font-lock-mode)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 動作設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; tmp file saving directory
(setq auto-save-list-file-prefix "~/local/.emacs.d/.saves-")

;; backup.file~ location
(setq make-backup-files t)
(setq backup-directory-alist
      (cons (cons "\\.*$" (expand-file-name "~/local/.emacs.d"))
            backup-directory-alist))

;; auto-insert LAST-MODIFIED-DATE
(if (not (memq 'time-stamp write-file-hooks))
    (setq write-file-hooks
          (cons 'time-stamp write-file-hooks)))
(setq time-stamp-line-limit 40)
(setq time-stamp-format "%3b %02d %:y")
(setq system-time-locale "C")

;; cc-mode
(defun my-c-mode-common-hook ()
  (c-set-style "java")
  )
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
(add-to-list 'auto-mode-alist '("\\.c\\'" . c++-mode))
(add-to-list 'auto-mode-alist '("\\.cpp\\'" . c++-mode))
(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
(add-to-list 'auto-mode-alist '("\\.pl\\'" . perl-mode))
(add-to-list 'auto-mode-alist '("\\.rb\\'" . ruby-mode))
(add-to-list 'auto-mode-alist '("\\.as\\'" . java-mode))

;; 特定の拡張子を新規作成したとき、特定の文字コードを適用する
(modify-coding-system-alist 'file "\\.as\\'" 'utf-8-with-signature-dos)
(modify-coding-system-alist 'file "\\.rb\\'" 'utf-8-unix)
(modify-coding-system-alist 'file "\\.cgi\\'" 'utf-8-unix)

;; diff
(setq diff-command "c:/home/local/msys/bin/diff.exe")
(setq diff-switches "-uw")

;; dabbrev(dynamic abbreviation)でファイル名も補完候補にする
(setq dabbrev-ignored-buffer-names '("*Messages*"))

;; beep
(setq visible-bell nil)

;; 前回編集していた場所を記憶し,ファイルを開いた時にそこへカーソルを移動
(load "saveplace")
(setq-default save-place t)

;; kill-ring はテキスト属性(色情報など)を保存しなくていい
;; http://www-tsujii.is.s.u-tokyo.ac.jp/~yoshinag/tips/elisp_tips.html#yankoff
(defadvice kill-new (around my-kill-ring-disable-text-property activate)
  (let ((new (ad-get-arg 0)))
    (set-text-properties 0 (length new) nil new)
    ad-do-it))

;; org-mode
(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
(define-key global-map "\C-cl" 'org-store-link)
(define-key global-map "\C-ca" 'org-agenda)
(setq org-log-done t)
(setq org-startup-truncated nil) ;;行の折り返し

;; URLをブラウザで開く
(setq browse-url-browser-function 'browse-url-generic
      browse-url-generic-program (w32-short-file-name "C:/Program Files/SRWare Iron/iron.exe"))


(setq inhibit-startup-message t) ;;スプラッシュ(起動画面)抑止
(buffer-menu)

;;; Local Variables:
;;; coding: utf-8-unix
;;; End:

[合いの手担当] ところで、なぜWindowsでは日本語向けEmacs23が盛り上がってないの?


[しゃべり担当] Emacs22 (Meadow3) と、それほど変わらないからだろう。Linuxではフォントのアンチエイリアスできるようになってずいぶん見た目が変わったけど、Windowsではずっと前からアンチエイリアスできてたからな…。


[合いの手担当] NTEmacs23って動作が重くない?


[しゃべり担当] いままでと比べて、軽いという感じを受けるぞ。Meadow3よりは軽いと思う。
だけどIME通して日本語入力中に、いきなり落ちることが たまにある。M-x recover-fileでなんとか救われているけど。Emacsがおちるのは、あまり経験ないから とまどうよ。


おちたときは、こんな感じ。
[いいえ]をクリックするとテキストを保存できずにEmacsが終了するし、[はい]をクリックしても、Windowsの「問題が発生したため終了します。送信しますか」ダイアログが出るだけで結局Emacsは終了する。
ところでこの画面の MEM FULL って何の意味かな?


[合いの手担当] 多少軽いだけなの? ほかにいいところはないの?


[しゃべり担当] いろいろあるぞ。

  • Unicodeテキストが扱いやすくなった。「〜」もWindows標準で保存されるし、UTF-8のBOMつきにも対応したし(utf-8-with-signature)、Emacs22は文字が化けたりして使いにくかったからなー。Emacs23でよくなった。
  • ruby-modeが標準添付になって、勝手に文字コードのマジックコメント (# -*- coding: utf-8 -*-)入れてくれて賢いし。
  • フォント設定も簡単になった。Emacs22(Meadow3除く)はフォント名に「-」が入っていると使えない問題があったが、それも解消した。

Windowsで見ても、これだけいいことがある。今後はEmacs23を使っていきたいと思うね。



入門 GNU Emacs 第3版

入門 GNU Emacs 第3版

余談


Emacs22までは、フォントの設定が難しく、思うようにいかなかった。
Emacs23ではフォントの設定が簡単になった。

Emacs23がリリースされたんだが、
Windows上で動くEmacsは開発が とまってる感じなんだ。
Meadow http://www.meadowy.org/meadow/

ntemacs-jp http://ntemacsjp.sourceforge.jp/
もバージョン23に追従してないし。

なんで とまってるんだろう。

MacOS Xに環境を移行した開発者が多いみたいだ。
私はこれからもWindows使うつもりだ。

そもそもWindowsで動くEmacsは、公式サイト http://www.gnu.org/software/emacs/ で手に入るんだ。
具体的には、
http://ftp.gnu.org/pub/gnu/emacs/windows/emacs-23.1-bin-i386.zip
Windows向けバイナリだ。
ただし、これはIMEを使った日本語入力に対応してないので、入力自体はできるんだけど、インライン入力にならない。

インライン入力って?

このように、入力してるとこと別のところに文字が表示される。