EmacsでPHP環境を整えてみる

元々、PHPJavaRubyJavascriptもHTMLやらCSSまで全部Eclipseでを使って書いてきたんですが、
アシアルぶろぐさんのPHP開発で追加しておきたいEmacs Lisp 8選を見て、うおー、Emacsで書いてみたいなーと思い、参考にして環境を整えてみました。
Emacsは触れるけど設定が良くわかんない初心者なので結構苦戦しました。

とりあえず必要そうなものを全部取ってくる

# php-mode
wget http://jaist.dl.sourceforge.net/sourceforge/php-mode/php-mode-1.2.0.tgz
tar xfvz php-mode-1.2.0.tgz
cp php-mode.el /usr/share/emacs/site-lisp/

# phpマニュアル
wget http://jp.php.net/get/php_manual_ja.tar.gz/from/this/mirror
tar xfvz php_manual_ja.tar.gz
mkdir -p /usr/local/share/php/doc/
cp -r html /usr/local/share/php/doc/

# css-mode
wget http://www.garshol.priv.no/download/software/css-mode/css-mode.el
cp css-mode.el /usr/share/emacs/site-lisp/

# javascript-mode
wget http://web.archive.org/web/20060321004800/http://web.comhem.se/~u83406637/emacs/javascript.el
cp javascript.el /usr/share/emacs/site-lisp/

# mmm-mode
wget http://jaist.dl.sourceforge.net/sourceforge/mmm-mode/mmm-mode-0.4.8.tar.gz
tar xfvz mmm-mode-0.4.8.tar.gz
mkdir /usr/share/emacs/site-lisp/mmm-mode
cd mmm-mode-0.4.8
cp mmm-mode-0.4.8/*.el /usr/share/emacs/site-lisp/mmm-mode

# Mule-UCS
wget http://www.meadowy.org/~shirai/elisp/mule-ucs.tar.gz
tar xfvz mule-ucs.tar.gz
mkdir -p /usr/share/emacs/site-lisp/Mule-UCS
cd mule-ucs-20061127-1/
emacs -q --no-site-file -batch -l mucs-comp.el
cp -r lisp/* /usr/share/emacs/site-lisp/Mule-UCS/

# svn
wget http://www.xsteve.at/prg/emacs/psvn.el
cp psvn.el /usr/share/emacs/site-lisp/

# ElScreen
wget ftp://ftp.morishima.net/pub/morishima.net/naoto/ElScreen/elscreen-1.4.5.tar.gz
tar xfvz elscreen-1.4.5.tar.gz
cp elscreen-1.4.5/elscreen.el /usr/share/emacs/site-lisp/

php-modeのコンパイル

参考にしたサイトで結構やっていたのでマネして、Emacs上でコンパイルしておく。
M-x : byte-compile-file
Byte compile file: /usr/share/emacs/site-lisp/php-mode.el

上手く動かない。

ElScreenが動かない。

elscreen.elの(require 'alist)の部分で、alistが無いよと怒られる。
alistって何?と思って調べるとAPELというライブラリに入ってるっぽいので拾ってくる。

wget http://kanji.zinbun.kyoto-u.ac.jp/~tomo/lemi/dist/apel/apel-10.7.tar.gz
mkdir /usr/share/emacs/site-lisp/apel
cp apel-10.7/* /usr/share/emacs/site-lisp/apel/
PHPの関数補完がうまくいかない

php-manual-path上に、htmlマニュアルを置いておけば「M-Tab」で補完ができるらしんだけど上手くいかない。
visit-tags-tableが〜〜とか言われて、etagsを読み込んでくれと言われる。
http://ww1.netzologie.de/php/phpeditor-emacs.php にetagsがupされていたので貰う。感謝。

wget http://ww1.netzologie.de/php/dateien/phpetags.zip
unzip phpetags.zip
mv phpetags /usr/local/share/php/etags

結局htmlの方は使わないことに。

.emacs 修正

いろいろ悩んで最終的にできた.emacs
ElScreenは「C-z」がGNU Screenとかぶったので、どうやって共存させるんだろー?と思いつつ結局保留。*1
後、puttyから使うと「M-Tab」がWindowsの表示切替になって使えなかったので、「M-j」にしてみた(どこかで見た)。

;; Mule-UCS
(require 'un-define)
;; 起動が遅すぎたのでとりあえずjisx0213は外してみた
;;(require 'jisx0213)
(set-language-environment "Japanese")
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-clipboard-coding-system 'utf-8)

;; global
(global-font-lock-mode t)
(require 'font-lock)

;; php-mode
(autoload 'php-mode "php-mode")
(setq auto-mode-alist
      (cons '("\\.php\\'" . php-mode) auto-mode-alist))
(setq php-mode-force-pear t)
(add-hook 'php-mode-user-hook
	  '(lambda ()
	     (define-key php-mode-map "\M-j" 'php-complete-function)
	     (define-key php-mode-map "\C-m" 'newline-and-indent)
	     (c-toggle-auto-hungry-state 1)
	     (setq php-manual-path "/usr/local/share/php/doc/html")
	     (setq php-manual-url "http://www.phppro.jp/phpmanual/")
	     (setq tags-file-name "/usr/local/share/php/etags/TAGS")))

;; css-mode
(autoload 'css-mode "css-mode")
(setq auto-mode-alist
      (cons '("\\.css\\'" . css-mode) auto-mode-alist))
(setq cssm-indent-function #'cssm-c-style-indenter)
(add-hook 'css-mode-hook
	  '(lambda ()
	     (define-key cssm-mode-map (read-kbd-macro "M-j") 'cssm-complete-property)))

;; javascript-mode
(add-to-list 'auto-mode-alist (cons "\\.js\\'" 'javascript-mode))
(autoload 'javascript-mode "javascript" nil t)
(setq js-indent-level 4)

;; MMM-mode
(require 'mmm-auto)
(setq mmm-global-mode 'maybe)
(setq mmm-submode-decoration-level 2)
(set-face-bold-p 'mmm-default-submode-face t)
(set-face-background 'mmm-default-submode-face "black")
(mmm-add-classes
 '((embedded-css
    :submode css-mode
    :front "<style[^>]*>"
    :back "</style>")))
(mmm-add-mode-ext-class nil "\\.html\\'" 'embedded-css)

;; Subversion
(autoload 'svn-status "psvn" nil t)

;; ElScreen
(require 'elscreen)
(if window-system
    (define-key elscreen-map "\C-z" 'iconify-or-deiconify-frame)
  (define-key elscreen-map "\C-z" 'suspend-emacs))

とりあえず動いたよ!ってレベルでしか確認してないので、今後ドンドン改良していこう。
それにしてもEmacsの設定は難しい…。

*1:コメント欄で教えていただきました。ありがとうございます。