htmlとjavascriptが1つのファイルでほぼ共存可能なxyzzyのmulti major mode

multi-major-mode.l

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

multi-major-modeとは

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

こんな時におすすめ

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

動作スクリーンショット

Lisp mode から カーソルを動かすと Text mode に自動的に変更 この範囲を出ると、元に戻る
multi-mode_before multi-mode
多数の majorモードを擬似的に共存させる(実際には、範囲を推測して、モードを自動切り替えしている)  

処理詳細概要

複数のメジャーモードを擬似的に表現していますが、その動作はある文字列の範囲内に入っているかで 第1言語とサブ言語を切り分けています。 (機能的には、それぞれの範囲間での移動において、メジャーモードの切り替えを自動的に行います) このように、しているので、複数のメジャーモードの特徴を同時に実装するのではありません。 範囲は <!-- から --> などと指定して貰えれば良いです。 ただ、文字入力したり、境目の対象の文字列が消えるとちょっと自動では切り替えられないので、 その時は、ちょっと人間様が教えてやってください。 インデントとか、キーワードとか弱いです。

Installation:導入

ツール

multi-major-mode.l(実行ファイル)(新) / {multi-mode.l(実行ファイル)(旧)} multi-mode-setting.l(設定ファイル例)
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)

問題点。。

本人よりよくわかっている人たちの意見も参考にどうぞ。 なるべく悩む時間が少なくなりますよーに 問題点
  • 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でモード書き換えちゃったほうが早かったりしないかな。
 

関連リンク

silog - diary/2007-01-14/multi-major-mode PHPモードと html+-modeをかけ合わせた <?php ?>の設定例です。 PukiWiki Just For Myself: xyzzy 同一ファイルでPHP-modeとHTML+-modeを同時に使用
Delicious にシェア
Digg にシェア
reddit にシェア
LinkedIn にシェア
LINEで送る
email this
Pocket

974 views.



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です