emacs23.1のビルド
emacs上でWindowsのIMEを利用するためには、emacsにIMEパッチを当ててコンパイルする必要があると知りました。
ちょっと興味があったので、emacs23.1のコンパイルを行ってみることにします。
作業の内容の殆どは、「NTEmacs 23.1 + IMEパッチ適用ビルドメモ」の通りに行っています。
ビルド環境の準備
emacsのビルドを行うために、コンパイラやGNU関連のツールを導入します。
MinGWのインストール
GNUWin32関連のインストール
- http://gnuwin32.sourceforge.net/packages.html より、以下のComplete packageをダウンロードします。
- ダウンロードした各Complete Packageを実行してインストールします。
GNU EmacsとIMEパッチのダウンロード
- http://ftp.gnu.org/pub/gnu/emacs/ より、emacs-23.1.tar.gzをダウンロードします。
- C:\build以下にemacs-23.1.tar.gzを展開します。
- http://sourceforge.jp/projects/ntemacsjp/ から、23.1用のIMEパッチ、Emacs-23.1-IME.patch.gzをダウンロードします。
- 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にインストールが行われます。
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)))
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))
をコメントアウトすることで、とりあえず起動しています。
lispコードの実行
M-:と入力しミニバッファ上でlispコードが実行できます。