マクロメニュー

提供: MeryWiki
ナビゲーションに移動 検索に移動

標準メニューバーの「マクロ(M)」には表示されないマクロを含めて、「マクロのカスタマイズ」に登録済みのすべてのマクロをポップアップメニューで表示します。

  • 通常では非表示扱いのマクロは、「非表示マクロ」サブメニュー内に表示します。
  • マクロ名はファイル名で表示します(各ソースコード内の #title="Hoge" を読みこみません)。
※ ファイル名 「1 マクロ1.js」 「2.マクロ2.js」 「3_マクロ3.js」 「4. マクロ4.js」 などの先頭の連番部分と拡張子をポップアップメニュー上に表示させないように設定できるので、通常のマクロメニューと同じような状態にできます。
  • 各マクロの実体ファイルの親フォルダ名を表示できます。
  • [選択] や [これを選択] で登録したマクロがメニューに表示されない場合は、 [カスタマイズ] ダイアログを開いて OK ボタンで確定すると表示されるようになります。


ソースコード[編集]

ダウンロード >> 「ファイル:マクロメニュー.zip」(アイコン入り)
#title = "マクロメニュー..."
#tooltip = "全マクロをポップアップメニュー表示"
#icon = "script_with_lines+.ico"

/**
 * 非表示マクロを含めて全ての登録済みマクロをポップアップメニューで表示する。
 * 
 * ※ マクロ名はファイル名で表示(各ソースコード内の #title を読みこまない)。
 * ※ ファイル名 「1 マクロ1.js」 「2.マクロ2.js」 「3_マクロ3.js」 「4. マクロ4.js」 の
 *    先頭の連番部分と拡張子をポップアップメニュー上に表示させないようにできる。
 * ※ [選択] や [これを選択] で登録したマクロがメニューに表示されない場合は、
 *    [カスタマイズ] ダイアログを開いて [ OK ] ボタンで確定すると表示されるようになる。
 */

// ---------- ▼ 設定項目 ▼ ---------- //

// ■ ポップアップメニューを表示する位置
var menuPosMouse = true;	// (true: マウス位置 / false: キャレット位置)

// ■ 各マクロの親フォルダ名を表示する
var showParentFolderName = false;	// (true: 表示する / false: 表示しない)

// ■ 各マクロの拡張子を表示しない(※ファイル名先頭の連番部分も表示しない)
var trimExtension = false;			// (true: 表示しない / false: 表示する)

// ---------- ▲ 設定項目 ▲ ---------- //


// ポップアップメニューを表示
var r = MacroMenu( showParentFolderName, trimExtension ).Track( menuPosMouse );
if ( r > 0 ) {
  // マクロを実行
  editor.ExecuteCommandByID( r );
}


function MacroMenu( showParent, trimExt ) {
  var start = new Date();
  var menu = CreatePopupMenu();

  // Mery.ini のパス
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  var WshShell = new ActiveXObject( "WScript.Shell" );
  var meryPath = editor.FullName;
  var meryDir = Fso.GetParentFolderName( meryPath ) + "\\";
  var meryName = Fso.GetBaseName( meryPath );
  var meryDirName = Fso.GetBaseName( meryDir );
  var iniPath = meryDir + meryName + ".ini";
  if ( ! Fso.FileExists( iniPath ) ) {
    iniPath = WshShell.SpecialFolders( "APPDATA" )
            + "\\Mery\\" + meryName + ".ini";
  }

  // Mery.ini からデータを取得
  var Adodb = new ActiveXObject( "ADODB.Stream" );
  var adTypeText = 2,  adReadAll = -1;
  Adodb.Type = adTypeText,  Adodb.Charset = "UTF-8";
  Adodb.Open();
  Adodb.LoadFromFile( iniPath );
  var iniText = Adodb.ReadText( adReadAll );
  Adodb.Close();

  // マクロのパスを抽出
  var reg1 = /\r\n\[Macros\\Macro\d+\]\r\nFileName=[^\r\n]+\r\nVisible=\d/g;
  var macroArray = iniText.match( reg1 ) || [];
  var mcCount = macroArray.length;
  if ( mcCount ) {
    var invisible = false;
    var reg2 = /\r\nFileName=([^\r\n]+)\r\n/;
    for ( var i = 0, len = mcCount; i < len; i ++ ) {
      macroArray[i] = [ reg2.exec( macroArray[i] )[1], macroArray[i].slice( -1 ) ];
      if ( ! invisible && macroArray[i][1] == "0" ) { invisible = true; }
    }

    // マクロのファイル名一覧を列挙(非表示マクロをサブメニュー化)
    if ( invisible ) {
      menu.AddPopup( "非表示マクロ(&J)", smMenu = CreatePopupMenu() );
      menu.Add( "-----", 0, meMenuSeparator );
    }
    var reg3 = /(?:[^\\]+?\\)*?(?:([^\\]+)(?:\\))?([^\\]+)$/;
    var reg4 = /([^\/]*\/ )?(?:\d+[._ ]+)?([^\/]+)(?:\.[^.]+?)$/;
    var id,  num,  label,  j = 0,  k = 0;
    var mcWidth = ( "" + mcCount ).length;
    for ( var i = 0; i < mcCount; i ++ ) {
      id = i + 6144;
      label = ( showParent )
            ? macroArray[i][0].replace( reg3, "$1/ $2" )
            : /([^\\]+)$/.exec( macroArray[i][0] )[1];
      if ( label.charAt( 0 ) == "/" ) { label = meryDirName + label; }
      // ファイル名先頭の連番と、拡張子を削除
      if ( trimExt ) {
        label = label.replace( reg4, "$1$2" );
      }
      // 可視マクロと不可視マクロの振り分け
      if ( macroArray[i][1] == "1" ) {
        num = ( "  " + ( ++ j ) ).slice( - mcWidth ).replace( /\d$/, "&$&: " );
        menu.Add( num + label, id );
      }
      else {
        num = ( "  " + ( ++ k ) ).slice( - mcWidth ).replace( /\d$/, "&$&: " );
        smMenu.Add( num + label, id );
      }
    }

    menu.Add( "-----", 0, meMenuSeparator );
    if ( invisible ) {
      smMenu.Add( "-----", 0, meMenuSeparator );
      smMenu.Add( "キャンセル\t& ", 0 );
    }
  }
  menu.Add( "編集(&E)  " + ScriptName, 2173 );
  menu.Add( "選択(&L)...", 2174 );
  menu.Add( "これを選択(&T)", 2175, ! document.Name *2 );
  menu.Add( "カスタマイズ(&C)...", 2176 );
  menu.Add( "-----", 0, meMenuSeparator );
  menu.Add( "キャンセル\t& ", 0 );

  // ステータスを表示
  Status = " マクロメニュー: " + j + " 件 + " + k + " 件 [ "
         + ( ( new Date() - start ) / 1000 ).toFixed( 3 ).replace( /\./, ". " )
         + " 秒 ]";
  return menu;
}
スポンサーリンク