マクロのDocument .Modeについて

  1. ありがたく使わせていただいてます。マクロをつくっているのですが少し行き詰まりまして。
    したかったコトは例えば、
    ○○.js.batのような二重拡張子のファイルを開いたときにマクロでJavaScriptモードにする、です。
    この例ではできはするのですが、これは環境に左右されていて「jsの拡張子に対応しているのはJavaScriptモードである」という設定されていないと、あるいは知っていないとできなかったりします。
    なんというか編集モードをコレクションで受け取って拡張子から総当りしてモードを取得しないとモードの有無や名前が掴めないのです(iniからセクション名を辿ればどうにかできるけれども)。
    汎用的なカタチにして公開したいなとおもって行き詰まりました。
    すみません、説明がへたで。
    一考願えないでしょうか、よろしくおねがいします。

     |  :e  |  返信
  2. Mery をご愛用いただきありがとうございます。

    マクロから編集モードのコレクションを受け取って拡張子から総当たりで編集モードを取得したい、ということでよろしいでしょうか?

    その場合、ご推察のとおりマクロには編集モードのコレクションや対応する拡張子を取得する機能は用意されていないので、INI ファイルから取得するかたちになると思います。

    Ver 3.2.6 以降ですと editor.ReadSettingInteger および editor.ReadSettingString で比較的簡単に INI ファイルから設定を取得できます。

    > ○○.js.batのような二重拡張子のファイルを開いたときにマクロでJavaScriptモードにする、です。

    上記の例の場合、最初に出てきた "js" の部分を拡張子と見なして JavaScript モードにする、ということでしたらこんな感じでしょうか。

    // INI ファイルから編集モードの設定を取得
    var count = editor.ReadSettingInteger("Modes", "Count", 0);
    var modes = new Array();
    for (var i = 0; i < count - 1; i++) {
    	modes.push({ "caption" : editor.ReadSettingString("Modes\\Mode" + i, "Caption", ""), "extensions" : editor.ReadSettingString("Modes\\Mode" + i, "Extensions", "") });
    }
    // 拡張子が複数ある場合は最初の拡張子を取得
    var a = document.Name.split(".");
    if (a.length > 1) {
    	for (var i = 0; i < modes.length - 1; i++) {
    		if (modes[i].extensions.split(",").indexOf(a[1]) > -1) {
    			// 編集モードを設定
    			document.Mode = modes[i].caption;
    			break;
    		}
    	}
    }

    欠点として、INI ファイルに編集モードの設定が書き込まれるのは Mery を終了したときか、[編集モードの設定] を変更したときなので、例えばインストール直後の 1 回目の起動時など、1 度も Mery を終了したことがない場合は設定を読み込むことができません。

     |  Kuro  |  返信
  3. 返信ありがとうございます。おかげでやりたい処理ができました。
    iniをよく読んでもう少し理解すべきだったと反省してます。

    先のマクロで修正箇所あったので
    i<count-1とi<modes.length-1をどちらも-1ひく必要ないです。

    ちょうどテストに使用したファイルが編集モードの最後の項目ではまってしまいました。
    あれこれ考えておもったように動いてくれるの楽しいです。
    ありがとうございました。

     |  :e  |  返信
  4. うまく動いたようで良かったです。

    > iniをよく読んでもう少し理解すべきだったと反省してます。

    INI ファイルの仕様を解析するとなると大変そうですから、お気軽にご質問いただいてかまいませんよー

    > i<count-1とi<modes.length-1をどちらも-1ひく必要ないです。
    > ちょうどテストに使用したファイルが編集モードの最後の項目ではまってしまいました。

    うは、ほんとですね、スミマセン!Delphi のクセで、つい…

     |  Kuro  |  返信
スポンサーリンク