MMM-mode 導入時のメモ

どうもいっす。
javascript の勉強はじめました。
初めて2日目にして,html の中にjavascriptを書くと,
そりゃ当然シンタクスハイライトしてくれないことに気付く。
なので,環境を整えましょうという狙い。

環境

multi-mode を試すが,挫折。

mmmに比べて,更新日時が新しかったので,最初にこっちを入れてみた。
結果は惨敗。
サンプルのphp-htmlは半分くらいの完成度で動作しているが,
使えそうもない。
javascript用に設定してみたが,1割くらいの完成度で動作している。
つまり,使い物にならん。使い物にならんのは,ワタシのテクなしのせいでしょう。
おそらく。

なので,MMM-mode をチョイス

目標は,javascriptの所では,js2-mode。htmlのところでは,html-helper-mode。
cssとかxhtml?とかは必要になったら設定する予定。

注意。

Meadow の人は,MMM-mode は最初から付属しているので,
わざわざインストールする必要なっしんぐです。
なので,以下のダウンロードからインストールは無視するのがよろし。

ダウンロードして配置しましょう。

メインページ。
http://mmm-mode.sourceforge.net/

以下のぺージからダウンロード。
http://sourceforge.net/projects/mmm-mode/

適当なディレクトリで伸張。

% tar xzvf mmm-mode-0.4.8.tar.gz
# ...いっぱい。
% cd mmm-mode-0.4.8

% EMACS=meadow ./configure
# ...いっぱい。

% make
# ...いっぱい

# できあがり
% ls --format=vertical
AUTHORS       acinclude.m4   mmm-auto.el     mmm-mode.el     mmm-utils.el
COPYING       aclocal.m4     mmm-auto.elc    mmm-mode.elc    mmm-utils.elc
ChangeLog     config.log     mmm-class.el    mmm-noweb.el    mmm-vars.el
FAQ	      config.status  mmm-class.elc   mmm-noweb.elc   mmm-vars.elc
INSTALL       configure      mmm-cmds.el     mmm-region.el   mmm.info
Makefile      configure.in   mmm-cmds.elc    mmm-region.elc  mmm.info-1
Makefile.am   elc-stamp      mmm-compat.el   mmm-rpm.el      mmm.info-2
Makefile.in   elisp-comp     mmm-compat.elc  mmm-rpm.elc     mmm.texinfo
NEWS	      install-sh     mmm-cweb.el     mmm-sample.el   script
README	      mdate-sh	     mmm-cweb.elc    mmm-sample.elc  stamp-vti
README.Mason  missing	     mmm-mason.el    mmm-univ.el     texinfo.tex
TODO	      mkinstalldirs  mmm-mason.elc   mmm-univ.elc    version.texi
  • マニュアルをコピーしておきましょう。

info パスが通っている場所へinfoをコピーしておきます。
(てか,この3つのファイルだけでいいんだろうか?)

% cp mmm.*info* /usr/local/share/info

# ちゃんと見られるかお試し。
% info mmm

Meadow 内からも確認しておくといいと思うよ。

  • 本体を配置。

の前に,大変なことに気付いた。
Meadow には最初からmmm-modeが付いてきている!!
packages/lisp/mmm-mode にある!!
あわてない,あわてない。
おかしいとおもったんだよね。
info のエントリを追加していないのに見れるのは。

% mkdir ~/.emacs.d/mmm-mode

% cp *.elc ~/.emacs.d/mmm-mode


というわけで,Meadow の人はここまでの手順は踏まないようにしましょう。

気付いた

どうもうまくいかんなぁと思って,ググっていたら,見つけた。
というか,js2.el に書いてあった。
対象部分を引用します。

;; Notes:
;;; 一部省略
;; This mode does not yet work with "multi-mode" modes such as mmm-mode
;; and mumamo, although it could possibly be made to do so with some effort.
;; This means that js2-mode is currently only useful for editing JavaScript
;; files, and not for editing JavaScript within <script> tags or templates.

オレオレ翻訳をすると,

js2-mode は,まだ,mmm-mode や mumamo などの"マルチモード"と共存できません。
けど,頑張れば,動かんこともないかも。
つまり,js2-mode は,今のところ,JavaScript ファイル(要するに,.js ファイル)内で,
javascriptを書くときのみに有用であって,scriptタグやらテンプレート内で
javascriptを編集するのには,有用ではありませんよっと。

となります。
ガーン。
確かに動かそうとすると,失敗するし,syntax error というメッセージが
エコーエリアに表示されまくる。どこから来ているかはわからんが,
js2関係ということは確かだと思われます。

目標変更

mmm-mode を使って,scriptタグ内のjavascriptの編集には,
Karl Landstrom さん作の,javascript.el (javascript-mode) を使うことにします。

ダウンロード

下記URLから。
http://www.brgeight.se/downloads/emacs/javascript.el


ほいで,load-path が通っているところに配置しましょう。
ワタシは,~/.emacs.d です。

.emacs に設定を書きましょう。

まず,javascript-mode (javascript.el) 用。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; javascript-mode
;; javascript.el
;; http://www.brgeight.se/downloads/emacs/javascript.el
;; Just intended to be used in mmm-mode.
(autoload 'javascript-mode "javascript" nil t)

(defun my-javascript-mode-hook-func ()
  (interactive)
  "Hook function for javascript-mode."
  (setq indent-tabs-mode nil)
  (setq javascript-indent-level 2)
  (local-set-key "\C-i" 'javascript-indent-line))

(add-hook 'javascript-mode-hook 'my-javascript-mode-hook-func)

まだまだ,\C-j の挙動とか,インデントの問題とか,スタイルの問題とか
あるけど,細かいところは後から足していく予定。
関数にしておくとこういう場合にも対応できるのでいいよね。


続いて,mmm-mode用。
これについては,マニュアルをささっと読んだけどもひとつ分からん。
実は,昔,phpのバイトをしていたときに使っていたのですが,
そんな時の記憶はとっくに消去されています。(oi
加えて,当時は,elisp についてまったくわかってなかったし。
ま,いいや。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MMM-mode
(require 'mmm-mode)

;; マニュアルによると,maybe が useful らしいけど
;; 頻繁に使わないので,手動でオンにすることにする。
;; 手動でオンにするのは,M-x mmm-mode-on。
(setq mmm-global-mode nil)
;; 0, 1, or 2。詳細は,M-x describe-variable mmm-submode-decoration-level。
;; 0 にしておけば,対象モードのバックグラウンドの色が変わらない。
(setq mmm-submode-decoration-level 0)

;; javascript embedded in html
(mmm-add-classes '((html-javascript
                    :submode javascript-mode
                    :front "^<script.*javascript.*>$"
                    :back "^</script>$")))
(mmm-add-mode-ext-class nil "\\.html$" 'html-javascript)


とりあえず,これだけで動くことを確認しました。
ひつこいようですが,細かいところはこれからon demandで追加していく予定。

試してみよう! スクリーンショットです
  • 素の状態(html-helper-mode)

  • mmm-mode をオンの状態。

モードラインに注目。ちゃんとMMMが表示されているね。

  • scriptタグに入って編集した状態。

シンタクスハイライトも効いているっぽいね。
モードラインにも,Javascriptとひょうじされているしね。

まとめ

  • MMM-mode と js2-mode.el はそのままでは共存できない。
  • htmlのsciprt内で,javascriptを書くのには,javascript-modeを使う。

お疲れ様でした。

お疲れちゃん!!

どうやら,js2-modeはインデントスタイルとか固定だよ,みたいなのを
見つけたので,もしかしたら,javascriptオンリの編集の際も,
javascript-modeを使用するかもね〜。