日向夏特殊応援部隊

俺様向けメモ

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

例えばWindowsMeadowを使ってる人は環境変数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を見ると良いと思われます。

上手く行くと

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

現時点の問題点

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

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

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

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