「コンパクトメニュー」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
編集の要約なし
Sukemaru (トーク | 投稿記録)
修正第4版
10行目: 10行目:
: ※ このマクロを導入しても、エディタウインドウの「メニューバー」を非表示にすることはできないので、たいした意味はありません…。
: ※ このマクロを導入しても、エディタウインドウの「メニューバー」を非表示にすることはできないので、たいした意味はありません…。


* ポップアップメニューの表示位置は、ソースコード内の設定項目から変更可能です(デフォルト状態ではマウスポインタの位置に表示)。
 
* ポップアップメニューの表示位置は、ソースコード内の設定項目 menuPosMouse から変更可能です(デフォルト状態ではマウスポインタの位置に表示)。
 
* 標準メニューでは表示されない、ポップアップメニューやキーボードショートカット用のコマンドを表示できます。
: → ソースコード内の設定項目 xMenuEnable (デフォルト状態では非表示)
 
* ベータバージョン 2.8.6 までで追加されたものを含めて、すべてのコマンドを表示できます。
: → バージョンチェックによるグレーアウト処理を追加




16行目: 23行目:


* 多分 Mery ver 2.6.7 以降であれば動作するはずです。
* 多分 Mery ver 2.6.7 以降であれば動作するはずです。
* ベータバージョン 2.8.6 までで追加されたものを含めて、すべてのコマンドを表示します(内部エラーが発生した場合は、ステータスバーにエラーメッセージを表示)。
: 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 の一覧が表示されないときは、それぞれの設定ダイアログを開いて [ OK ] ボタンで閉じると表示されるようになるはず。


* すべてのメニュー項目の '''完全な再現は無理''' です( "エディタの状態" について、マクロからは取得できない部分が多々あるため)。
* すべてのメニュー項目の '''完全な再現は無理''' です( "エディタの状態" について、マクロからは取得できない部分が多々あるため)。
32行目: 39行目:
* 「'''クリップボード履歴'''」は Mery ver 2.8.1 以降であれば 16 件まで表示されるはずです。<br> 2.8.0 以前のバージョンでは最新の 1 件しか表示できません(外部のアプリでテキスト以外のデータを「コピー」しているときは 0 件になる)。
* 「'''クリップボード履歴'''」は Mery ver 2.8.1 以降であれば 16 件まで表示されるはずです。<br> 2.8.0 以前のバージョンでは最新の 1 件しか表示できません(外部のアプリでテキスト以外のデータを「コピー」しているときは 0 件になる)。
<br>
<br>
* ソースコード内にコメントアウトしてある行が数箇所あります(標準メニューでは表示されない、ポップアップメニューやキーボードショートカット用のコマンド) → 任意でアンコメント可
* 任意で項目の配置を変更しても差しつかえありませんが、Add() メソッドの第2引数(ExecuteCommandByID() メソッドに渡す定数)は変更しないで下さい。
* 任意で項目の配置を変更しても差しつかえありませんが、Add() メソッドの第2引数(ExecuteCommandByID() メソッドに渡す定数)は変更しないで下さい。


39行目: 45行目:


>> 「[[ファイル:コンパクトメニュー.zip]]」 (アイコン入り)
>> 「[[ファイル:コンパクトメニュー.zip]]」 (アイコン入り)
* 2019/10/29: 第3版 (修正版)
* 2019/10/30:(修正第4版)
: ・拡張メニューを追加
: ・バージョンチェックによるグレーアウト処理を追加
: ・関数のエラーを修正
* 2019/10/29:(修正第3版)
: 「クリップボード履歴」の取得はベータ版 2.8.1 以降でないとエラーになるので回避処理を追加
: 「クリップボード履歴」の取得はベータ版 2.8.1 以降でないとエラーになるので回避処理を追加


== ソースコード ==
== ソースコード ==


<source lang="javascript" style="height:60em; overflow:auto;">
<source lang="javascript" style="height:80em; overflow:auto;">
#title = "コンパクトメニュー"
#title = "コンパクトメニュー2"
#tooltip = "メニューバーの全アイテムを階層化表示"
#tooltip = "メニューバーの全アイテムを階層化表示"
#icon = "menu+.ico"
#icon = "menu+.ico"
51行目: 62行目:
/**
/**
  * ---------------------------------------------------------
  * ---------------------------------------------------------
  * コンパクトメニュー
  * コンパクトメニュー2
  * sukemaru, 2019/10/25 - 2019/10/29
  * sukemaru, 2019/10/25 - 2019/10/30
  *  
  *  
  * メニューバーのアイテムをポップアップメニューで階層化して表示する
  * メニューバーのアイテムをポップアップメニューで階層化して表示する
  * ※ ショートカットキーまたはマクロバーアイコンからの起動用
  * ※ ショートカットキーまたはツールバー(マクロバー)アイコンからの起動用
  * ---------------------------------------------------------
  * ---------------------------------------------------------
* 2019/10/30: 拡張メニューを追加。バージョンチェックを追加
*
* 【仕様上の制限】
* ・すべてのメニュー項目の完全な再現は無理。
* ・状況に応じた項目のグレーアウトの完全な再現は無理。
* ・トグル項目などの左につける ✔ チェックマークの再現は無理。
* ・ウインドウメニューのタブ一覧のアイテムの 「無題-x」 の連番の再現は無理。
*
* ・ver 2.6.8 以降のベータ版での追加項目は、バージョンチェックによりグレーアウト
*  (現状では、バージョンチェックによる項目の不可視化には非対応)。
* ・「フォント」 の履歴アイテムの列挙は無し (ExecuteCommandByID の対象外)。
* ・ショートカットキーの表示は無し (マクロのショートカットキーを取得できない)。
* ・マクロ名 ( #title ) の自動取得は面倒なので、実体ファイル名で表示。
* ・「クリップボード履歴」 は Mery ver 2.8.1 以降であれば 16 件まで表示されるはず。
*  ver 2.8.0 以前のバージョンでは最新の 1 件のみ
*  (外部のアプリでテキスト以外のデータを「コピー」しているときは 0 件)。
*
* ※ ツール >> HTML Tidy >> ドキュメントの整形 ができない。
*
* ※ Mery を初期設定状態のまま使っている場合、
*  「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 は
*  それぞれの設定ダイアログを開いて [OK] で閉じたことがないと
*  Mery.ini に書きこまれないので、ポップアップメニューに表示されない。
  */
  */


66行目: 100行目:
// ■ クリップボード履歴で表示する文字数の目安
// ■ クリップボード履歴で表示する文字数の目安
var menuWidth = 60;
var menuWidth = 60;
// ■ 拡張メニューを表示する (ファイルメニューの拡張と、非表示機能の可視化)
var xMenuEnable = true; // true: 表示する / false: 表示しない


// ---------- ▲ 設定項目 ▲ ---------- //
// ---------- ▲ 設定項目 ▲ ---------- //
72行目: 109行目:
// 【準備】
// 【準備】
var start = new Date();
var start = new Date();
var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
var d = editor.ActiveDocument,  s = d.selection;
var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
var WshShell = new ActiveXObject( "WScript.Shell" );
var WshShell = new ActiveXObject( "WScript.Shell" );
var d = editor.ActiveDocument,  s = d.selection;


// Mery フォルダとデータフォルダ
// Mery フォルダとデータフォルダ
83行目: 120行目:
var hisPath = meryDir + mery + ".his";
var hisPath = meryDir + mery + ".his";
var dicsDir = meryDir + "Dicts\\";
var dicsDir = meryDir + "Dicts\\";
var profileDir = meryDir;
if ( ! Fso.FileExists( iniPath ) ) {
if ( ! Fso.FileExists( iniPath ) ) {
   var profileDir = WshShell.SpecialFolders( "APPDATA" ) + "\\Mery\\";
   profileDir = WshShell.SpecialFolders( "APPDATA" ) + "\\Mery\\";
   iniPath = profileDir + mery + ".ini";
   iniPath = profileDir + mery + ".ini";
   hisPath = profileDir + mery + ".his";
   hisPath = profileDir + mery + ".his";
91行目: 129行目:
// Mery.ini から各種データを取得
// Mery.ini から各種データを取得
// 戻り値は [ iniOptionArray, modeArray, macroArray, pluginArray, toolArray ];
// 戻り値は [ iniOptionArray, modeArray, macroArray, pluginArray, toolArray ];
var iniItem = GetIniOptionCM( [ "MaxRecentFile", "Untitled" ], iniPath );
var iniKey = [ "MaxRecentFile", "Untitled", "MacrosRunAction"
              , "AutoSaveFolder", "BackupFolder"] ;
var iniItem = GetIniOptionCM( iniKey, iniPath );


// 「最後に閉じたファイル」の準備
// 「最後に閉じたファイル」の準備
146行目: 186行目:
var dsWidth = ( "" + dsCount ).length;
var dsWidth = ( "" + dsCount ).length;
var untitled = iniItem[0][1] || "無題";
var untitled = iniItem[0][1] || "無題";
// 拡張メニューの準備
if ( xMenuEnable ) {
  var fullPath = Fso.FileExists( d.FullName ) ? d.FullName : "";
  var fileName = fullPath ? d.Name : "";
  var folderPath = fullPath ? d.Path : "";
  var macroDir = meryDir + "macros\\";
  var autoSaveDir = iniItem[0][3] || "";
  var backupDir = iniItem[0][4] || "";
  var desktoptDir = WshShell.SpecialFolders( "Desktop" );
  var documentsDir = WshShell.SpecialFolders( "MyDocuments" );
  var currentDir = WshShell.CurrentDirectory;
  var portableMode = ( profileDir == meryDir );
  var reg = /^\.(?:js|pl|php|py|rbs|vbs)$/i;
  var ext = fileName.substr( fileName.lastIndexOf( "\." ) );
  var runFlags = ( blank || unnamed || ! reg.test( ext ) *2 );
}




154行目: 211行目:
// オプションフラグ
// オプションフラグ
var unnamed = d.FullName ? 0 : meMenuGrayed; // 無題タブ
var unnamed = d.FullName ? 0 : meMenuGrayed; // 無題タブ
var saved = d.Saved ? 0 : meMenuGrayed; // 保存済み
var empty = s.IsEmpty ? meMenuGrayed : 0; // 選択範囲なし
var empty = s.IsEmpty ? meMenuGrayed : 0; // 選択範囲なし
var readOnly = d.ReadOnly ? meMenuGrayed : 0; // 書き換え禁止
var readOnly = d.ReadOnly ? meMenuGrayed : 0; // 書き換え禁止
var blank = d.Text ? 0 : meMenuGrayed ; // 白紙の文書
var blank = d.Text ? 0 : meMenuGrayed; // 白紙の文書
var multi = ( editors.Count == 1 ) ? meMenuGrayed : 0; // 複数ウインドウ
var multi = ( editors.Count == 1 ) ? meMenuGrayed : 0; // 複数ウインドウ
var sqlDll = Fso.FileExists( meryDir + "sqlfmt.dll" ); // SQL 整形
var sqlDll = Fso.FileExists( meryDir + "sqlfmt.dll" ); // SQL 整形
var crlf = ( typeof d.LineEnding == "number" )
var v2_6_9 = VersionCheck( "2.6.9" )  ? 0 : meMenuGrayed;
? d.LineEnding : undefined; // 改行モード
var v2_6_12 = VersionCheck( "2.6.12" ) ? 0 : meMenuGrayed;
var dEnc = d.Encoding; // エンコード
var v2_6_13 = VersionCheck( "2.6.13" ) ? 0 : meMenuGrayed;
var v2_6_15 = VersionCheck( "2.6.15" ) ? 0 : meMenuGrayed;
var v2_7_0 = VersionCheck( "2.7.0" )  ? 0 : meMenuGrayed;
var v2_7_5 = VersionCheck( "2.7.5" )  ? 0 : meMenuGrayed;
var v2_8_0 = VersionCheck( "2.8.0" )  ? 0 : meMenuGrayed;
// ( typeof d.LineEnding == "number" )
var eol = VersionCheck( "2.6.10" )
            ? d.LineEnding : undefined; // 改行モード
var dEnc = d.Encoding; // エンコード
var utf8 = ( dEnc == 65001 || dEnc == 650011 || dEnc == 650010 )
var utf8 = ( dEnc == 65001 || dEnc == 650011 || dEnc == 650010 )
? meMenuChecked : 0;
? meMenuChecked : 0;
168行目: 234行目:
var utf16be = ( dEnc == 65538 || dEnc == 655381 || dEnc == 655380 )
var utf16be = ( dEnc == 65538 || dEnc == 655381 || dEnc == 655380 )
? meMenuChecked : 0;
? meMenuChecked : 0;


// 「ファイル」メニュー
// 「ファイル」メニュー
/* 「最近開いたファイル」の替わりに「最後に閉じたファイル」を表示 */
/* 「最近開いたファイル」の替わりに「最後に閉じたファイル」を表示 */
menu.AddPopup( "ファイル(&F)", fMenu = CreatePopupMenu() );
menu.AddPopup( "ファイル(&F)", fMenu = CreatePopupMenu() );
  // 拡張メニュー
  if ( xMenuEnable ) {
    XMenu( fMenu, fullPath, portableMode, autoSaveDir, backupDir );
  }
   fMenu.Add( "新規作成(&N)", 2061 );
   fMenu.Add( "新規作成(&N)", 2061 );
   fMenu.Add( "開く(&O)...", 2062 );
   fMenu.Add( "開く(&O)...", 2062 );
   fMenu.Add( "閉じて開く(&D)...", 2063, unnamed );
   fMenu.Add( "閉じて開く(&D)...", 2063 );
   fMenu.Add( "上書き保存(&S)", 2064, unnamed );
   fMenu.Add( "上書き保存(&S)", 2064, unnamed || saved );
   fMenu.Add( "名前を付けて保存(&A)...", 2065 );
   fMenu.Add( "名前を付けて保存(&A)...", 2065 );
   fMenu.Add( "すべて保存(&L)", 2066 );
   fMenu.Add( "すべて保存(&L)", 2066 );
   fMenu.Add( "-----", 0, meMenuSeparator );
   fMenu.Add( "-----", 0, meMenuSeparator );
   /* 「自動保存」ON/OFF の ✔ チェックマーク表示は不可 */
   /* 「自動保存」ON/OFF の ✔ チェックマーク表示は不可 */
   fMenu.Add( "自動保存(&U)", 2240 );
   fMenu.Add( "自動保存(&U)", 2240, v2_6_9 );
   fMenu.Add( "-----", 0, meMenuSeparator );
   fMenu.Add( "-----", 0, meMenuSeparator );
   fMenu.Add( "挿入(&I)...", 2067 );
   fMenu.Add( "挿入(&I)...", 2067 );
211行目: 282行目:
     rlMenu.Add( "西ヨーロッパ言語", 2088, ( dEnc == 1252 ) *1 );
     rlMenu.Add( "西ヨーロッパ言語", 2088, ( dEnc == 1252 ) *1 );
}
}
if ( typeof crlf == "number" ) {
if ( typeof eol == "number" ) {
   fMenu.AddPopup( "改行コード(&G)", leMenu = CreatePopupMenu() );
   fMenu.AddPopup( "改行コード(&G)", leMenu = CreatePopupMenu() );
     leMenu.Add( "CR+LF (Windows)", 100, ( crlf == 0 ) *1 );
     leMenu.Add( "CR+LF (Windows)", 100, ( eol == 0 ) *1 );
     leMenu.Add( "CR (Macintosh)", 101, ( crlf == 1 ) *1 );
     leMenu.Add( "CR (Macintosh)", 101, ( eol == 1 ) *1 );
     leMenu.Add( "LF (UNIX)", 102, ( crlf == 2 ) *1 );
     leMenu.Add( "LF (UNIX)", 102, ( eol == 2 ) *1 );
} else {
} else {
   fMenu.Add( "改行コード(&G)", 0, meMenuGrayed );
   fMenu.Add( "改行コード(&G)", 0, meMenuGrayed );
223行目: 294行目:
   fMenu.Add( "印刷プレビュー(&W)...", 2093 );
   fMenu.Add( "印刷プレビュー(&W)...", 2093 );
   fMenu.Add( "-----", 0, meMenuSeparator );
   fMenu.Add( "-----", 0, meMenuSeparator );
   /* 最後に閉じたファイル を自動で列挙 */
   /* 最後に閉じたファイルを列挙 */
   if ( maxRecentFile && lcCount ) {
   if ( maxRecentFile > 0 && lcCount ) {
     for ( var i = 0; i < lcCount; i ++ ) {
     for ( var i = 0; i < lcCount; i ++ ) {
       id = i + 200;
       id = i + 200;
235行目: 306行目:
   fMenu.Add( "保存して閉じる(&E)", 2094 );
   fMenu.Add( "保存して閉じる(&E)", 2094 );
   fMenu.Add( "閉じる(&C)", 2095 );
   fMenu.Add( "閉じる(&C)", 2095 );
  // fMenu.Add( "-----", 0, meMenuSeparator );
  // fMenu.Add( "他のタブをすべて閉じる(&O)", 2249 );
  // fMenu.Add( "左のタブをすべて閉じる(&H)", 2250 );
  // fMenu.Add( "右のタブをすべて閉じる(&M)", 2251 );
   fMenu.Add( "-----", 0, meMenuSeparator );
   fMenu.Add( "-----", 0, meMenuSeparator );
if ( xMenuEnable ) {
  fMenu.Add( "他のタブをすべて閉じる(&Z)*", 2249, v2_7_5 ); //
  fMenu.Add( "左のタブをすべて閉じる(&H)*", 2250, v2_7_5 ); //
  fMenu.Add( "右のタブをすべて閉じる(&M)*", 2251, v2_7_5 ); //
  fMenu.Add( "-----", 0, meMenuSeparator ); //
}
   fMenu.Add( "すべて保存して閉じる(&V)", 2096 );
   fMenu.Add( "すべて保存して閉じる(&V)", 2096 );
   fMenu.Add( "すべて閉じる(&X)", 2097 );
   fMenu.Add( "すべて閉じる(&X)", 2097 );
252行目: 325行目:
   eMenu.Add( "貼り付け(&P)", 2103, readOnly );
   eMenu.Add( "貼り付け(&P)", 2103, readOnly );
   eMenu.Add( "引用つきコピー(&Q)", 2102 );
   eMenu.Add( "引用つきコピー(&Q)", 2102 );
   // eMenu.Add( "引用つき貼り付け(&V)", 2200, readOnly );
if ( xMenuEnable ) {
   eMenu.Add( "引用つき貼り付け(&W)*", 2200, readOnly ); //
}
   eMenu.Add( "削除(&L)", 2104, readOnly );
   eMenu.Add( "削除(&L)", 2104, readOnly );
   eMenu.Add( "-----", 0, meMenuSeparator );
   eMenu.Add( "-----", 0, meMenuSeparator );
258行目: 333行目:
   eMenu.Add( "日付と時刻(&D)", 2106, readOnly );
   eMenu.Add( "日付と時刻(&D)", 2106, readOnly );
   eMenu.Add( "-----", 0, meMenuSeparator );
   eMenu.Add( "-----", 0, meMenuSeparator );
   // eMenu.Add( "リンクをコピー", 2201 );
if ( xMenuEnable ) {
   // eMenu.Add( "リンクを開く", 2202 );
   eMenu.Add( "リンクをコピー(&H)*", 2201 ); //
   // eMenu.Add( "-----", 0, meMenuSeparator );
   eMenu.Add( "リンクを開く(&O)*", 2202 ); //
   eMenu.Add( "-----*", 0, meMenuSeparator ); //
}
   eMenu.Add( "行へ移動(&G)...", 2107 );
   eMenu.Add( "行へ移動(&G)...", 2107 );
   // eMenu.Add( "ファイルへ移動", 2108 );
if ( xMenuEnable ) {
   // eMenu.Add( "-----", 0, meMenuSeparator );
   eMenu.Add( "ファイルへ移動(&F)*", 2108 ); //
   // eMenu.Add( "最後に編集した位置へ移動(&L)", 2241 );
   eMenu.Add( "-----*", 0, meMenuSeparator ); //
   // eMenu.Add( "次の変更行(&N)", 2243 );
   eMenu.Add( "最後に編集した位置へ移動(&L)*", 2241, v2_6_9 ); //
   // eMenu.Add( "前の変更行(&H)", 2244 );
   eMenu.Add( "次の変更行(&N)*", 2243, v2_6_12 ); //
   // eMenu.Add( "-----", 0, meMenuSeparator );
   eMenu.Add( "前の変更行(&M)*", 2244, v2_6_12 ); //
   // eMenu.Add( "挿入/上書の切り替え", 2125 );
   eMenu.Add( "-----*", 0, meMenuSeparator ); //
   eMenu.Add( "挿入/上書の切り替え(&I)*", 2125 ); //
}
   eMenu.Add( "書き換え禁止(&Y)", 2109, readOnly /2 );
   eMenu.Add( "書き換え禁止(&Y)", 2109, readOnly /2 );
   eMenu.Add( "-----", 0, meMenuSeparator );
   eMenu.Add( "-----", 0, meMenuSeparator );
278行目: 357行目:
     cvMenu.Add( "行の統合(&J)", 2113, empty || readOnly );
     cvMenu.Add( "行の統合(&J)", 2113, empty || readOnly );
     cvMenu.Add( "-----", 0, meMenuSeparator );
     cvMenu.Add( "-----", 0, meMenuSeparator );
     // cvMenu.Add( "行切り取り", 2217, readOnly );
  if ( xMenuEnable ) {
     // cvMenu.Add( "行コピー", 2218 );
     cvMenu.Add( "行切り取り*", 2217, readOnly ); //
     // cvMenu.Add( "行削除", 2219, readOnly );
     cvMenu.Add( "行コピー*", 2218 ); //
     // cvMenu.Add( "行右削除", 2220, readOnly );
     cvMenu.Add( "行削除*", 2219, readOnly ); //
     // cvMenu.Add( "行左削除", 2221, readOnly );
     cvMenu.Add( "行右削除*", 2220, readOnly ); //
     // cvMenu.Add( "-----", 0, meMenuSeparator );
     cvMenu.Add( "行左削除*", 2221, readOnly ); //
     // cvMenu.Add( "単語の削除", 2222, readOnly );
     cvMenu.Add( "-----", 0, meMenuSeparator ); //
     // cvMenu.Add( "単語の右削除", 2223, readOnly );
     cvMenu.Add( "単語の削除*", 2222, readOnly ); //
     // cvMenu.Add( "単語の左削除", 2224, readOnly );
     cvMenu.Add( "単語の右削除*", 2223, readOnly ); //
     // cvMenu.Add( "-----", 0, meMenuSeparator );
     cvMenu.Add( "単語の左削除*", 2224, readOnly ); //
     cvMenu.Add( "-----", 0, meMenuSeparator ); //
  }
     cvMenu.Add( "大文字に変換(&U)", 2114, empty || readOnly );
     cvMenu.Add( "大文字に変換(&U)", 2114, empty || readOnly );
     cvMenu.Add( "小文字に変換(&L)", 2115, empty || readOnly );
     cvMenu.Add( "小文字に変換(&L)", 2115, empty || readOnly );
302行目: 383行目:
     cvMenu.Add( "-----", 0, meMenuSeparator );
     cvMenu.Add( "-----", 0, meMenuSeparator );
     cvMenu.Add( "再変換(&V)", 2123, empty || readOnly );
     cvMenu.Add( "再変換(&V)", 2123, empty || readOnly );
     cvMenu.Add( "文字コードの切り替え(&O)", 2245, readOnly );
     cvMenu.Add( "文字コードの切り替え(&O)", 2245, readOnly || v2_6_13 );
     cvMenu.Add( "-----", 0, meMenuSeparator );
     cvMenu.Add( "-----", 0, meMenuSeparator );
     cvMenu.Add( "Base64 デコード(&B)...", 2124, empty );
     cvMenu.Add( "Base64 デコード(&B)...", 2124, empty );
328行目: 409行目:
       spMenu.Add( "その他(&E)", 2215 );
       spMenu.Add( "その他(&E)", 2215 );
     scMenu.AddPopup( "辞書(&D)", dicMenu = CreatePopupMenu() );
     scMenu.AddPopup( "辞書(&D)", dicMenu = CreatePopupMenu() );
       /* 辞書一覧 を自動で列挙 */
       /* 辞書一覧を列挙
       for ( var i = 0, dic; i < dcCount; i ++ ) {
        Add() の第2引数 id は 4096 からの連番 */
       for ( var i = 0; i < dcCount; i ++ ) {
         id = i + 4096;
         id = i + 4096;
         dic = /([^\\]+)\.aff$/i.exec( dicsArray[i] )[1];
         label = /([^\\]+)\.aff$/i.exec( dicsArray[i] )[1];
         num = ( "  " + ( i + 1 ) ).slice( - dcWidth ).replace( /\d$/, "&$&: " );
         num = ( "  " + ( i + 1 ) ).slice( - dcWidth ).replace( /\d$/, "&$&: " );
         dicMenu.Add( num + dic, id );
         dicMenu.Add( num + label, id );
       }
       }
     scMenu.Add( "-----", 0, meMenuSeparator );
     scMenu.Add( "-----", 0, meMenuSeparator );
361行目: 443行目:
menu.AddPopup( "表示(&V)", vMenu = CreatePopupMenu() );
menu.AddPopup( "表示(&V)", vMenu = CreatePopupMenu() );
   vMenu.AddPopup( "編集モード(&M)", mdMenu = CreatePopupMenu() );
   vMenu.AddPopup( "編集モード(&M)", mdMenu = CreatePopupMenu() );
     /* 編集モード一覧 を自動で列挙 */
    mdMenu.Add( "現在の編集モードのプロパティ(&P)...**", 18 );
     for ( var i = 0, mode; i < mdCount; i ++ ) {
    mdMenu.Add( "-----**", 0, meMenuSeparator );
       mode = modeArray[i];
     /* 編集モード一覧を列挙
       mdMenu.Add( mode, i + 5120, ( dMode == mode ) *1 )
      Add() の第2引数 id は 5120 からの連番 */
     for ( var i = 0; i < mdCount; i ++ ) {
       id = i + 5120;
      label = modeArray[i];
       mdMenu.Add( label, id, ( dMode == label ) *1 )
     }
     }
     mdMenu.Add( "-----", 0, meMenuSeparator );
     mdMenu.Add( "-----", 0, meMenuSeparator );
386行目: 472行目:
     sgMenu.Add( "全角空白(&W)", 2156 );
     sgMenu.Add( "全角空白(&W)", 2156 );
     sgMenu.Add( "CR と LF を区別して表示(&D)", 2157 );
     sgMenu.Add( "CR と LF を区別して表示(&D)", 2157 );
     sgMenu.Add( "変更行を強調表示(&H)", 2242 );
     sgMenu.Add( "変更行を強調表示(&H)", 2242, v2_6_9 );
   vMenu.Add( "-----", 0, meMenuSeparator );
   vMenu.Add( "-----", 0, meMenuSeparator );
   vMenu.AddPopup( "ツールバー(&T)", tbMenu = CreatePopupMenu() );
   vMenu.AddPopup( "ツールバー(&T)", tbMenu = CreatePopupMenu() );
397行目: 483行目:
     tbMenu.Add( "ツールバーのタイトル(&O)", 2162 );
     tbMenu.Add( "ツールバーのタイトル(&O)", 2162 );
     tbMenu.Add( "ツールバーを固定する(&L)", 2163 );
     tbMenu.Add( "ツールバーを固定する(&L)", 2163 );
     tbMenu.Add( "マクロバーのラベルを表示(&B)", 2252 );
     tbMenu.Add( "マクロバーのラベルを表示(&B)", 2252, v2_8_0 );
     tbMenu.Add( "-----", 0, meMenuSeparator );
     tbMenu.Add( "-----", 0, meMenuSeparator );
     tbMenu.Add( "小アイコン(&A)", 2228 );
     tbMenu.Add( "小アイコン(&A)", 2228 );
409行目: 495行目:
   vMenu.Add( "-----", 0, meMenuSeparator );
   vMenu.Add( "-----", 0, meMenuSeparator );
   vMenu.Add( "全画面表示(&U)", 2203 );
   vMenu.Add( "全画面表示(&U)", 2203 );
   vMenu.Add( "Zen モード(&Z)", 2246 );
   vMenu.Add( "Zen モード(&Z)", 2246, v2_6_15 );
   vMenu.Add( "タイプライタースクロール(&Y)", 2247 );
   vMenu.Add( "タイプライタースクロール(&Y)", 2247, v2_6_15 );
   vMenu.Add( "-----", 0, meMenuSeparator );
   vMenu.Add( "-----", 0, meMenuSeparator );
   // vMenu.Add( "スクロールバーのマーカー表示", 2248 );
if ( xMenuEnable ) {
   // vMenu.Add( "-----", 0, meMenuSeparator );
   vMenu.Add( "スクロールバーのマーカー表示*", 2248, v2_7_0 ); //
   vMenu.Add( "-----", 0, meMenuSeparator ); //
}
   vMenu.AddPopup( "マーカー(&K)", mkMenu = CreatePopupMenu() );
   vMenu.AddPopup( "マーカー(&K)", mkMenu = CreatePopupMenu() );
     mkMenu.Add( "マーカーに追加/削除(&A)", 2232 );
     mkMenu.Add( "マーカーに追加/削除(&A)", 2232 );
429行目: 517行目:
     /* 使用したフォントの履歴の取得は無理 */
     /* 使用したフォントの履歴の取得は無理 */
     ftMenu.Add( "-----", 0, meMenuSeparator );
     ftMenu.Add( "-----", 0, meMenuSeparator );
     // ftMenu.Add( "大きいフォントサイズ(&L)", 2167 );
  if ( xMenuEnable ) {
     // ftMenu.Add( "小さいフォントサイズ(&S)", 2168 );
     ftMenu.Add( "大きいフォントサイズ(&L)*", 2167 ); //
     // ftMenu.Add( "フォントサイズをリセット(&R)", 2205 );
     ftMenu.Add( "小さいフォントサイズ(&S)*", 2168 ); //
     // ftMenu.Add( "現在のフォントサイズを規定に設定(&D)", 2206 );
     ftMenu.Add( "フォントサイズをリセット(&R)*", 2205 ); //
     // ftMenu.Add( "-----", 0, meMenuSeparator );
     ftMenu.Add( "現在のフォントサイズを規定に設定(&D)*", 2206 ); //
     ftMenu.Add( "-----*", 0, meMenuSeparator ); //
  }
     ftMenu.Add( "フォントの設定(&C)...", 2169 );
     ftMenu.Add( "フォントの設定(&C)...", 2169 );


443行目: 533行目:
menu.AddPopup( "マクロ(&M)", mMenu = CreatePopupMenu() );
menu.AddPopup( "マクロ(&M)", mMenu = CreatePopupMenu() );
   mMenu.Add( "記録/停止(&S)", 2170 );
   mMenu.Add( "記録/停止(&S)", 2170 );
   mMenu.Add( "実行(&R)", 2171 );
   mMenu.Add( "実行(&R) " + ScriptName, 2171 );
   // mMenu.Add( "一時オプションを設定してマクロ実行...", 2204 );
if ( xMenuEnable ) {
   mMenu.Add( "一時オプションを設定してマクロ実行(&O)...*", 2204 ); //
}
   mMenu.Add( "-----", 0, meMenuSeparator );
   mMenu.Add( "-----", 0, meMenuSeparator );
   mMenu.Add( "名前を付けて保存(&A)", 2172 );
   mMenu.Add( "名前を付けて保存(&A)...", 2172 );
   mMenu.Add( "編集(&E)", 2173 );
   mMenu.Add( "編集(&E) " + ScriptName, 2173 );
   mMenu.Add( "選択(&L)...", 2174 );
   mMenu.Add( "選択(&L)...", 2174 );
   mMenu.Add( "これを選択(&T)", 2175, blank );
   mMenu.Add( "これを選択(&T)", 2175, blank || unnamed );
if ( xMenuEnable && iniItem[0][2] == "F4" ) { //
  mMenu.Add( "このマクロを実行(&G)**  " + fileName, 19, runFlags ); //
} //
   mMenu.Add( "カスタマイズ(&C)...", 2176 );
   mMenu.Add( "カスタマイズ(&C)...", 2176 );
   mMenu.Add( "-----", 0, meMenuSeparator );
   mMenu.Add( "-----", 0, meMenuSeparator );
   /* マクロのファイル名一覧 を自動で列挙 */
   /* マクロのファイル名一覧を列挙
   for ( var i = 0, j = 1, macro; i < mcCount; i ++ ) {
    Add() の第2引数 id は 6144 からの連番
    (※ 仕様上、不可視のアイテムにも連番が適用される) */
   for ( var i = 0, j = 1; i < mcCount; i ++ ) {
     if ( macroArray[i].slice( -1 ) != "1" ) { continue; }
     if ( macroArray[i].slice( -1 ) != "1" ) { continue; }
     id = i + 6144;
     id = i + 6144;
     macro = /([^\\]+\.\w+)1$/.exec( macroArray[i] )[1];
     label = /([^\\]+\.\w+)1$/.exec( macroArray[i] )[1];
     // 拡張子とファイル名の先頭の連番とを削除
     // 拡張子とファイル名の先頭の連番とを削除
     // macro = macro.replace( /^\d+\.|(?:[((].+[))])?\.js$/g, "" );
     // label = label.replace( /^\d+\.|(?:[((].+[))])?\.js$/g, "" );
     num = ( "  " + ( j ++ ) ).slice( - mcWidth ).replace( /\d$/, "&$&: " );
     num = ( "  " + ( j ++ ) ).slice( - mcWidth ).replace( /\d$/, "&$&: " );
     mMenu.Add( num + macro, id );
     mMenu.Add( num + label, id );
   }
   }


467行目: 564行目:
   tMenu.Add( "オプション(&O)...", 2177 );
   tMenu.Add( "オプション(&O)...", 2177 );
   tMenu.Add( "-----", 0, meMenuSeparator );
   tMenu.Add( "-----", 0, meMenuSeparator );
   // tMenu.Add( "単語補完", 2178 );
if ( xMenuEnable ) {
   // tMenu.Add( "-----", 0, meMenuSeparator );
   tMenu.Add( "単語補完*", 2178 ); // 入力補完(オートコンプリート) //
   tMenu.Add( "-----", 0, meMenuSeparator ); //
}
if ( readOnly ) {
if ( readOnly ) {
   tMenu.Add( "HTML Tidy(&H)", 0, readOnly );
   tMenu.Add( "HTML Tidy(&H)", 0, readOnly );
480行目: 579行目:
}
}
   tMenu.Add( "-----", 0, meMenuSeparator );
   tMenu.Add( "-----", 0, meMenuSeparator );
   /* クリップボード履歴 を自動で列挙 */
   /* クリップボード履歴を列挙 */
   tMenu.AddPopup( "クリップボード履歴(&C)", cbMenu = CreatePopupMenu() );
   tMenu.AddPopup( "クリップボード履歴(&C)", cbMenu = CreatePopupMenu() );
   if ( cbData0 ) {
   if ( cbData0 ) {
489行目: 588行目:
     }
     }
     cbMenu.Add( "", 0, meMenuSeparator );
     cbMenu.Add( "", 0, meMenuSeparator );
     cbMenu.Add( "すべての履歴を削除する (&E)", 17 );
     cbMenu.Add( "すべての履歴を削除する(&E)**", 17 ); //
   }
   }
   else if ( cbData.length ) {
   else if ( cbData.length ) {
496行目: 595行目:
   tMenu.Add( "-----", 0, meMenuSeparator );
   tMenu.Add( "-----", 0, meMenuSeparator );
   tMenu.AddPopup( "プラグイン(&I)", plMenu = CreatePopupMenu() );
   tMenu.AddPopup( "プラグイン(&I)", plMenu = CreatePopupMenu() );
     /* プラグイン名一覧 を自動で列挙
     /* プラグイン名一覧を列挙
       有効/無効の ✔ チェックマーク表示は無理 */
       有効/無効の ✔ チェックマーク表示は無理
     for ( var i = 0, plugin; i < plCount; i ++ ) {
      Add() の第2引数 id は 7168 からの連番 */
     for ( var i = 0; i < plCount; i ++ ) {
       id = i + 7168;
       id = i + 7168;
       plugin = GetPluginName( pluginArray[i] );
       label = GetPluginName( pluginArray[i] );
       num = ( "  " + ( i + 1 ) ).slice( - plWidth ).replace( /\d$/, "&$&: " );
       num = ( "  " + ( i + 1 ) ).slice( - plWidth ).replace( /\d$/, "&$&: " );
       plMenu.Add( num + plugin, id );
       plMenu.Add( num + label, id );
     }
     }
     plMenu.Add( "-----", 0, meMenuSeparator );
     plMenu.Add( "-----", 0, meMenuSeparator );
     plMenu.Add( "プラグインの設定(&C)...", 2181 );
     plMenu.Add( "プラグインの設定(&C)...", 2181 );
   tMenu.AddPopup( "外部ツール(&E)", etMenu = CreatePopupMenu() );
   tMenu.AddPopup( "外部ツール(&E)", etMenu = CreatePopupMenu() );
     /* 外部ツール名一覧 を自動で列挙 */
     /* 外部ツール名一覧を列挙
     for ( var i = 0, tool; i < tlCount; i ++ ) {
      Add() の第2引数 id は 8192 からの連番 */
     for ( var i = 0; i < tlCount; i ++ ) {
       id = i + 8192;
       id = i + 8192;
       tool = toolArray[i];
       label = toolArray[i];
       num = ( "  " + ( i + 1 ) ).slice( - tlWidth ).replace( /\d$/, "&$&: " );
       num = ( "  " + ( i + 1 ) ).slice( - tlWidth ).replace( /\d$/, "&$&: " );
       etMenu.Add( num + tool, id );
       etMenu.Add( num + label, id );
     }
     }
     etMenu.Add( "-----", 0, meMenuSeparator );
     etMenu.Add( "-----", 0, meMenuSeparator );
529行目: 630行目:
   wMenu.Add( "左右に分割(&L)", 2226 );
   wMenu.Add( "左右に分割(&L)", 2226 );
   wMenu.Add( "-----", 0, meMenuSeparator );
   wMenu.Add( "-----", 0, meMenuSeparator );
   // wMenu.Add( "次のペイン", 2187 );
if ( xMenuEnable ) {
   // wMenu.Add( "前のペイン", 2188 );
   wMenu.Add( "次のペイン*", 2187 ); //
   // wMenu.Add( "アクティブなペイン", 2189, ( d == document ) *2 );
   wMenu.Add( "前のペイン*", 2188 ); //
   // wMenu.Add( "-----", 0, meMenuSeparator );
   wMenu.Add( "アクティブなペイン*", 2189, ( d == document ) *2 ); //
   wMenu.Add( "-----*", 0, meMenuSeparator ); //
}
   wMenu.Add( "タブを有効にする(&T)", 2190, editor.EnableTab *1 );
   wMenu.Add( "タブを有効にする(&T)", 2190, editor.EnableTab *1 );
   wMenu.Add( "-----", 0, meMenuSeparator );
   wMenu.Add( "-----", 0, meMenuSeparator );
543行目: 646行目:
   wMenu.Add( "前の文書(&P)", 2196 );
   wMenu.Add( "前の文書(&P)", 2196 );
   wMenu.Add( "-----", 0, meMenuSeparator );
   wMenu.Add( "-----", 0, meMenuSeparator );
   /* タブ一覧 を自動で列挙 */
   /* タブ一覧を列挙 */
   for ( var i = 0, docu; i < dsCount; i ++ ) {
   for ( var i = 0, docu; i < dsCount; i ++ ) {
     id = i + 300;
     id = i + 300;
     docu = docus.Item( i );
     docu = docus.Item( i );
     num = ( "  " + ( i + 1 ) ).slice( - dsWidth ).replace( /\d$/, "&$&: " );
     num = ( "  " + ( i + 1 ) ).slice( - dsWidth ).replace( /\d$/, "&$&: " );
     label = num + ( docu.FullName || untitled )
     label = docu.FullName || untitled;
     wMenu.Add( label, id, ( docu == d ) *1 );
     wMenu.Add( num + label, id, ( docu == d ) *1 );
   }
   }


577行目: 680行目:
   }
   }


   // クリップボード履歴をすべて削除する
   // クリップボード履歴をすべて削除する**
   else if ( r == 17 && Confirm( cbClearStr ) ) {
   else if ( r == 17 && Confirm( cbClearStr ) ) {
     for ( var i = 0; i < cbCount; i ++ ) {
     for ( var i = 0; i < cbCount; i ++ ) {
583行目: 686行目:
     }
     }
     Status = " クリップボード履歴からすべてのアイテムを削除しました。";
     Status = " クリップボード履歴からすべてのアイテムを削除しました。";
  }
  // 現在の編集モードのプロパティ**
  else if ( r == 18 ) {
    WshShell.SendKeys( "%P" );
    editor.ExecuteCommandByID( MEID_VIEW_MODE_CUSTOMIZE = 2144 );
  }
  // このマクロを実行**
  else if ( r == 19 ) {
    editor.ExecuteCommandByID( MEID_MACROS_SELECT_THIS = 2175 ); // これを選択
    WshShell.SendKeys( "{F4}" ); // マクロの実行
  }
  // 拡張メニュー**
  else if ( r >= 20 && r <= 34 ) {
    switch ( r ) {
      case 20: // ファイルのプロパティを開く
      var Shell = new ActiveXObject( "Shell.Application" );
      Shell.NameSpace( folderPath.replace( /\\+$/g, "" ) )
          .ParseName( fileName )
          .InvokeVerb( "プロパティ(&R)" );
      break;
      case 21: case 22: case 23: case 24: // パスをコピー
      var data = ( r == 21 ) ? fileName // ファイル名をコピー
              : ( r == 22 ) ? fullPath // フルパスをコピー
              : ( r == 23 ) ? folderPath // 親フォルダのパスをコピー
              :/* r == 24 */  meryPath; // Mery のフルパスをコピー
      cb.SetData( data.replace( /\\/g, "\\$&" ) );
      break;
      case 25: case 26: case 27: // フォルダを開く
      var path = ( r == 25 ) ? fullPath // 親フォルダ
              : ( r == 26 ) ? meryPath // Mery フォルダ
              :/* r == 27 */  iniPath; // ユーザーフォルダ
      WshShell.Run( "explorer /select,\"" + ( path ) + "\"" );
      break;
      case 28: case 29: case 30: case 31: case 32: case 33:
      var folder = ( r == 28 ) ? macroDir // Macros フォルダ
                : ( r == 29 ) ? autoSaveDir // 自動保存フォルダ
                : ( r == 30 ) ? backupDir // バックアップフォルダ
                : ( r == 31 ) ? desktoptDir // デスクトップフォルダ
                : ( r == 32 ) ? documentsDir // マイドキュメントフォルダ
                :/* r == 33 */  currentDir; // 作業フォルダ
      WshShell.Run( "\"" + folder + "\"");
      break;
      case 34: // メモ帳で開く
      WshShell.Run( "notepad.exe \"" + fullPath + "\"");
      break;
    }
   }
   }


609行目: 765行目:
} catch ( err ) { Status = err.message; }
} catch ( err ) { Status = err.message; }


/**
* 関数 XMenu( objMenu, docuPath, portableMode )
* ファイルメニュー拡張
*/
function XMenu( objMenu, fullPath, portableMode, autoSaveDir, backupDir ) {
  objMenu.AddPopup( "拡張メニュー(&X)**", xMenu = CreatePopupMenu() );
  if ( fullPath ) {
    xMenu.Add( "プロパティ(&R)...", 20 );
    xMenu.Add( "", 0, meMenuSeparator );
    xMenu.Add( "ファイル名をコピー(&N)", 21 );
    xMenu.Add( "フルパスをコピー(&P)", 22 );
    xMenu.Add( "メモ帳で開く(&O)", 34 );
    xMenu.Add( "", 0, meMenuSeparator );
    xMenu.Add( "親フォルダのパスをコピー(&F)", 23 );
    xMenu.Add( "親フォルダを開く(&D)", 25 );
    xMenu.Add( "", 0, meMenuSeparator );
  }
    xMenu.Add( "Mery のフルパスをコピー(&E)", 24 );
    xMenu.Add( "Mery フォルダを開く(&M)", 26 );
    xMenu.Add( "Macros フォルダを開く(&S)", 28 );
    xMenu.Add( "自動保存フォルダを開く(&A)", 29, ! Fso.FolderExists( autoSaveDir ) *2 );
    xMenu.Add( "バックアップフォルダを開く(&B)", 30, ! Fso.FolderExists( backupDir ) *2 );
  if ( ! portableMode ) {
    xMenu.Add( "ユーザーフォルダを開く(&U)", 27 );
  }
    xMenu.Add( "", 0, meMenuSeparator );
    xMenu.Add( "デスクトップフォルダを開く(&H)", 31 );
    xMenu.Add( "マイドキュメントフォルダを開く(&D)", 32 );
    xMenu.Add( "作業フォルダを開く(&C)", 33 );
  objMenu.Add( "", 0, meMenuSeparator );
}


/**
/**
649行目: 837行目:
   // GetIniOption() バージョン
   // GetIniOption() バージョン
   // 引数の配列をループ処理して ini からオプションの値を取得する
   // 引数の配列をループ処理して ini からオプションの値を取得する
   var reg, value, iniOptionArray = [];
   var reg1, value, iniOptionArray = [];
   for ( var i = 0, len = keyArray.length; i < len; i ++ ) {
   for ( var i = 0, len = keyArray.length; i < len; i ++ ) {
     reg = new RegExp( "^" + keyArray[i] + "=(.*?)$" , "m" );
     reg1 = new RegExp( "^" + keyArray[i] + "=(.*?)$" , "m" );
     value = reg.exec( iniText )[1] || "";
     try { value = reg1.exec( iniText )[1]; }
    catch ( e ) { value = 0; } // エラーがあっても継続
     iniOptionArray.push( value );
     iniOptionArray.push( value );
   }
   }
709行目: 898行目:
function LatestClosedFile( num, hisPath ) {
function LatestClosedFile( num, hisPath ) {
   var closedFile = "",  closedFileArray = [];
   var closedFile = "",  closedFileArray = [];
  var num = ( num > 0 ) ? num : 1;
   var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
   var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
   if ( ! Fso.FileExists( hisPath ) ) { return closedFile; }
   if ( ! num || ! Fso.FileExists( hisPath ) ) { return closedFile; }


   // Mery.his を読みこむ
   // Mery.his を読みこむ
724行目: 912行目:
   // Mery.his からファイルパスを抽出し、後ろから順にチェック
   // Mery.his からファイルパスを抽出し、後ろから順にチェック
   var hisArray = hisText.match( /^\[.+\]$/gm );
   var hisArray = hisText.match( /^\[.+\]$/gm );
  if ( ! hisArray ) { return closedFile; }
   hisArray.reverse();
   hisArray.reverse();
   var hCount = hisArray.length;
   var hCount = hisArray.length;
729行目: 918行目:
   var docus,  dCount,  hit;
   var docus,  dCount,  hit;
   outerLoop:
   outerLoop:
   for ( var i = 0; i < hCount, closedFileArray.length < num; i ++ ) {
   for ( var i = 0; i < hCount && closedFileArray.length < num; i ++ ) {
     closedFile = hisArray[i].slice( 1, -1 );
     closedFile = hisArray[i].slice( 1, -1 );
     for ( var ee = 0, hit = false; ee < eCount; ee ++ ) {
     for ( var ee = 0, hit = false; ee < eCount; ee ++ ) {
800行目: 989行目:
  *  
  *  
  * ・行頭空白を除去、空白文字を圧縮: →「›」(U+203A)
  * ・行頭空白を除去、空白文字を圧縮: →「›」(U+203A)
  * ・改行記号を可視化: →「↲」(U+21B2) または「⏎」(U+23CE)
  * ・改行記号を可視化: →「↲」(U+21B2) または「⏎」(U+23CE)
  * ・削られてしまう「&」を補完
  * ・削られてしまう「&」を補完
  * ・「¥」(U+005C) を「∖」に置換: →「∖」(U+2216)
  * ・「¥」(U+005C) を「∖」に置換: →「∖」(U+2216)
833行目: 1,022行目:
* 2019/10/29 (sukemaru)
* 2019/10/29 (sukemaru)
: ベータ版 2.8.1 以降でないとエラーになる「クリップボード履歴」の取得コードを使っているのを忘れていました…。
: ベータ版 2.8.1 以降でないとエラーになる「クリップボード履歴」の取得コードを使っているのを忘れていました…。
: また、第2版のコードには、(個人的な趣味で入れた)マクロの表示名から「js」の拡張子や先頭の連番などを消す処理が入ってしまっています。
: 第3版で修正しておきました。
: 第3版で修正しておきました。
* 2019/10/30 (sukemaru)
: 初期設定状態からほとんど弄っていない Mery だと設定項目のいくつかは Mery.ini に反映されていない状態らしく、扱いが難しいです。

2019年10月30日 (水) 19:45時点における版

機能


メニューバーの全項目をひとつのポップアップメニューにまとめて表示します。


  • [ ファイル(F) / 編集(E) / 検索(S) / 表示(V) / マクロ(M) / ツール(T) / ウィンドウ(W) / ヘルプ(H) ] の各メニュー項目とそれらのサブメニューを再現してあります。
  • 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 「辞書」 「クリップボード履歴」 「タブ一覧」 は、自動で取得します(Mery.ini や Mery.his を読みこむ)。
  • ショートカットキーまたはツールバーアイコンからの起動を想定しています。
※ このマクロを導入しても、エディタウインドウの「メニューバー」を非表示にすることはできないので、たいした意味はありません…。


  • ポップアップメニューの表示位置は、ソースコード内の設定項目 menuPosMouse から変更可能です(デフォルト状態ではマウスポインタの位置に表示)。
  • 標準メニューでは表示されない、ポップアップメニューやキーボードショートカット用のコマンドを表示できます。
→ ソースコード内の設定項目 xMenuEnable (デフォルト状態では非表示)
  • ベータバージョン 2.8.6 までで追加されたものを含めて、すべてのコマンドを表示できます。
→ バージョンチェックによるグレーアウト処理を追加


制限事項

  • 多分 Mery ver 2.6.7 以降であれば動作するはずです。
「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 の一覧が表示されないときは、それぞれの設定ダイアログを開いて [ OK ] ボタンで閉じると表示されるようになるはず。
  • すべてのメニュー項目の 完全な再現は無理 です( "エディタの状態" について、マクロからは取得できない部分が多々あるため)。
  • 項目を グレーアウト させる条件の完全な再現は無理
  • トグル項目などの左につける ✔ チェックマーク の完全な再現は無理
  • メニュー右側の ショートカットキー の表示は無し(マクロのショートカットキーを取得できないので、全部まとめて無視した)
  • ファイルメニューの「最近のファイル」の履歴の再現は無理 → 「最近閉じたファイル」の履歴で代替
  • 表示メニュー配下の「フォント」の履歴の表示は無理
  • ウインドウメニューの「タブ一覧」のアイテムの「無題-<x>」の連番の再現は無理
  • ツールメニュー >> HTML Tidy >> 「ドキュメントの整形」 が起動しない(ExecuteCommandByID 側の問題?)
  • マクロ名」の自動取得は困難なので、実体ファイルのファイル名(e.g. HogeHoge.js)で表示します。
  • Mery Wiki に収録されている「プラグイン名」は表示できますが、DLL ファイルをリネームしている場合はファイルのベース名で表示します。
  • スペルチェック用の「辞書名」は、実体ファイル(拡張子 AFF)のファイル名順で表示しますが、本来の表示順のルールが不明のため、辞書の切り替えが正しく機能しないかも。
  • クリップボード履歴」は Mery ver 2.8.1 以降であれば 16 件まで表示されるはずです。
    2.8.0 以前のバージョンでは最新の 1 件しか表示できません(外部のアプリでテキスト以外のデータを「コピー」しているときは 0 件になる)。


  • 任意で項目の配置を変更しても差しつかえありませんが、Add() メソッドの第2引数(ExecuteCommandByID() メソッドに渡す定数)は変更しないで下さい。


ダウンロード

>> 「ファイル:コンパクトメニュー.zip」 (アイコン入り)

  • 2019/10/30:(修正第4版)
・拡張メニューを追加
・バージョンチェックによるグレーアウト処理を追加
・関数のエラーを修正
  • 2019/10/29:(修正第3版)
「クリップボード履歴」の取得はベータ版 2.8.1 以降でないとエラーになるので回避処理を追加


ソースコード

#title = "コンパクトメニュー2"
#tooltip = "メニューバーの全アイテムを階層化表示"
#icon = "menu+.ico"

/**
 * ---------------------------------------------------------
 * コンパクトメニュー2
 * sukemaru, 2019/10/25 - 2019/10/30
 * 
 * メニューバーのアイテムをポップアップメニューで階層化して表示する
 * ※ ショートカットキーまたはツールバー(マクロバー)アイコンからの起動用
 * ---------------------------------------------------------
 * 2019/10/30: 拡張メニューを追加。バージョンチェックを追加
 * 
 * 【仕様上の制限】
 * ・すべてのメニュー項目の完全な再現は無理。
 * ・状況に応じた項目のグレーアウトの完全な再現は無理。
 * ・トグル項目などの左につける ✔ チェックマークの再現は無理。
 * ・ウインドウメニューのタブ一覧のアイテムの 「無題-x」 の連番の再現は無理。
 * 
 * ・ver 2.6.8 以降のベータ版での追加項目は、バージョンチェックによりグレーアウト
 *   (現状では、バージョンチェックによる項目の不可視化には非対応)。
 * ・「フォント」 の履歴アイテムの列挙は無し (ExecuteCommandByID の対象外)。
 * ・ショートカットキーの表示は無し (マクロのショートカットキーを取得できない)。
 * ・マクロ名 ( #title ) の自動取得は面倒なので、実体ファイル名で表示。
 * ・「クリップボード履歴」 は Mery ver 2.8.1 以降であれば 16 件まで表示されるはず。 
 *   ver 2.8.0 以前のバージョンでは最新の 1 件のみ
 *   (外部のアプリでテキスト以外のデータを「コピー」しているときは 0 件)。
 * 
 * ※ ツール >> HTML Tidy >> ドキュメントの整形 ができない。
 * 
 * ※ Mery を初期設定状態のまま使っている場合、
 *   「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 は
 *   それぞれの設定ダイアログを開いて [OK] で閉じたことがないと
 *   Mery.ini に書きこまれないので、ポップアップメニューに表示されない。
 */

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

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

// ■ クリップボード履歴で表示する文字数の目安
var menuWidth = 60;

// ■ 拡張メニューを表示する (ファイルメニューの拡張と、非表示機能の可視化)
var xMenuEnable = true;	// true: 表示する / false: 表示しない

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


// 【準備】
var start = new Date();
var d = editor.ActiveDocument,  s = d.selection;
var Fso		 = new ActiveXObject( "Scripting.FileSystemObject" );
var WshShell = new ActiveXObject( "WScript.Shell" );

// Mery フォルダとデータフォルダ
var meryPath = editor.FullName;
var mery	 = Fso.GetBaseName( meryPath );
var meryDir	 = Fso.GetParentFolderName( meryPath ) + "\\";
var iniPath	 = meryDir + mery + ".ini";
var hisPath	 = meryDir + mery + ".his";
var dicsDir	 = meryDir + "Dicts\\";
var profileDir = meryDir;
if ( ! Fso.FileExists( iniPath ) ) {
  profileDir = WshShell.SpecialFolders( "APPDATA" ) + "\\Mery\\";
  iniPath	 = profileDir + mery + ".ini";
  hisPath	 = profileDir + mery + ".his";
}

// Mery.ini から各種データを取得
// 戻り値は [ iniOptionArray, modeArray, macroArray, pluginArray, toolArray ];
var iniKey	 = [ "MaxRecentFile", "Untitled", "MacrosRunAction"
               , "AutoSaveFolder", "BackupFolder"] ;
var iniItem	 = GetIniOptionCM( iniKey, iniPath );

// 「最後に閉じたファイル」の準備
// 表示数は「オプション」の「最近のファイルの表示数」の設定値を利用する
var maxRecentFile = Number( iniItem[0][0] );
var recentFiles	 = LatestClosedFile( maxRecentFile, hisPath );
var lcCount		 = recentFiles.length;
var lcWidth		 = ( "" + lcCount ).length || 1;

// 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 の準備
var dMode		 = d.Mode;
var modeArray	 = iniItem[1];
var mdCount		 = modeArray.length;
var macroArray	 = iniItem[2];
var mcCount		 = macroArray.length;
var mcWidth		 = ( "" + mcCount ).length;
var pluginArray	 = iniItem[3];
var plCount		 = pluginArray.length;
var plWidth		 = ( "" + plCount ).length;
var toolArray	 = iniItem[4];
var tlCount		 = toolArray.length;
var tlWidth		 = ( "" + tlCount ).length;

// 「クリップボード履歴」の準備
var cb		 = ClipboardData;
var cbData	 = cb.GetData();
var cbData0;
if ( VersionCheck( "2.8.1" ) ) {	// ベータ版 2.8.1 以降
  var cbData0 = cb.GetData( 0 );
  var cbArray = [];
  for ( var i = 0, cbItem;  ; i ++ ) {
    cbItem = cb.GetData( i ) || "";
    if ( ! cbItem ) { break; }
    // 重複するアイテムを履歴から削除
    for ( var j = i + 1, cbNextItem;  ; j ++ ) {
      cbNextItem = cb.GetData( j ) || "";
      if ( ! cbNextItem ) { break; }
      if ( cbItem == cbNextItem ) { cb.ClearData( j -- ); }
    }
    cbArray.push( cbItem );	// 履歴のアイテムを配列に追加
  }
  var cbCount	 = cbArray.length;
  var cbWidth	 = ( "" + cbCount ).length;
}

// 「辞書」の準備
var dicsArray	 = GetDics( dicsDir );
var dcCount		 = dicsArray.length;
var dcWidth		 = ( "" + dcCount ).length;

// 「タブ一覧」の準備
var docus	 = editor.Documents;
var dsCount	 = docus.Count;
var dsWidth	 = ( "" + dsCount ).length;
var untitled = iniItem[0][1] || "無題";

// 拡張メニューの準備
if ( xMenuEnable ) {
  var fullPath		 = Fso.FileExists( d.FullName ) ? d.FullName : "";
  var fileName		 = fullPath ? d.Name : "";
  var folderPath	 = fullPath ? d.Path : "";
  var macroDir		 = meryDir + "macros\\";
  var autoSaveDir	 = iniItem[0][3] || "";
  var backupDir		 = iniItem[0][4] || "";
  var desktoptDir	 = WshShell.SpecialFolders( "Desktop" );
  var documentsDir	 = WshShell.SpecialFolders( "MyDocuments" );
  var currentDir	 = WshShell.CurrentDirectory;
  var portableMode	 = ( profileDir == meryDir );
  var reg			 = /^\.(?:js|pl|php|py|rbs|vbs)$/i;
  var ext			 = fileName.substr( fileName.lastIndexOf( "\." ) );
  var runFlags		 = ( blank || unnamed || ! reg.test( ext ) *2 );
}


// 【ポップアップメニュー項目】
var menu	 = CreatePopupMenu();
var id,  num,  label;

// オプションフラグ
var unnamed	 = d.FullName ? 0 : meMenuGrayed;	// 無題タブ
var saved	 = d.Saved ? 0 : meMenuGrayed;		// 保存済み
var empty	 = s.IsEmpty ? meMenuGrayed : 0;	// 選択範囲なし
var readOnly = d.ReadOnly ? meMenuGrayed : 0;	// 書き換え禁止
var blank	 = d.Text ? 0 : meMenuGrayed;		// 白紙の文書
var multi	 = ( editors.Count == 1 ) ? meMenuGrayed : 0;	// 複数ウインドウ
var sqlDll	 = Fso.FileExists( meryDir + "sqlfmt.dll" );	// SQL 整形
var v2_6_9	 = VersionCheck( "2.6.9" )  ? 0 : meMenuGrayed;
var v2_6_12	 = VersionCheck( "2.6.12" ) ? 0 : meMenuGrayed;
var v2_6_13	 = VersionCheck( "2.6.13" ) ? 0 : meMenuGrayed;
var v2_6_15	 = VersionCheck( "2.6.15" ) ? 0 : meMenuGrayed;
var v2_7_0	 = VersionCheck( "2.7.0" )  ? 0 : meMenuGrayed;
var v2_7_5	 = VersionCheck( "2.7.5" )  ? 0 : meMenuGrayed;
var v2_8_0	 = VersionCheck( "2.8.0" )  ? 0 : meMenuGrayed;
// ( typeof d.LineEnding == "number" )
var eol		 = VersionCheck( "2.6.10" )
             ? d.LineEnding : undefined;	// 改行モード
var dEnc	 = d.Encoding;					// エンコード
var utf8	 = ( dEnc == 65001 || dEnc == 650011 || dEnc == 650010 )
			 ? meMenuChecked : 0;
var utf16le	 = ( dEnc == 65537 || dEnc == 655371 || dEnc == 655370 )
			 ? meMenuChecked : 0;
var utf16be	 = ( dEnc == 65538 || dEnc == 655381 || dEnc == 655380 )
			 ? meMenuChecked : 0;


// 「ファイル」メニュー
/* 「最近開いたファイル」の替わりに「最後に閉じたファイル」を表示 */
menu.AddPopup( "ファイル(&F)", fMenu = CreatePopupMenu() );
  // 拡張メニュー
  if ( xMenuEnable ) {
    XMenu( fMenu, fullPath, portableMode, autoSaveDir, backupDir );
  }
  fMenu.Add( "新規作成(&N)", 2061 );
  fMenu.Add( "開く(&O)...", 2062 );
  fMenu.Add( "閉じて開く(&D)...", 2063 );
  fMenu.Add( "上書き保存(&S)", 2064, unnamed || saved );
  fMenu.Add( "名前を付けて保存(&A)...", 2065 );
  fMenu.Add( "すべて保存(&L)", 2066 );
  fMenu.Add( "-----", 0, meMenuSeparator );
  /* 「自動保存」ON/OFF の ✔ チェックマーク表示は不可 */
  fMenu.Add( "自動保存(&U)", 2240, v2_6_9 );
  fMenu.Add( "-----", 0, meMenuSeparator );
  fMenu.Add( "挿入(&I)...", 2067 );
if ( unnamed ) {
  fMenu.Add( "読みなおし(&R)", 0, meMenuGrayed );
} else {
  fMenu.AddPopup( "読みなおし(&R)", rlMenu = CreatePopupMenu() );
    rlMenu.Add( "自動選択(&A)", 2068 );
    rlMenu.Add( "-----", 0, meMenuSeparator );
    rlMenu.Add( "&UTF-16LE", 2069, utf16le );
    rlMenu.Add( "UTF-1&6BE", 2070, utf16be );
    rlMenu.Add( "UTF-&8", 2071, utf8 );
    rlMenu.Add( "UTF-&7", 2072, ( dEnc == 65000 ) *1 );
    rlMenu.Add( "-----", 0, meMenuSeparator );
    rlMenu.Add( "アラビア語", 2073, ( dEnc == 1256 ) *1 );
    rlMenu.Add( "バルト言語", 2074, ( dEnc == 1257 ) *1 );
    rlMenu.Add( "中央ヨーロッパ言語", 2075, ( dEnc == 1250 ) *1 );
    rlMenu.Add( "簡体中国語 (GB2312)", 2076, ( dEnc == 936 ) *1 );
    rlMenu.Add( "繁体中国語 (Big5)", 2077, ( dEnc == 950 ) *1 );
    rlMenu.Add( "キリル言語", 2078, ( dEnc == 1251 ) *1 );
    rlMenu.Add( "ギリシャ語", 2079, ( dEnc == 1253 ) *1 );
    rlMenu.Add( "ヘブライ語", 2080, ( dEnc == 1255 ) *1 );
    rlMenu.Add( "日本語 (&EUC)", 2081, ( dEnc == 51932 ) *1 );
    rlMenu.Add( "日本語 (&JIS)", 2082, ( dEnc == 50222 ) *1 );
    rlMenu.Add( "日本語 (シフト JI&S)", 2083, ( dEnc == 932 ) *1 );
    rlMenu.Add( "韓国語", 2084, ( dEnc == 949 ) *1 );
    rlMenu.Add( "タイ語", 2085, ( dEnc == 874 ) *1 );
    rlMenu.Add( "トルコ語", 2086, ( dEnc == 1254 ) *1 );
    rlMenu.Add( "ベトナム語", 2087, ( dEnc == 1258 ) *1 );
    rlMenu.Add( "西ヨーロッパ言語", 2088, ( dEnc == 1252 ) *1 );
}
if ( typeof eol == "number" ) {
  fMenu.AddPopup( "改行コード(&G)", leMenu = CreatePopupMenu() );
    leMenu.Add( "CR+LF (Windows)", 100, ( eol == 0 ) *1 );
    leMenu.Add( "CR (Macintosh)", 101, ( eol == 1 ) *1 );
    leMenu.Add( "LF (UNIX)", 102, ( eol == 2 ) *1 );
} else {
  fMenu.Add( "改行コード(&G)", 0, meMenuGrayed );
}
  fMenu.Add( "-----", 0, meMenuSeparator );
  fMenu.Add( "印刷(&P)...", 2092 );
  fMenu.Add( "印刷プレビュー(&W)...", 2093 );
  fMenu.Add( "-----", 0, meMenuSeparator );
  /* 最後に閉じたファイルを列挙 */
  if ( maxRecentFile > 0 && lcCount ) {
    for ( var i = 0; i < lcCount; i ++ ) {
      id = i + 200;
      num = ( "  " + ( i + 1 ) ).slice( - lcWidth ).replace( /\d$/, "&$&: " );
      label = recentFiles[i]	// .replace( /.+?([^\\]+\\)([^\\]+)$/, "$1 $2" );
      fMenu.Add( num + label, id );
    }
    fMenu.Add( "-----", 0, meMenuSeparator );
  }
  fMenu.Add( "保存して閉じる(&E)", 2094 );
  fMenu.Add( "閉じる(&C)", 2095 );
  fMenu.Add( "-----", 0, meMenuSeparator );
if ( xMenuEnable ) {
  fMenu.Add( "他のタブをすべて閉じる(&Z)*", 2249, v2_7_5 );	//
  fMenu.Add( "左のタブをすべて閉じる(&H)*", 2250, v2_7_5 );	//
  fMenu.Add( "右のタブをすべて閉じる(&M)*", 2251, v2_7_5 );	//
  fMenu.Add( "-----", 0, meMenuSeparator );	//
}
  fMenu.Add( "すべて保存して閉じる(&V)", 2096 );
  fMenu.Add( "すべて閉じる(&X)", 2097 );

// 「編集」メニュー
menu.AddPopup( "編集(&E)", eMenu = CreatePopupMenu() );
  eMenu.Add( "元に戻す(&U)", 2098, readOnly );
  eMenu.Add( "やり直し(&R)", 2099, readOnly );
  eMenu.Add( "-----", 0, meMenuSeparator );
  eMenu.Add( "切り取り(&T)", 2100, readOnly );
  eMenu.Add( "コピー(&C)", 2101 );
  eMenu.Add( "貼り付け(&P)", 2103, readOnly );
  eMenu.Add( "引用つきコピー(&Q)", 2102 );
if ( xMenuEnable ) {
  eMenu.Add( "引用つき貼り付け(&W)*", 2200, readOnly );	//
}
  eMenu.Add( "削除(&L)", 2104, readOnly );
  eMenu.Add( "-----", 0, meMenuSeparator );
  eMenu.Add( "すべて選択(&A)", 2105 );
  eMenu.Add( "日付と時刻(&D)", 2106, readOnly );
  eMenu.Add( "-----", 0, meMenuSeparator );
if ( xMenuEnable ) {
  eMenu.Add( "リンクをコピー(&H)*", 2201 );	//
  eMenu.Add( "リンクを開く(&O)*", 2202 );	//
  eMenu.Add( "-----*", 0, meMenuSeparator );	//
}
  eMenu.Add( "行へ移動(&G)...", 2107 );
if ( xMenuEnable ) {
  eMenu.Add( "ファイルへ移動(&F)*", 2108 );	//
  eMenu.Add( "-----*", 0, meMenuSeparator );	//
  eMenu.Add( "最後に編集した位置へ移動(&L)*", 2241, v2_6_9 );	//
  eMenu.Add( "次の変更行(&N)*", 2243, v2_6_12 );	//
  eMenu.Add( "前の変更行(&M)*", 2244, v2_6_12 );	//
  eMenu.Add( "-----*", 0, meMenuSeparator );	//
  eMenu.Add( "挿入/上書の切り替え(&I)*", 2125 );	//
}
  eMenu.Add( "書き換え禁止(&Y)", 2109, readOnly /2 );
  eMenu.Add( "-----", 0, meMenuSeparator );
  eMenu.AddPopup( "選択範囲の変換(&S)", cvMenu = CreatePopupMenu() );
    cvMenu.Add( "改行を挿入(&R)", 2110, empty || readOnly );
    cvMenu.Add( "改行を削除(&E)", 2111, empty || readOnly );
    cvMenu.Add( "-----", 0, meMenuSeparator );
    cvMenu.Add( "行の分割(&S)", 2112, empty || readOnly );
    cvMenu.Add( "行の統合(&J)", 2113, empty || readOnly );
    cvMenu.Add( "-----", 0, meMenuSeparator );
  if ( xMenuEnable ) {
    cvMenu.Add( "行切り取り*", 2217, readOnly );	//
    cvMenu.Add( "行コピー*", 2218 );	//
    cvMenu.Add( "行削除*", 2219, readOnly );	//
    cvMenu.Add( "行右削除*", 2220, readOnly );	//
    cvMenu.Add( "行左削除*", 2221, readOnly );	//
    cvMenu.Add( "-----", 0, meMenuSeparator );	//
    cvMenu.Add( "単語の削除*", 2222, readOnly );	//
    cvMenu.Add( "単語の右削除*", 2223, readOnly );	//
    cvMenu.Add( "単語の左削除*", 2224, readOnly );	//
    cvMenu.Add( "-----", 0, meMenuSeparator );	//
  }
    cvMenu.Add( "大文字に変換(&U)", 2114, empty || readOnly );
    cvMenu.Add( "小文字に変換(&L)", 2115, empty || readOnly );
    cvMenu.Add( "単語の最初の文字を大文字に変換(&A)", 2116, empty || readOnly );
    cvMenu.Add( "-----", 0, meMenuSeparator );
    cvMenu.Add( "半角に変換(&H)", 2117, empty || readOnly );
    cvMenu.Add( "全角に変換(&F)", 2118, empty || readOnly );
    cvMenu.Add( "-----", 0, meMenuSeparator );
    cvMenu.Add( "空白をタブに変換(&T)", 2119, empty || readOnly );
    cvMenu.Add( "タブを空白に変換(&N)", 2120, empty || readOnly );
    cvMenu.Add( "-----", 0, meMenuSeparator );
    cvMenu.Add( "インデント(&I)", 2121, empty || readOnly );
    cvMenu.Add( "逆インデント(&D)", 2122, empty || readOnly );
    cvMenu.Add( "-----", 0, meMenuSeparator );
    cvMenu.Add( "再変換(&V)", 2123, empty || readOnly );
    cvMenu.Add( "文字コードの切り替え(&O)", 2245, readOnly || v2_6_13 );
    cvMenu.Add( "-----", 0, meMenuSeparator );
    cvMenu.Add( "Base64 デコード(&B)...", 2124, empty );
    cvMenu.Add( "Base64 エンコード(&C)...", 2239, readOnly  );
  eMenu.AddPopup( "ブックマーク(&B)", bmMenu = CreatePopupMenu() );
    bmMenu.Add( "ブックマークを設定/解除(&T)", 2126 );
    bmMenu.Add( "次のブックマーク(&N)", 2127 );
    bmMenu.Add( "前のブックマーク(&P)", 2128 );
    bmMenu.Add( "-----", 0, meMenuSeparator );
    bmMenu.Add( "ブックマークをクリア(&C)", 2129 );
  eMenu.AddPopup( "スペルチェック(&E)", scMenu = CreatePopupMenu() );
    /* スペルチェック配下の ✔ チェックマーク表示はすべて無理 */
    scMenu.Add( "スペルチェック(&C)", 2130 );
    scMenu.AddPopup( "スペルチェックを行う場所(&I)", spMenu = CreatePopupMenu() );
      /* 「場所」のアイテムのグレーアウトは無理 */
      spMenu.Add( "すべて(&A)", 2207 );
      spMenu.Add( "-----", 0, meMenuSeparator );
      spMenu.Add( "1重引用符で囲まれた文字列(&S)", 2208 );
      spMenu.Add( "2重引用符で囲まれた文字列(&D)", 2209 );
      spMenu.Add( "コメント(&C)", 2210 );
      spMenu.Add( "スクリプト(&R)", 2211 );
      spMenu.Add( "タグ(&T)", 2212 );
      spMenu.Add( "強調文字列(&H)", 2213 );
      spMenu.Add( "ハイパーリンク(&Y)", 2214 );
      spMenu.Add( "その他(&E)", 2215 );
    scMenu.AddPopup( "辞書(&D)", dicMenu = CreatePopupMenu() );
      /* 辞書一覧を列挙
         Add() の第2引数 id は 4096 からの連番 */
      for ( var i = 0; i < dcCount; i ++ ) {
        id = i + 4096;
        label = /([^\\]+)\.aff$/i.exec( dicsArray[i] )[1];
        num = ( "  " + ( i + 1 ) ).slice( - dcWidth ).replace( /\d$/, "&$&: " );
        dicMenu.Add( num + label, id );
      }
    scMenu.Add( "-----", 0, meMenuSeparator );
    scMenu.Add( "次のスペルミス(&N)", 2131 );
    scMenu.Add( "前のスペルミス(&P)", 2132 );

// 「検索」メニュー
menu.AddPopup( "検索(&S)", sMenu = CreatePopupMenu() );
  sMenu.Add( "検索(&F)...", 2133 );
  sMenu.Add( "次を検索(&N)", 2134 );
  sMenu.Add( "前を検索(&P)", 2135 );
  sMenu.Add( "次の文字列を検索(&X)", 2136 );
  sMenu.Add( "前の文字列を検索(&V)", 2137 );
  sMenu.Add( "-----", 0, meMenuSeparator );
  sMenu.Add( "置換(&R)...", 2138, readOnly );
  sMenu.Add( "-----", 0, meMenuSeparator );
  sMenu.Add( "検索文字列の強調を解除(&E)", 2139 );
  sMenu.Add( "-----", 0, meMenuSeparator );
  sMenu.Add( "ファイルから検索(&I)...", 2140 );
  sMenu.Add( "ファイルから置換(&L)...", 2141 );
  sMenu.Add( "-----", 0, meMenuSeparator );
  sMenu.Add( "Google 検索(&G)", 2142, empty );
  sMenu.Add( "Wikipedia 検索(&W)", 2143, empty );

// 「表示」メニュー
/* トグル項目の ✔ チェックマーク表示は無理 */
menu.AddPopup( "表示(&V)", vMenu = CreatePopupMenu() );
  vMenu.AddPopup( "編集モード(&M)", mdMenu = CreatePopupMenu() );
    mdMenu.Add( "現在の編集モードのプロパティ(&P)...**", 18 );
    mdMenu.Add( "-----**", 0, meMenuSeparator );
    /* 編集モード一覧を列挙
       Add() の第2引数 id は 5120 からの連番 */
    for ( var i = 0; i < mdCount; i ++ ) {
      id = i + 5120;
      label = modeArray[i];
      mdMenu.Add( label, id, ( dMode == label ) *1 )
    }
    mdMenu.Add( "-----", 0, meMenuSeparator );
    mdMenu.Add( "編集モードの設定(&C)...", 2144 );
  vMenu.Add( "-----", 0, meMenuSeparator );
  vMenu.Add( "折り返さない(&N)", 2146 );
  vMenu.Add( "指定文字数で折り返し(&C)", 2147 );
  vMenu.Add( "ウインドウの右端で折り返し(&W)", 2148 );
  vMenu.Add( "-----", 0, meMenuSeparator );
  vMenu.Add( "縦書き(&V)", 2238 );
  vMenu.Add( "色の反転(&I)", 2145 );
  vMenu.Add( "-----", 0, meMenuSeparator );
  vMenu.Add( "行番号(&L)", 2149 );
  vMenu.Add( "ルーラ(&R)", 2150 );
  vMenu.AddPopup( "記号(&A)", sgMenu = CreatePopupMenu() );
    sgMenu.Add( "改行(&L)", 2151 );
    sgMenu.Add( "折り返し(&R)", 2152 );
    sgMenu.Add( "EOF(&E)", 2153 );
    sgMenu.Add( "タブ(&T)", 2154 );
    sgMenu.Add( "半角空白(&S)", 2155 );
    sgMenu.Add( "全角空白(&W)", 2156 );
    sgMenu.Add( "CR と LF を区別して表示(&D)", 2157 );
    sgMenu.Add( "変更行を強調表示(&H)", 2242, v2_6_9 );
  vMenu.Add( "-----", 0, meMenuSeparator );
  vMenu.AddPopup( "ツールバー(&T)", tbMenu = CreatePopupMenu() );
    tbMenu.Add( "標準ツールバー(&S)", 2158 );
    tbMenu.Add( "マクロバー(&M)", 2159 );
    tbMenu.Add( "マーカーバー(&K)", 2227 );
    tbMenu.Add( "プラグインバー(&P)", 2160 );
    tbMenu.Add( "外部ツールバー(&E)", 2161 );
    tbMenu.Add( "-----", 0, meMenuSeparator );
    tbMenu.Add( "ツールバーのタイトル(&O)", 2162 );
    tbMenu.Add( "ツールバーを固定する(&L)", 2163 );
    tbMenu.Add( "マクロバーのラベルを表示(&B)", 2252, v2_8_0 );
    tbMenu.Add( "-----", 0, meMenuSeparator );
    tbMenu.Add( "小アイコン(&A)", 2228 );
    tbMenu.Add( "中アイコン(&D)", 2229 );
    tbMenu.Add( "大アイコン(&R)", 2230 );
    tbMenu.Add( "特大アイコン(&X)", 2231 );
    tbMenu.Add( "-----", 0, meMenuSeparator );
    tbMenu.Add( "カスタマイズ(&C)...", 2164 );
  vMenu.Add( "ステータスバー(&S)", 2165 );
  vMenu.Add( "アウトプット(&O)", 2166, OutputBar.Visible *1 );
  vMenu.Add( "-----", 0, meMenuSeparator );
  vMenu.Add( "全画面表示(&U)", 2203 );
  vMenu.Add( "Zen モード(&Z)", 2246, v2_6_15 );
  vMenu.Add( "タイプライタースクロール(&Y)", 2247, v2_6_15 );
  vMenu.Add( "-----", 0, meMenuSeparator );
if ( xMenuEnable ) {
  vMenu.Add( "スクロールバーのマーカー表示*", 2248, v2_7_0 );	//
  vMenu.Add( "-----", 0, meMenuSeparator );	//
}
  vMenu.AddPopup( "マーカー(&K)", mkMenu = CreatePopupMenu() );
    mkMenu.Add( "マーカーに追加/削除(&A)", 2232 );
    mkMenu.Add( "-----", 0, meMenuSeparator );
    mkMenu.Add( "すべて有効(&E)", 2233 );
    mkMenu.Add( "すべて無効(&D)", 2234 );
    mkMenu.Add( "-----", 0, meMenuSeparator );
    mkMenu.Add( "すべて削除(&L)", 2235 );
    mkMenu.Add( "-----", 0, meMenuSeparator );
    mkMenu.Add( "自動マーカー(&T)", 2236 );
    mkMenu.Add( "-----", 0, meMenuSeparator );
    mkMenu.Add( "マーカーの設定(&C)...", 2237 );
  vMenu.Add( "-----", 0, meMenuSeparator );
  vMenu.AddPopup( "フォント(&F)", ftMenu = CreatePopupMenu() );
    /* 使用したフォントの履歴の取得は無理 */
    ftMenu.Add( "-----", 0, meMenuSeparator );
  if ( xMenuEnable ) {
    ftMenu.Add( "大きいフォントサイズ(&L)*", 2167 );	//
    ftMenu.Add( "小さいフォントサイズ(&S)*", 2168 );	//
    ftMenu.Add( "フォントサイズをリセット(&R)*", 2205 );	//
    ftMenu.Add( "現在のフォントサイズを規定に設定(&D)*", 2206 );	//
    ftMenu.Add( "-----*", 0, meMenuSeparator );	//
  }
    ftMenu.Add( "フォントの設定(&C)...", 2169 );

// 「マクロ」メニュー
/* 「マクロ名」の表示は、各マクロのパスの解決と
   すべての可視マクロの実体ファイルの #title の読み込みが必要。
   実行(R) と 編集(E) の後ろにつけるファイルパスの表示は無理。
   記録/停止(S) による一時マクロがらみの項目の 表示/非表示 の切り替えは無理。 */
menu.AddPopup( "マクロ(&M)", mMenu = CreatePopupMenu() );
  mMenu.Add( "記録/停止(&S)", 2170 );
  mMenu.Add( "実行(&R)  " + ScriptName, 2171 );
if ( xMenuEnable ) {
  mMenu.Add( "一時オプションを設定してマクロ実行(&O)...*", 2204 );	//
}
  mMenu.Add( "-----", 0, meMenuSeparator );
  mMenu.Add( "名前を付けて保存(&A)...", 2172 );
  mMenu.Add( "編集(&E)  " + ScriptName, 2173 );
  mMenu.Add( "選択(&L)...", 2174 );
  mMenu.Add( "これを選択(&T)", 2175, blank || unnamed );
if ( xMenuEnable && iniItem[0][2] == "F4" ) {	//
  mMenu.Add( "このマクロを実行(&G)**  " + fileName, 19, runFlags );	//
}	//
  mMenu.Add( "カスタマイズ(&C)...", 2176 );
  mMenu.Add( "-----", 0, meMenuSeparator );
  /* マクロのファイル名一覧を列挙
     Add() の第2引数 id は 6144 からの連番
    (※ 仕様上、不可視のアイテムにも連番が適用される) */
  for ( var i = 0, j = 1; i < mcCount; i ++ ) {
    if ( macroArray[i].slice( -1 ) != "1" ) { continue; }
    id = i + 6144;
    label = /([^\\]+\.\w+)1$/.exec( macroArray[i] )[1];
    // 拡張子とファイル名の先頭の連番とを削除
    // label = label.replace( /^\d+\.|(?:[((].+[))])?\.js$/g, "" );
    num = ( "  " + ( j ++ ) ).slice( - mcWidth ).replace( /\d$/, "&$&: " );
    mMenu.Add( num + label, id );
  }

// 「ツール」メニュー
menu.AddPopup( "ツール(&T)", tMenu = CreatePopupMenu() );
  tMenu.Add( "オプション(&O)...", 2177 );
  tMenu.Add( "-----", 0, meMenuSeparator );
if ( xMenuEnable ) {
  tMenu.Add( "単語補完*", 2178 );	// 入力補完(オートコンプリート)	//
  tMenu.Add( "-----", 0, meMenuSeparator );	//
}
if ( readOnly ) {
  tMenu.Add( "HTML Tidy(&H)", 0, readOnly );
} else {
  tMenu.AddPopup( "HTML Tidy(&H)", htMenu = CreatePopupMenu() );
    htMenu.Add( "ドキュメントの整形(&C)", 2180 );
    htMenu.Add( "ドキュメントのエラーをチェック(&F)", 2225 );
}
if ( sqlDll ) {
  tMenu.Add( "SQL 整形(&S)", 2179, empty || readOnly );
}
  tMenu.Add( "-----", 0, meMenuSeparator );
  /* クリップボード履歴を列挙 */
  tMenu.AddPopup( "クリップボード履歴(&C)", cbMenu = CreatePopupMenu() );
  if ( cbData0 ) {
    for ( var i = 0; i < cbCount; i ++ ) {
      id = i + 1;
      label = MenuKey( cbArray[i], id, cbWidth, menuWidth );
      cbMenu.Add( label, id, readOnly );
    }
    cbMenu.Add( "", 0, meMenuSeparator );
    cbMenu.Add( "すべての履歴を削除する(&E)**", 17 );	//
  }
  else if ( cbData.length ) {
    cbMenu.Add( MenuKey( cbData, 1, 1, menuWidth ), 1, readOnly );
  }
  tMenu.Add( "-----", 0, meMenuSeparator );
  tMenu.AddPopup( "プラグイン(&I)", plMenu = CreatePopupMenu() );
    /* プラグイン名一覧を列挙
       有効/無効の ✔ チェックマーク表示は無理
       Add() の第2引数 id は 7168 からの連番 */
    for ( var i = 0; i < plCount; i ++ ) {
      id = i + 7168;
      label = GetPluginName( pluginArray[i] );
      num = ( "  " + ( i + 1 ) ).slice( - plWidth ).replace( /\d$/, "&$&: " );
      plMenu.Add( num + label, id );
    }
    plMenu.Add( "-----", 0, meMenuSeparator );
    plMenu.Add( "プラグインの設定(&C)...", 2181 );
  tMenu.AddPopup( "外部ツール(&E)", etMenu = CreatePopupMenu() );
    /* 外部ツール名一覧を列挙
       Add() の第2引数 id は 8192 からの連番 */
    for ( var i = 0; i < tlCount; i ++ ) {
      id = i + 8192;
      label = toolArray[i];
      num = ( "  " + ( i + 1 ) ).slice( - tlWidth ).replace( /\d$/, "&$&: " );
      etMenu.Add( num + label, id );
    }
    etMenu.Add( "-----", 0, meMenuSeparator );
    etMenu.Add( "外部ツールの設定(&C)...", 2182 );
    etMenu.Add( "-----", 0, meMenuSeparator );
    etMenu.Add( "ツールジョブの中止", 2183 );
  tMenu.Add( "-----", 0, meMenuSeparator );
  tMenu.Add( "ポップアップメニューの設定(&P)", 2184 );

// 「ウインドウ」メニュー
/* トグル項目の ✔ チェックマーク表示は無理 */
menu.AddPopup( "ウインドウ(&W)", wMenu = CreatePopupMenu() );
  wMenu.Add( "常に最上位(&A)", 2185 );
  wMenu.Add( "-----", 0, meMenuSeparator );
  wMenu.Add( "上下に分割(&S)", 2186 );
  wMenu.Add( "左右に分割(&L)", 2226 );
  wMenu.Add( "-----", 0, meMenuSeparator );
if ( xMenuEnable ) {
  wMenu.Add( "次のペイン*", 2187 );	//
  wMenu.Add( "前のペイン*", 2188 );	//
  wMenu.Add( "アクティブなペイン*", 2189, ( d == document ) *2 );	//
  wMenu.Add( "-----*", 0, meMenuSeparator );	//
}
  wMenu.Add( "タブを有効にする(&T)", 2190, editor.EnableTab *1 );
  wMenu.Add( "-----", 0, meMenuSeparator );
  wMenu.Add( "重ねて表示(&C)", 2191, multi );
  wMenu.Add( "上下に並べて表示(&H)", 2192, multi );
  wMenu.Add( "左右に並べて表示(&V)", 2193, multi );
  wMenu.Add( "すべて最小化(&M)", 2194 );
  wMenu.Add( "-----", 0, meMenuSeparator );
  wMenu.Add( "次の文書(&N)", 2195 );
  wMenu.Add( "前の文書(&P)", 2196 );
  wMenu.Add( "-----", 0, meMenuSeparator );
  /* タブ一覧を列挙 */
  for ( var i = 0, docu; i < dsCount; i ++ ) {
    id = i + 300;
    docu = docus.Item( i );
    num = ( "  " + ( i + 1 ) ).slice( - dsWidth ).replace( /\d$/, "&$&: " );
    label = docu.FullName || untitled;
    wMenu.Add( num + label, id, ( docu == d ) *1 );
  }

// 「ヘルプ」メニュー
menu.AddPopup( "ヘルプ(&H)", hMenu = CreatePopupMenu() );
  hMenu.Add( "オンラインヘルプ(&O)...", 2197 );
  hMenu.Add( "キーボードマップ(&K)...", 2198 );
  hMenu.Add( "-----", 0, meMenuSeparator );
  hMenu.Add( "バージョン情報(&A)...", 2199 );


// 【ポップアップメニューを表示】
Status = " 「コンパクトメニュー」 マクロ  [ "
       + ( ( new Date() - start ) / 1000 ).toFixed( 3 ).replace( /\./, ". " )
       + " 秒 ]";
var r = menu.Track( menuPosMouse );


// 【コマンドを実行】
try {
  var cbClearStr = "クリップボードのすべての履歴を削除しますか? ";
  if ( r == 0 ) { ; }

  // クリップボード履歴の文字列を貼り付け
  else if ( r < 17 ) {
    d.Write( cbArray[ r -1 ] );
  }

  // クリップボード履歴をすべて削除する**
  else if ( r == 17 && Confirm( cbClearStr ) ) {
    for ( var i = 0; i < cbCount; i ++ ) {
      cb.ClearData( i );
    }
    Status = " クリップボード履歴からすべてのアイテムを削除しました。";
  }

  // 現在の編集モードのプロパティ**
  else if ( r == 18 ) {
    WshShell.SendKeys( "%P" );
    editor.ExecuteCommandByID( MEID_VIEW_MODE_CUSTOMIZE = 2144 );
  }

  // このマクロを実行**
  else if ( r == 19 ) {
    editor.ExecuteCommandByID( MEID_MACROS_SELECT_THIS = 2175 );	// これを選択
    WshShell.SendKeys( "{F4}" );		// マクロの実行
  }

  // 拡張メニュー**
  else if ( r >= 20 && r <= 34 ) {
    switch ( r ) {
      case 20:	// ファイルのプロパティを開く
      var Shell = new ActiveXObject( "Shell.Application" );
      Shell.NameSpace( folderPath.replace( /\\+$/g, "" ) )
           .ParseName( fileName )
           .InvokeVerb( "プロパティ(&R)" );
      break;

      case 21: case 22: case 23: case 24:	// パスをコピー
      var data = ( r == 21 ) ? fileName		// ファイル名をコピー
               : ( r == 22 ) ? fullPath		// フルパスをコピー
               : ( r == 23 ) ? folderPath	// 親フォルダのパスをコピー
               :/* r == 24 */  meryPath;	// Mery のフルパスをコピー
      cb.SetData( data.replace( /\\/g, "\\$&" ) );
      break;

      case 25: case 26: case 27:	// フォルダを開く
      var path = ( r == 25 ) ? fullPath 	// 親フォルダ
               : ( r == 26 ) ? meryPath		// Mery フォルダ
               :/* r == 27 */  iniPath;		// ユーザーフォルダ
      WshShell.Run( "explorer /select,\"" + ( path ) + "\"" );
      break;

      case 28: case 29: case 30: case 31: case 32: case 33:
      var folder = ( r == 28 ) ? macroDir		// Macros フォルダ
                 : ( r == 29 ) ? autoSaveDir	// 自動保存フォルダ
                 : ( r == 30 ) ? backupDir		// バックアップフォルダ
                 : ( r == 31 ) ? desktoptDir	// デスクトップフォルダ
                 : ( r == 32 ) ? documentsDir	// マイドキュメントフォルダ
                 :/* r == 33 */  currentDir;	// 作業フォルダ
      WshShell.Run( "\"" + folder + "\"");
      break;

      case 34:	// メモ帳で開く
      WshShell.Run( "notepad.exe \"" + fullPath + "\"");
      break;
    }
  }

  // 改行コードを変更
  else if ( r >= 100 && r <= 102 ) {
    d.LineEnding = r - 100;
  }

  // 最後に閉じたファイルのアイテムを開く
  else if ( r >= 200 && r < 300 ) {
    if ( ! unnamed || ! strExist ) {
      editor.NewFile();
    }
    editor.OpenFile( recentFile[ r - 200 ] );
  }

  // 選択したタブをアクティブ化
  else if ( r >= 300 && r < 400 ) {
    docus.Item( r - 300 ).Activate();
  }

  // 標準コマンド
  else {
    editor.ExecuteCommandByID( r );
  }
} catch ( err ) { Status = err.message; }


/**
 * 関数 XMenu( objMenu, docuPath, portableMode )
 * ファイルメニュー拡張
 */
function XMenu( objMenu, fullPath, portableMode, autoSaveDir, backupDir ) {
  objMenu.AddPopup( "拡張メニュー(&X)**", xMenu = CreatePopupMenu() );
  if ( fullPath ) {
    xMenu.Add( "プロパティ(&R)...", 20 );
    xMenu.Add( "", 0, meMenuSeparator );
    xMenu.Add( "ファイル名をコピー(&N)", 21 );
    xMenu.Add( "フルパスをコピー(&P)", 22 );
    xMenu.Add( "メモ帳で開く(&O)", 34 );
    xMenu.Add( "", 0, meMenuSeparator );
    xMenu.Add( "親フォルダのパスをコピー(&F)", 23 );
    xMenu.Add( "親フォルダを開く(&D)", 25 );
    xMenu.Add( "", 0, meMenuSeparator );
  }
    xMenu.Add( "Mery のフルパスをコピー(&E)", 24 );
    xMenu.Add( "Mery フォルダを開く(&M)", 26 );
    xMenu.Add( "Macros フォルダを開く(&S)", 28 );
    xMenu.Add( "自動保存フォルダを開く(&A)", 29, ! Fso.FolderExists( autoSaveDir ) *2 );
    xMenu.Add( "バックアップフォルダを開く(&B)", 30, ! Fso.FolderExists( backupDir ) *2 );
  if ( ! portableMode ) {
    xMenu.Add( "ユーザーフォルダを開く(&U)", 27 );
  }
    xMenu.Add( "", 0, meMenuSeparator );
    xMenu.Add( "デスクトップフォルダを開く(&H)", 31 );
    xMenu.Add( "マイドキュメントフォルダを開く(&D)", 32 );
    xMenu.Add( "作業フォルダを開く(&C)", 33 );
  objMenu.Add( "", 0, meMenuSeparator );
}

/**
 * 関数 VersionCheck( versionStr )
 * Mery 本体が引数で指定したバージョン以上かチェックする( i.e. "2.6.9" )
 * 戻り値は、真偽値 true/false
 */
function VersionCheck( versionStr ) {
  var Pad2 = function( str ) {
    return str.replace( /[0-9]+/g , function( digit ) {
      return digit.length < 2 ? "0" + digit : digit
    } )
  };
  var editorVer = + ( Pad2( editor.Version ).replace( /\./g, "" ).slice( 0, 6 ) );
  var requirement = + ( Pad2( versionStr ).replace( /\./g, "" ).slice( 0, 6 ) );
  return ( editorVer >= requirement );
}

/**
 * 関数 GetIniOptionCM( keyArray, iniPath )
 * ※「コンパクトメニュー」マクロ用 魔改造版
 * 
 * 引数 keyArray で指定した INI オプション項目の値と
 * 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 の
 * 一覧をそれぞれ配列で返す
 * 
 * 第1引数: INI オプション項目を指定する配列
 * 第2引数: Mery.ini のフルパス
 */
function GetIniOptionCM( keyArray, iniPath ) {
  // 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();

  // GetIniOption() バージョン
  // 引数の配列をループ処理して ini からオプションの値を取得する
  var reg1, value, iniOptionArray = [];
  for ( var i = 0, len = keyArray.length; i < len; i ++ ) {
    reg1 = new RegExp( "^" + keyArray[i] + "=(.*?)$" , "m" );
    try { value = reg1.exec( iniText )[1]; }
    catch ( e ) { value = 0; }	// エラーがあっても継続
    iniOptionArray.push( value );
  }

  // 編集モード名を取得する
  // \r\n [Modes\Mode##] \r\n Caption=ModeName を抽出
  var reg2 = /\r\n\[Modes\\Mode\d+\]\r\nCaption=[^\r\n]+/g;
  var modeArray = iniText.match( reg2 ) || [];	// 抽出結果の配列
  // ModeName を抽出
  var reg3 = /Caption=([^\r\n]+)/;
  for ( var i = 0, len = modeArray.length; i < len; i ++ ) {
    modeArray[i] = reg3.exec( modeArray[i] )[1];
  }

  // マクロのパスを取得する(末尾に Visible キーの値を付加する)
  // \r\n [Macros\Macro##] \r\n FileName=MacroPath \r\n Visible=# を抽出
  var reg4 = /\r\n\[Macros\\Macro\d+\]\r\nFileName=[^\r\n]+\r\nVisible=\d/g;
  var macroArray = iniText.match( reg4 ) || [];	// 抽出結果の配列
  // MacroPath を抽出
  var reg5 = /\r\nFileName=([^\r\n]+)\r\n/;
  for ( var i = 0, len = macroArray.length; i < len; i ++ ) {
    macroArray[i] = reg5.exec( macroArray[i] )[1]
                  + macroArray[i].slice( -1 );
  }

  // プラグインのパスを取得する
  // \r\n [Plugins\Plugin##] \r\n FileName=PluginPath を抽出
  var reg6 = /\r\n\[Plugins\\Plugin\d+\]\r\nFileName=[^\r\n]+/g;
  var pluginArray = iniText.match( reg6 ) || [];	// 抽出結果の配列
  // PluginPath を抽出
  var reg7 = /FileName=(?:[^\\]+\\)*([^\r\n]+)/;
  for ( var i = 0, len = pluginArray.length; i < len; i ++ ) {
    pluginArray[i] = reg7.exec( pluginArray[i] )[1];
  }

  // 外部ツール名を取得する
  // \r\n [Tools\Tool##] \r\n Caption=ToolName を抽出
  var reg8 = /\r\n\[Tools\\Tool\d+\]\r\nCaption=[^\r\n]+/g;
  var toolArray = iniText.match( reg8 ) || [];	// 抽出結果の配列
  // ToolName を抽出
  var reg9 = /Caption=([^\r\n]+)/;
  for ( var i = 0, len = toolArray.length; i < len; i ++ ) {
    toolArray[i] = reg9.exec( toolArray[i] )[1];
  }

  return [ iniOptionArray, modeArray, macroArray, pluginArray, toolArray ];
}

/**
 * 関数 LatestClosedFile( num, hisPath )
 * 「最後に閉じたファイル」のフルパスの配列を返す
 * 
 * 第1引数: 「最後に閉じたファイル」の件数を指定
 * 第2引数: Mery.his のフルパス
 */
function LatestClosedFile( num, hisPath ) {
  var closedFile = "",  closedFileArray = [];
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  if ( ! num || ! Fso.FileExists( hisPath ) ) { return closedFile; }

  // Mery.his を読みこむ
  var Adodb = new ActiveXObject( "ADODB.Stream" );
  var adTypeText = 2,  adReadAll = -1;
  Adodb.Type = adTypeText,  Adodb.Charset = "UTF-8";
  Adodb.Open();
  Adodb.LoadFromFile( hisPath );
  var hisText = Adodb.ReadText( adReadAll );
  Adodb.Close();
  
  // Mery.his からファイルパスを抽出し、後ろから順にチェック
  var hisArray = hisText.match( /^\[.+\]$/gm );
  if ( ! hisArray ) { return closedFile; }
  hisArray.reverse();
  var hCount = hisArray.length;
  var eCount = Editors.Count;
  var docus,  dCount,  hit;
  outerLoop:
  for ( var i = 0; i < hCount && closedFileArray.length < num; i ++ ) {
    closedFile = hisArray[i].slice( 1, -1 );
    for ( var ee = 0, hit = false; ee < eCount; ee ++ ) {
      docus = Editors.Item( ee ).Documents;
      dCount = docus.Count;
      for ( var dd = 0; dd < dCount; dd ++ ) {
        if ( docus.Item( dd ).FullName == closedFile ) {
          hit = true;
          continue outerLoop;
        }
      }
    }
    // 現在開いていないものを「最後に閉じたファイル」に追加する
    if ( ! hit && Fso.FileExists( closedFile ) ) {
      closedFileArray.push( closedFile );
    }
  }
  return closedFileArray;
}

/**
 * 関数 GetDics( dicsDir )
 * 辞書ファイルのフルパスの配列を返す
 * 
 * 引数: Dics フォルダのフルパス
 */
function GetDics( dir ) {
  var dics = new Enumerator( Fso.GetFolder( dir ).Files );
  var dicsArray = [];
  for ( ; ! dics.atEnd(); dics.moveNext() ) {
    if ( /\.aff$/i.test( dics.item() ) ) {
      dicsArray.push( dics.item() );
    }
  }
  return dicsArray;
}

/**
 * 関数 GetPluginName( dllName )
 * プラグイン.DLL のファイル名から「プラグイン名」を返す
 */
function GetPluginName( dll ) {
  if ( dll.indexOf( "Outline" ) > -1 ) return "アウトライン";
  if ( dll.indexOf( "KureiKei" ) > -1 ) return "プロ生ちゃん";
  if ( dll.indexOf( "LiveStyle" ) > -1 ) return "Emmet LiveStyle";
  if ( dll.indexOf( "AlphaBlend" ) > -1 ) return "半透明";
  if ( dll.indexOf( "ClassView" ) > -1 ) return "クラスビュー";
  if ( dll.indexOf( "Conversion" ) > -1 ) return "半角/全角 変換";
  if ( dll.indexOf( "Favorites" ) > -1 ) return "お気に入り";
  if ( dll.indexOf( "HSPRun" ) > -1 ) return "HSPコンパイル実行";
  if ( dll.indexOf( "Snippets" ) > -1 ) return "スニペット";
  if ( dll.indexOf( "WebPreview" ) > -1 ) return "Webプレビュー";
  if ( dll.indexOf( "ClipboardHistory" ) > -1 ) return "クリップボード履歴";
  if ( dll.indexOf( "PathPaste" ) > -1 ) return "コピーしたファイルやフォルダのパスを貼り付け";
  if ( dll.indexOf( "RectangleInput" ) > -1 ) return "矩形選択範囲の各行の先頭に文字を挿入";
  if ( dll.indexOf( "OutputBarHook" ) > -1 ) return "OutputBar拡張";
  if ( dll.indexOf( "MeryRelay2Plugin" ) > -1 ) return "プロセス中継";
  if ( dll.indexOf( "MeryRelay" ) > -1 ) return "別プロセスで編集";
  if ( dll.indexOf( "CheckModified" ) > -1 ) return "文書の変更をチェック";
  if ( dll.indexOf( "CloseSplitEditor" ) > -1 ) return "分割されたエディタを閉じる";
  if ( dll.indexOf( "IPMessenger" ) > -1 ) return "IPメッセンジャー";
  if ( dll.indexOf( "MeryCsvList" ) > -1 ) return "MeryCsvList";
  if ( dll.indexOf( "SearchToolbar" ) > -1 ) return "検索バー";
  else return dll.replace( /\.dll$/, "" );
}

/**
 * 関数 MenuKey( str, num, numWidth, menuWidth )
 * クリップボード履歴のラベルを整形する
 * 
 * ・行頭空白を除去、空白文字を圧縮:		→「›」(U+203A)
 * ・改行記号を可視化:					→「↲」(U+21B2) または「⏎」(U+23CE)
 * ・削られてしまう「&」を補完
 * ・「¥」(U+005C) を「∖」に置換:			→「∖」(U+2216)
 * ・ゼロ幅や特殊な空白文字を豆腐に置換:	→「⊠」(U+22A0) または「▯」(U+25AF)
 * ・判別しづらいメタ文字を全角に置換:		!"%'(),.:;@[]`{|}
 * ・「a-z」を全角に置換
 * ・行番号を空白でケタ埋め:				EN SPACE「 」(U+2002)
 * ・文字数を切り詰め
 */
function MenuKey( str, num, numWidth, menuWidth ) {
  var reg = /[\u00A0\u1680\u180e\u2000-\u200A\u2028\u2029\u202F\u205F\uFEFF]/g;
  var menuKey = str.replace( /(?:\t|[ ]{3,}|[ ]{2,})+/g, " › " )
                   .slice( 0, menuWidth + 1 )
                   .replace( /\r?\n/g, " ↲ " )	// ⏎
                   .replace( /[&]/g, "&&" )
                   .replace( /[\\]/g, "∖" )
                   .replace( reg, "▯" )
                   // .replace( /([^∖!"',.:;`|\t  ])([∖]+)/g, "$1 $2" )
                   .replace( /[!"%'(),.:;@\[\]`a-z{|}]/g,
                     function( tmp ) {
                       return String.fromCharCode( tmp.charCodeAt( 0 ) + 0xFEE0 )
                     } );
  num = ( "  " + num ).slice( - numWidth ).replace( /\d$/, "&$&: " );
  menuKey = ( menuKey.length > menuWidth )
          ? menuKey.slice( 0, menuWidth ) + " ..."
          : menuKey;
  return num + menuKey;
}

メモ

  • 2019/10/29 (sukemaru)
ベータ版 2.8.1 以降でないとエラーになる「クリップボード履歴」の取得コードを使っているのを忘れていました…。
第3版で修正しておきました。
  • 2019/10/30 (sukemaru)
初期設定状態からほとんど弄っていない Mery だと設定項目のいくつかは Mery.ini に反映されていない状態らしく、扱いが難しいです。
スポンサーリンク