emacs23.1のビルド

emacs上でWindowsIMEを利用するためには、emacsIMEパッチを当ててコンパイルする必要があると知りました。
ちょっと興味があったので、emacs23.1のコンパイルを行ってみることにします。
作業の内容の殆どは、「NTEmacs 23.1 + IMEパッチ適用ビルドメモ」の通りに行っています。

ビルド環境の準備

emacsのビルドを行うために、コンパイラGNU関連のツールを導入します。

MinGWのインストール
  1. http://sourceforge.net/projects/mingw/files/ より、以下の2つをダウンロードします。
    • MinGW-5.1.6.exe
    • mingw32-make-3.80.0-3.tar.gz
  2. MinGW-5.1.6.exeを実行しインストールを行います。(インストール先 C:\MinGW
  3. mingw32-make-3.80.0-3.tar.gzを展開し、展開されたbin/mingw-make.exeを、C:\MinGW\bin以下にコピーし、既存のmingw-make.exeを上書きします。
GNUWin32関連のインストール
  1. http://gnuwin32.sourceforge.net/packages.html より、以下のComplete packageをダウンロードします。
    • coreutils-5.3.0
    • giflib-4.1.4-1
    • jpeg-6b-4
    • libpng-1.2.37
    • patch-2.5.9-7
    • tiff-3.8.2-1
    • xpm-3.5.1-1
    • zlib-1.2.3
  2. ダウンロードした各Complete Packageを実行してインストールします。
GNU EmacsIMEパッチのダウンロード
  1. http://ftp.gnu.org/pub/gnu/emacs/ より、emacs-23.1.tar.gzをダウンロードします。
  2. C:\build以下にemacs-23.1.tar.gzを展開します。
  3. http://sourceforge.jp/projects/ntemacsjp/ から、23.1用のIMEパッチ、Emacs-23.1-IME.patch.gzをダウンロードします。
  4. C:\build以下にEmacs-23.1-IME.patch.gzを展開します。
パスの追加

ビルドを行うのに、C:\MinGW\binとC:\Program Files\GnuWin32\binにパスを通しておきます。

パッチの適用

emacs23.1のソースにIMEパッチを適用します。

C:\>cd c:\build\emacs-23.1
C:\build\emacs-23.1>patch -p3 < ..\Emacs-23.1-IME.patch
patching file lib-src/makefile.w32-in
patching file lisp/loadup.el
patching file nt/configure.bat
patching file src/keyboard.c
patching file src/w32.c
patching file src/w32fns.c
patching file src/w32term.c
patching file src/w32term.h
patching file src/window.c
patching file lisp/international/w32-ime.el

emacsのビルド

1. configureを行います

C:\>cd c:\build\emacs-23.1\nt
C:\build\emacs-23.1\nt>configure --prefix=c:\emacs --cflags -I/progra~1/gnuwin32/include --ldflags -L/progra~1/gnuwin32/lib --no-opt --no-debug --enable-w32-ime --cflags -D_UNICODE --cflags -DRECONVERSION

2. makeを実行します。以下のエラーで止まります。

C:\build\emacs-23.1\nt>mingw32-make
...
...
...
mingw32-make[1]: *** No rule to make target `../lisp/international/w32-ime.elc', needed by `DOC'.  Stop.
mingw32-make[1]: Leaving directory `c:/build/emacs-23.1/lib-src'
mingw32-make: *** [all-other-dirs-gmake] Error 2

3. w32-ime.elをバイトコンパイルします。すでにインストール済みのemacsを利用します。

C:\build\emacs-23.1\nt>cd C:\build\emacs-23.1\lisp\international
C:\build\emacs-23.1\lisp\international>emacs -batch -f batch-byte-compile w32-ime.el

4. 再度、makeを実行します。

C:\build\emacs-23.1\lisp\international>cd c:\build\emacs-23.1\nt
C:\build\emacs-23.1\nt>mingw32-make

5. インストールを行います。

C:\build\emacs-23.1\nt>mingw32-make install

6. c:\emacsにインストールが行われます。

.emacsに設定を追加

IMEを利用するために、.emacsに以下のコードを追加します。

(set-language-environment "Japanese")
(w32-ime-initialize)
(setq default-input-method "W32-IME")
(setq-default w32-ime-mode-line-state-indicator "[--]")
(setq w32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]"))

auto-complete modeの設定

昨日、インストールしたauto-complete modeですが、いろいろと設定して、下記の設定に落ち着きました。

;;;
;;; auto-complete mode
;;;-----------------------------------------------------------------------------
(require 'auto-complete)
(require 'auto-complete-config)
(global-auto-complete-mode t)
(define-key ac-completing-map "\C-n" 'ac-next)
(define-key ac-completing-map "\C-p" 'ac-previous)
(setq ac-auto-start nil)
(ac-set-trigger-key "TAB")

ruby-modeのインストール

rubyでの開発用にruby-modeをインストールします。
GNU Emacs23.1のフルパッケージ版には、デフォルトでemacs\lisp\progmodesにruby-modeが入っています。
これに、インストールしたrubyモジュールに含まれている、ruby\doc\ruby\ruby-1.8.6\misc内のlispコードを追加します。
まず、ruby\doc\ruby\ruby-1.8.6\misc内のlispコードをバイトコンパイルします。

cd ruby\doc\ruby\ruby-1.8.6\misc
emacs -L . -batch -f batch-byte-compile *.el

作成された、*.elcファイルをemacs\site-lisp\rubyに移動します。
.emacsに以下を追記します。

;;;
;;; Ruby Modeの設定
;;;-----------------------------------------------------------------------------
;; load ruby-mode
(autoload 'ruby-mode "ruby-mode"
  "Mode for editing ruby source files" t)
(setq auto-mode-alist
      (append '(("\\.rb$" . ruby-mode)) auto-mode-alist))
(setq interpreter-mode-alist (append '(("ruby" . ruby-mode))
				     interpreter-mode-alist))
;; load inf-ruby
(autoload 'run-ruby "inf-ruby"
  "Run an inferior Ruby process")
(autoload 'inf-ruby-keys "inf-ruby"
  "Set local key defs for inf-ruby in ruby-mode")
(add-hook 'ruby-mode-hook '(lambda () (inf-ruby-keys)))

;; ruby-electric
(require 'ruby-electric)
(add-hook 'ruby-mode-hook '(lambda () (ruby-electric-mode t)))

バッファ内補完機能 auto-complete.el

もともと、gvimを使っていたのですが、gvimでは編集ファイル内にある語句で補完することが可能です。小さな規模のスクリプトを書くことが多いので、ctagsを利用するまでもないので、この機能には重宝していました。

emacsでも同様の機能がないのかと探していたところ、最近、auto-complete.elというlispモジュールがリリースされていました。
http://d.hatena.ne.jp/m2ym/20091130/1259572347

早速インストールして使ってみました。
とってもイイ感じで動いています。

Emacsサーバのセットアップ

Emcasのサーバを利用するためのセットアップを行いました。

まず、以下の環境変数を登録します。

 HOME=d:\home
 ALTERNATE_EDITOR=%HOME%\emacs\bin\runemacs.exe
 EMACS_SERVER_FILE=%HOME%\.emacs.d\server\server

.emacsに以下の行を追加します。

(server-start)

emacsを起動するとエラーがでました。

Warning (initialization): An error occurred while loading `d:/home/.emacs':
 
error: The directory d:/home/.emacs.d/server is unsafe
 
To ensure normal operation, you should investigate and remove the
cause of the error in your initialization file.  Start Emacs with
the `--debug-init' option to view a complete error backtrace.

unsafeとあるので、権限関係なのでしょうか?
とりあえず、メッセージに記述がある通り、--debug-initで再度emacsを起動しました。
以下のトレースバックが表示されました。

Debugger entered--Lisp error: (error "The directory d:/home/.emacs.d/server is unsafe")
  signal(error ("The directory d:/home/.emacs.d/server is unsafe"))
  error("The directory %s is unsafe" "d:/home/.emacs.d/server")
  server-ensure-safe-dir("d:\\home\\.emacs.d\\server\\")
  server-start()
  eval-buffer(#<buffer  *load*> nil "d:/home/.emacs" nil t)  ; Reading at buffer position 3225
  load-with-code-conversion("d:/home/.emacs" "d:/home/.emacs" t t)
  ...
  ...
  ...

server.elの以下の関数でエラーがとなっているようです。

(defun server-ensure-safe-dir (dir)
  "Make sure DIR is a directory with no race-condition issues.
   Creates the directory if necessary and makes sure:
   - there's no symlink involved
   - it's owned by us
   - it's not readable/writable by anybody else."
  (setq dir (directory-file-name dir))
  (let ((attrs (file-attributes dir)))
    (unless attrs
      (letf (((default-file-modes) ?\700)) (make-directory dir t))
      (setq attrs (file-attributes dir)))
    ;; Check that it's safe for use.
    (unless (and (eq t (car attrs)) (eql (nth 2 attrs) (user-uid))
                 (or (eq system-type 'windows-nt)
                     (zerop (logand ?\077 (file-modes dir)))))
      (error "The directory %s is unsafe" dir))))

関数を評価しながら確認したところ、以下の部分でチェックに引っかかっていました。

(eql (nth 2 attrs) (user-uid))

EMACS_SERVER_FILEでしていたserverディレクトリの権限ユーザがuser-uidとは違うようです。
そこで、このserverフォルダの権限を確認したところ、ログオンしているユーザではなくグループが登録されていました。一旦、フォルダのユーザをすべて削除して、ログオンユーザを登録しました。その後、emacsを起動するとエラーが出ずに起動しました。

あとは、コンテキストメニューの右クリックでEmacs編集メニューが表示されるよう、以下のレジストリを登録しました。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\emacs]
@="Edit with emacs(&A)"

[HKEY_CLASSES_ROOT\*\shell\emacs\command]
@="d:\\home\\emacs\\bin\\emacsclientw.exe \"%1\""

これで、編集したいファイルを右クリックしてコンテキストメニューから、既に起動済みのemacsで開くことができます。

追記

他の環境では、フォルダの権限を変更してもエラーが解消されませんでした。
とりあえず、server.elの

(eql (nth 2 attrs) (user-uid))

コメントアウトすることで、とりあえず起動しています。