しょぼしょぼすくりぷと xyzzy > xyzzy用 mode集 > multi-major-mode

multi major mode

このページは、多数の majorモードを擬似的に共存させる 自作lispの説明ページです。

xyzzy用 modeライブラリ集をみたい人はこちらの indexページへ

multi-major-modeとは

普通メジャーモードはひとつしか設定できませんが、このモードを使うと 複数のメジャーモードを共存できます。

こんな時におすすめ

perlなどを書いているときに、コメントは 自分用にカスタマイズして設定したtext-modeで書きたい。ときとか htmlの中に javascriptがある時とか便利です。

よかったよといってくれるのは html中の javascriptや php や jspモードがある時に便利らしいです。

動作スクリーンショット

Lisp mode から カーソルを動かすと Text mode に自動的に変更 この範囲を出ると、元に戻る

ツール

multi-major-mode.l(実行ファイル)(新) / {multi-mode.l(実行ファイル)(旧)}
multi-mode-setting.l(設定ファイル例)

動作概要

複数のメジャーモードを擬似的に表現していますが、その動作はある文字列の範囲内に入っているかで 第1言語とサブ言語を切り分けています。 (機能的には、それぞれの範囲間での移動において、メジャーモードの切り替えを自動的に行います) このように、しているので、複数のメジャーモードの特徴を同時に実装するのではありません。

範囲は <!-- から --> などと指定して貰えれば良いです。 ただ、文字入力したり、境目の対象の文字列が消えるとちょっと自動では切り替えられないので、 その時は、ちょっと人間様が教えてやってください。

インデントとか、キーワードとか弱いです。

Installation:導入


1. *load-path*
が通っているところに起きます。(e.g. site-lisp/の下など)
2. byte-compile をしたいときはする
3. .xyzzy などに次を書いておく
(load-library "multi-major-mode.l")

4. 実行の仕方は
下の5の用に設定が終わっていれば 例えばlispの場合
M-x lisp-mode
と叩くだけで切り替えられます。
multi-major-modeがちゃんとマイナーで起動すると (Lisp:MULTI ...) のように表示されています。

止め方
M-x multi-mode-stop


5. 特別なメジャーモードで呼びたいときは(設定例)

(load-library "multi-major-mode.l")

;c-mode
(defun multi-c-mode ()
  (interactive)
  (multi-major-mode-start t "c-mode"
              '("/*" "*/" "text-mode")
              '("//" "\n" "text-mode")
              )
  )
(add-hook '*c-mode-hook* 'multi-c-mode)

問題点。。

本人よりよくわかっている人たちの意見も参考にどうぞ。
なるべく悩む時間が少なくなりますよーに
  • http://white.s151.xrea.com/wiki/index.php?diary%2F2007-01-14%2Fmulti-major-mode
  • http://d.hatena.ne.jp/donayama/20080218/xyzzy
問題点
  • multi-major-mode にして 第二言語の時に終了すると、そのモードが session(usr/の .xyzzy.resumu.nファイル)に保存される。
    もしかしたら以下を実行してみてなんとかなるかもしれません。
    ファイルをリネームしたときに、modeを読み直すlisp
  • # multi-modeが先頭から末尾まで属性を付けてた。 んー。相性悪いなぁ。 同じ場所に属性が複数つけれればいいのにな。
    ⇒⇒*multi-mode-text-attribute* を nilにすればテキスト属性はいじらなくなります。

    (setq *multi-mode-text-attribute* nil)

  • バッファを閉じたときのポイント位置が、バッファに関連付けられていないモード となる位置にあって、そのバッファを開き直したときに save-place.l によって、 そのポイント位置に移動することにより、*buffer-package* の値が nil になる (push '*buffer-package* *protected-local-variables*)
    ⇒⇒multi-modeはメージャーモードを呼び出しているだけなので、切り替えるたびにローカル変数などばんばん初期化します。それを防ぐためには以下の機能を使うと少し対応できるかも

    変数*protected-local-variables*のリストにローカル変数のシンボルを追加すると、そのローカル変数はkill-all-local-variablesから保護?されるようです。

  • 2 multi-mode.l http://www.afis.to/~start/xyzzy/modeIndex.html で,モード毎にいちいち設定しなくても line-comment[ \t]*begin{モード名} で モード名で指定したモードになり, line-comment[ \t]*end{モード名} で そのモードを終了するということを してくれるコード欲しい. ついでに begin-region-comment[ \t]*begin{モード名}[ \t]*end-region-comment begin-region-comment[ \t]*end{モード名}[ \t]*end-region-comment もあるといいかも. -*- Mode: モード名 -*- では登録しなくてもできてるからこっちでもできないかな.
    ⇒⇒レアな用途っぽいので、勘弁を。ちょっと時間がありませぬ。。その設定をするのであれば、M-xでモード書き換えちゃったほうが早かったりしないかな。

関連リンク

ファイルオープン時に、modeやpackageやエンコードを自動チェックする設定
*find-file-hooks*を使った mode-alistの活用例です。

バッファー保存時に、modeを見直す
buffer 系サンプルライブラリの一つです。

emacsのtrrライクなタイピングゲーム xrr
元々面白いので、xyzzyに移植しても面白い!!

関連リンク

silog - diary/2007-01-14/multi-major-mode
PHPモードと html+-modeをかけ合わせた <?php ?>の設定例です。


PukiWiki Just For Myself: xyzzy 同一ファイルでPHP-modeとHTML+-modeを同時に使用