Hatena::ブログ(Diary)

Yet Another Hackadelic

2008-01-07 長兄はメガネ、三男は髪型

mmm-mode and nxml-mode

一応、font-lock以外は組み合わせて使えたのでメモ。

mmm-modeのインストール

まずはmmm-modeをダウンロードして、展開します。

$ cd /tmp
$ wget http://jaist.dl.sourceforge.net/sourceforge/mmm-mode/mmm-mode-0.4.8.tar.gz
$ tar xfz mmm-mode-0.4.8.tar.gz
$ cd mmm-mode-0.4.8

例えばWindowsでMeadowを使ってる人は環境変数EMACSが適切に指定されてないとダメなのと、恐らくC:\meadowとかにインストールされてるので、次のようにビルドします。

$ env EMACS=/cygdrive/c/meadow/bin/Meadow.exe LANG=en_EN ./configure --with-lispdir=/cygdrive/c/meadow/lisp
$ env EMACS=/cygdrive/c/meadow/bin/Meadow.exe LANG=en_EN make
$ env EMACS=/cygdrive/c/meadow/bin/Meadow.exe LANG=en_EN make install

これで多分インストール出来てるはず。

あるいはmmm-modeのmmm-*.elをC:\meadow\lispにコピーしてから、

$ cd /cygdrive/c/meadow/lisp
$ ../bin/Meadow.exe -batch -f batch-byte-compile mmm-*.el

のようにしても恐らく問題は無いと思います。

設定例

;;mmm-mode
(require 'mmm-mode)
(require 'mmm-auto)
(setq mmm-global-mode 'maybe)
(setq mmm-submode-decoration-level 0)
(mmm-add-find-file-hook)

(mmm-add-classes
 '(
   (js-script-cdata
    :submode javascript
    :face mmm-code-submode-face
    :delimiter-mode nil
    :front "<script[^>]*>[ \t\n]*<!\\[CDATA\\[[ \t]*\n?"
    :back "[ \t]*]]>[ \t\n]*</script>"
     )
   (js-script
    :submode javascript
    :face mmm-code-submode-face
    :delimiter-mode nil
    :front "<script\[^>\]*\\(language=\"javascript\\([0-9.]*\\)\"\\|type=\"text/javascript\"\\)\[^>\]*>[ \t]*\n?"
    :back "[ \t]*</script>"
    :insert ((?j js-script nil @ "<script type=\"text/javascript\">"
                 @ "\n" _ "\n" @ "</script>" @))
    )
   (js-inline
    :submode javascript
    :face mmm-code-submode-face
    :delimiter-mode nil
    :front "on\\w+=\""
    :back "\"")
   (css-style-cdata
    :submode css
    :face mmm-code-submode-face
    :delimiter-mode nil
    :front "<style[^>]*>[ \t\n]*<!\\[CDATA\\[[ \t]*\n?"
    :back "[ \t]*]]>[ \t\n]*</style>"
    )
   (css-style
    :submode css
    :face mmm-code-submode-face
    :delimiter-mode nil
    :front "<style[^>]*>[ \t]*\n?"
    :back "[ \t]*</style>"
    :insert ((?c css-style nil @ "<style type=\"text/css\">"
                 @ "\n" _ "\n" @ "</style>" @))
    )
   (css-inline
    :submode css
    :face mmm-code-submode-face
    :delimiter-mode nil
    :front "style=\""
    :back "\"")
   ))

こんな感じのをどんどん書く。付属のmmm-sample.elを見ると良いと思われます。

上手く行くと

f:id:ZIGOROu:20080108004152p:image

特定のブロックで、こんな感じになります。

現時点の問題点

上手くいってる人が居たら是非教えて欲しいんですが、

  • nxml, nxhtmlと併用するとfont-lockが消える(つまりハイライトはされない)
  • javascriptの場合は最初の行のインデントがちょっとおかしくなる。

まぁ、今まで頑張って自前でインデントしてたりした時代に比べればましなので、ここら辺にしておこうかなと。

これでXBLだとかHTCなんて言う、どうしたってモードが混在するであろうファイルの編集が少し楽になるかもしれない。

holidays-lholidays-l 2008/01/16 20:23 font-lockの件ですがpsgmlで同じことが起きてました。
http://d.hatena.ne.jp/holidays-l/20071116/p1
psgmlの差分を調べれば何か分かるかも?(めんどくさいか)

ZIGOROuZIGOROu 2008/01/19 02:05 おお、そんな記事書いてたんすね。
mmm-modeはまぁ、今回2度目くらいのチャレンジだったんですが、font-lock以前に挙動が若干怪しめですよねw

batabata 2008/02/02 00:38 うーん、まだ<script>タグとかは普通に大丈夫なんですが、
JSPやeruby などの、<% ... %> タグの場合は、nxmlがinvalid を示す
赤線を付けるんでmmmでも悲惨です。 これを誰か何とかしてくれれば
嬉しいのですがねぇ。。。

batabata 2008/02/02 00:38 うーん、まだ<script>タグとかは普通に大丈夫なんですが、
JSPやeruby などの、<% ... %> タグの場合は、nxmlがinvalid を示す
赤線を付けるんでmmmでも悲惨です。 これを誰か何とかしてくれれば
嬉しいのですがねぇ。。。

ZIGOROuZIGOROu 2008/02/02 01:25 > nxmlがinvalid を示す赤線を付けるんで

うわー。凄い分かりますw
しかし現実問題としてはそうしたモードの異なる混在テキストを我々頻繁に扱うので、何か良い解決法があるといいんですけどねぇ。

condotticondotti 2008/03/14 10:03 nxhtml-modeについているmumamo-modeではだめですか。

ZIGOROuZIGOROu 2008/03/16 02:23 > condotti

mumamo-modeは使い方が良く分かりませんでした><

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/ZIGOROu/20080107/1199720692
Connection: close