「コンパクトメニュー」の版間の差分
ナビゲーションに移動
検索に移動
修正第4版 |
第5版 |
||
| 17行目: | 17行目: | ||
* ベータバージョン 2.8.6 までで追加されたものを含めて、すべてのコマンドを表示できます。 | * ベータバージョン 2.8.6 までで追加されたものを含めて、すべてのコマンドを表示できます。 | ||
: | : → Mery 本体のバージョンに応じた項目の 表示/非表示 を自動化 | ||
| 23行目: | 23行目: | ||
* 多分 Mery ver 2.6.7 以降であれば動作するはずです。 | * 多分 Mery ver 2.6.7 以降であれば動作するはずです。 | ||
: 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 の一覧が表示されないときは、それぞれの設定ダイアログを開いて [ OK ] | : 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 の一覧が表示されないときは、それぞれの設定ダイアログを開いて <kbd>OK</kbd> ボタンで閉じると表示されるようになるはず <br>(Mery を初期設定状態のまま使っている場合、それぞれの設定ダイアログを開いて [ OK ] で閉じたことがないと、Mery.ini に書きこまれない?)。 | ||
* すべてのメニュー項目の '''完全な再現は無理''' です( "エディタの状態" について、マクロからは取得できない部分が多々あるため)。 | * すべてのメニュー項目の '''完全な再現は無理''' です( "エディタの状態" について、マクロからは取得できない部分が多々あるため)。 | ||
| 63行目: | 63行目: | ||
* --------------------------------------------------------- | * --------------------------------------------------------- | ||
* コンパクトメニュー2 | * コンパクトメニュー2 | ||
* sukemaru, 2019/10/25 - 2019/ | * sukemaru, 2019/10/25 - 2019/11/01 | ||
* | * | ||
* メニューバーのアイテムをポップアップメニューで階層化して表示する | * メニューバーのアイテムをポップアップメニューで階層化して表示する | ||
* ※ ショートカットキーまたはツールバー(マクロバー)アイコンからの起動用 | * ※ ショートカットキーまたはツールバー(マクロバー)アイコンからの起動用 | ||
* --------------------------------------------------------- | * --------------------------------------------------------- | ||
* 2019/ | * 2019/11/01: 拡張メニューを追加。バージョンチェックを追加 | ||
* | * | ||
* 【仕様上の制限】 | * 【仕様上の制限】 | ||
| 76行目: | 76行目: | ||
* ・ウインドウメニューのタブ一覧のアイテムの 「無題-x」 の連番の再現は無理。 | * ・ウインドウメニューのタブ一覧のアイテムの 「無題-x」 の連番の再現は無理。 | ||
* | * | ||
* ・ver 2.6.8 | * ・ver 2.6.8 以降のベータ版での追加項目は、バージョンチェックにより非表示。 | ||
* ・「フォント」 の履歴アイテムの列挙は無し (ExecuteCommandByID の対象外)。 | * ・「フォント」 の履歴アイテムの列挙は無し (ExecuteCommandByID の対象外)。 | ||
* ・ショートカットキーの表示は無し (マクロのショートカットキーを取得できない)。 | * ・ショートカットキーの表示は無し (マクロのショートカットキーを取得できない)。 | ||
| 89行目: | 88行目: | ||
* ※ Mery を初期設定状態のまま使っている場合、 | * ※ Mery を初期設定状態のまま使っている場合、 | ||
* 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 は | * 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 は | ||
* それぞれの設定ダイアログを開いて [OK] | * それぞれの設定ダイアログを開いて [OK] で閉じたことがないと、 | ||
* Mery.ini に書きこまれないので、ポップアップメニューに表示されない。 | * Mery.ini に書きこまれないので、ポップアップメニューに表示されない。 | ||
*/ | */ | ||
| 102行目: | 101行目: | ||
// ■ 拡張メニューを表示する (ファイルメニューの拡張と、非表示機能の可視化) | // ■ 拡張メニューを表示する (ファイルメニューの拡張と、非表示機能の可視化) | ||
var xMenuEnable = | var xMenuEnable = false; // true: 表示する / false: 表示しない | ||
// ---------- ▲ 設定項目 ▲ ---------- // | // ---------- ▲ 設定項目 ▲ ---------- // | ||
| 136行目: | 135行目: | ||
// 表示数は「オプション」の「最近のファイルの表示数」の設定値を利用する | // 表示数は「オプション」の「最近のファイルの表示数」の設定値を利用する | ||
var maxRecentFile = Number( iniItem[0][0] ); | var maxRecentFile = Number( iniItem[0][0] ); | ||
var recentFiles = | var recentFiles = GetClosedFiles( maxRecentFile, hisPath ); | ||
var | var rfCount = recentFiles.length; | ||
var | var rfWidth = ( "" + rfCount ).length || 1; | ||
// 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 の準備 | // 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 の準備 | ||
| 157行目: | 156行目: | ||
var cb = ClipboardData; | var cb = ClipboardData; | ||
var cbData = cb.GetData(); | var cbData = cb.GetData(); | ||
var | var cbArray = []; | ||
if ( VersionCheck( "2.8.1" ) ) { | if ( VersionCheck( "2.8.1" ) ) { | ||
cbArray = GetClipboardData( cb ); | |||
} | } | ||
var cbCount = cbArray.length; | |||
var cbWidth = ( "" + cbCount ).length; | |||
// 「辞書」の準備 | // 「辞書」の準備 | ||
| 199行目: | 186行目: | ||
var currentDir = WshShell.CurrentDirectory; | var currentDir = WshShell.CurrentDirectory; | ||
var portableMode = ( profileDir == meryDir ); | var portableMode = ( profileDir == meryDir ); | ||
} | } | ||
// オプションフラグ | // オプションフラグ | ||
var unnamed = d.FullName ? 0 : meMenuGrayed; // 無題タブ | var unnamed = d.FullName ? 0 : meMenuGrayed; // 無題タブ | ||
var saved = d.Saved ? 0 : meMenuGrayed; // | var saved = d.Saved ? meMenuGrayed : 0; // 保存済み | ||
var blank = d.Text ? 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 multi = ( Editors.Count == 1 ) ? meMenuGrayed : 0; // 複数ウインドウ | |||
var multi = ( | |||
var sqlDll = Fso.FileExists( meryDir + "sqlfmt.dll" ); // SQL 整形 | var sqlDll = Fso.FileExists( meryDir + "sqlfmt.dll" ); // SQL 整形 | ||
var | var eol = VersionCheck( "2.6.10" ) // ( typeof d.LineEnding == "number" ) | ||
// ( typeof d.LineEnding == "number | |||
? d.LineEnding : undefined; // 改行モード | ? d.LineEnding : undefined; // 改行モード | ||
var dEnc = d.Encoding; // エンコード | var dEnc = d.Encoding; // エンコード | ||
| 234行目: | 205行目: | ||
var utf16be = ( dEnc == 65538 || dEnc == 655381 || dEnc == 655380 ) | var utf16be = ( dEnc == 65538 || dEnc == 655381 || dEnc == 655380 ) | ||
? meMenuChecked : 0; | ? meMenuChecked : 0; | ||
var v2_6_9 = VersionCheck( "2.6.9" ); | |||
var v2_6_12 = VersionCheck( "2.6.12" ); | |||
var v2_6_13 = VersionCheck( "2.6.13" ); | |||
var v2_6_15 = VersionCheck( "2.6.15" ); | |||
var v2_7_0 = VersionCheck( "2.7.0" ); | |||
var v2_7_5 = VersionCheck( "2.7.5" ); | |||
var v2_8_0 = VersionCheck( "2.8.0" ); | |||
if ( xMenuEnable ) { | |||
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; | |||
// 「ファイル」メニュー | // 「ファイル」メニュー | ||
/* 「最近開いたファイル」の替わりに「最後に閉じたファイル」を表示 */ | /* 「最近開いたファイル」の替わりに「最後に閉じたファイル」を表示 */ | ||
menu.AddPopup( "ファイル(&F)", fMenu = CreatePopupMenu() ); | menu.AddPopup( "ファイル(&F)", fMenu = CreatePopupMenu() ); | ||
if ( xMenuEnable ) { | if ( xMenuEnable ) { | ||
XMenu( fMenu | // 拡張メニュー | ||
XMenu( fMenu ); | |||
} | } | ||
fMenu.Add( "新規作成(&N)", 2061 ); | fMenu.Add( "新規作成(&N)", 2061 ); | ||
| 250行目: | 237行目: | ||
fMenu.Add( "すべて保存(&L)", 2066 ); | fMenu.Add( "すべて保存(&L)", 2066 ); | ||
fMenu.Add( "-----", 0, meMenuSeparator ); | fMenu.Add( "-----", 0, meMenuSeparator ); | ||
if ( v2_6_9 ) { | |||
/* 「自動保存」ON/OFF の ✔ チェックマーク表示は不可 */ | /* 「自動保存」ON/OFF の ✔ チェックマーク表示は不可 */ | ||
fMenu.Add( "自動保存(&U)", 2240 | fMenu.Add( "自動保存(&U)", 2240 ); | ||
} | |||
fMenu.Add( "-----", 0, meMenuSeparator ); | fMenu.Add( "-----", 0, meMenuSeparator ); | ||
fMenu.Add( "挿入(&I)...", 2067 ); | fMenu.Add( "挿入(&I)...", 2067 ); | ||
| 295行目: | 284行目: | ||
fMenu.Add( "-----", 0, meMenuSeparator ); | fMenu.Add( "-----", 0, meMenuSeparator ); | ||
/* 最後に閉じたファイルを列挙 */ | /* 最後に閉じたファイルを列挙 */ | ||
if ( maxRecentFile > 0 && | if ( maxRecentFile > 0 && rfCount ) { | ||
for ( var i = 0; i < | for ( var i = 0; i < rfCount; i ++ ) { | ||
id = i + 200; | id = i + 200; | ||
num = ( " " + ( i + 1 ) ).slice( - | num = ( " " + ( i + 1 ) ).slice( - rfWidth ).replace( /\d$/, "&$&: " ); | ||
label = recentFiles[i] // .replace( /.+?([^\\]+\\)([^\\]+)$/, "$1 $2" ); | label = recentFiles[i] // .replace( /.+?([^\\]+\\)([^\\]+)$/, "$1 $2" ); | ||
fMenu.Add( num + label, id ); | fMenu.Add( num + label, id ); | ||
| 307行目: | 296行目: | ||
fMenu.Add( "閉じる(&C)", 2095 ); | fMenu.Add( "閉じる(&C)", 2095 ); | ||
fMenu.Add( "-----", 0, meMenuSeparator ); | fMenu.Add( "-----", 0, meMenuSeparator ); | ||
if ( xMenuEnable ) { | if ( xMenuEnable && v2_7_5 ) { | ||
fMenu.Add( "他のタブをすべて閉じる(&Z)*", 2249 | fMenu.Add( "他のタブをすべて閉じる(&Z)*", 2249 ); // | ||
fMenu.Add( "左のタブをすべて閉じる(&H)*", 2250 | fMenu.Add( "左のタブをすべて閉じる(&H)*", 2250 ); // | ||
fMenu.Add( "右のタブをすべて閉じる(&M)*", 2251 | fMenu.Add( "右のタブをすべて閉じる(&M)*", 2251 ); // | ||
fMenu.Add( "-----", 0, meMenuSeparator ); // | fMenu.Add( "-----", 0, meMenuSeparator ); // | ||
} | } | ||
| 334行目: | 323行目: | ||
eMenu.Add( "-----", 0, meMenuSeparator ); | eMenu.Add( "-----", 0, meMenuSeparator ); | ||
if ( xMenuEnable ) { | if ( xMenuEnable ) { | ||
eMenu.Add( "リンクをコピー(&H)*", 2201 ); // | eMenu.Add( "リンクをコピー(&H)*", 2201 ); // | ||
eMenu.Add( "リンクを開く(&O)*", 2202 ); // | eMenu.Add( "リンクを開く(&O)*", 2202 ); // | ||
eMenu.Add( "-----*", 0, meMenuSeparator ); // | eMenu.Add( "-----*", 0, meMenuSeparator ); // | ||
} | } | ||
| 342行目: | 331行目: | ||
eMenu.Add( "ファイルへ移動(&F)*", 2108 ); // | eMenu.Add( "ファイルへ移動(&F)*", 2108 ); // | ||
eMenu.Add( "-----*", 0, meMenuSeparator ); // | eMenu.Add( "-----*", 0, meMenuSeparator ); // | ||
eMenu.Add( "最後に編集した位置へ移動(&L)*", 2241 | if ( v2_6_9 ) { | ||
eMenu.Add( "次の変更行(&N)*", 2243 | eMenu.Add( "最後に編集した位置へ移動(&L)*", 2241 ); // | ||
eMenu.Add( "前の変更行(&M)*", 2244 | } | ||
if ( v2_6_12 ) { | |||
eMenu.Add( "次の変更行(&N)*", 2243 ); // | |||
eMenu.Add( "前の変更行(&M)*", 2244 ); // | |||
eMenu.Add( "-----*", 0, meMenuSeparator ); // | eMenu.Add( "-----*", 0, meMenuSeparator ); // | ||
} | |||
eMenu.Add( "挿入/上書の切り替え(&I)*", 2125 ); // | eMenu.Add( "挿入/上書の切り替え(&I)*", 2125 ); // | ||
} | } | ||
| 383行目: | 376行目: | ||
cvMenu.Add( "-----", 0, meMenuSeparator ); | cvMenu.Add( "-----", 0, meMenuSeparator ); | ||
cvMenu.Add( "再変換(&V)", 2123, empty || readOnly ); | cvMenu.Add( "再変換(&V)", 2123, empty || readOnly ); | ||
cvMenu.Add( "文字コードの切り替え(&O)", 2245, | if ( v2_6_13 ) { | ||
cvMenu.Add( "文字コードの切り替え(&O)", 2245, blank || readOnly ); | |||
} | |||
cvMenu.Add( "-----", 0, meMenuSeparator ); | cvMenu.Add( "-----", 0, meMenuSeparator ); | ||
cvMenu.Add( "Base64 デコード(&B)...", 2124, empty ); | cvMenu.Add( "Base64 デコード(&B)...", 2124, empty ); | ||
cvMenu.Add( "Base64 エンコード(&C)...", 2239 | cvMenu.Add( "Base64 エンコード(&C)...", 2239 ); | ||
eMenu.AddPopup( "ブックマーク(&B)", bmMenu = CreatePopupMenu() ); | eMenu.AddPopup( "ブックマーク(&B)", bmMenu = CreatePopupMenu() ); | ||
bmMenu.Add( "ブックマークを設定/解除(&T)", 2126 ); | bmMenu.Add( "ブックマークを設定/解除(&T)", 2126 ); | ||
| 409行目: | 404行目: | ||
spMenu.Add( "その他(&E)", 2215 ); | spMenu.Add( "その他(&E)", 2215 ); | ||
scMenu.AddPopup( "辞書(&D)", dicMenu = CreatePopupMenu() ); | scMenu.AddPopup( "辞書(&D)", dicMenu = CreatePopupMenu() ); | ||
/* 辞書一覧を列挙 | /* 辞書一覧を列挙 */ | ||
for ( var i = 0; i < dcCount; i ++ ) { | for ( var i = 0; i < dcCount; i ++ ) { | ||
id = i + 4096; | id = i + 4096; | ||
| 443行目: | 437行目: | ||
menu.AddPopup( "表示(&V)", vMenu = CreatePopupMenu() ); | menu.AddPopup( "表示(&V)", vMenu = CreatePopupMenu() ); | ||
vMenu.AddPopup( "編集モード(&M)", mdMenu = CreatePopupMenu() ); | vMenu.AddPopup( "編集モード(&M)", mdMenu = CreatePopupMenu() ); | ||
mdMenu.Add( "現在の編集モードのプロパティ(&P)...**", | mdMenu.Add( "現在の編集モードのプロパティ(&P)...**", 19 ); | ||
mdMenu.Add( "-----**", 0, meMenuSeparator ); | mdMenu.Add( "-----**", 0, meMenuSeparator ); | ||
/* 編集モード一覧を列挙 | /* 編集モード一覧を列挙 */ | ||
for ( var i = 0; i < mdCount; i ++ ) { | for ( var i = 0; i < mdCount; i ++ ) { | ||
id = i + 5120; | id = i + 5120; | ||
| 472行目: | 465行目: | ||
sgMenu.Add( "全角空白(&W)", 2156 ); | sgMenu.Add( "全角空白(&W)", 2156 ); | ||
sgMenu.Add( "CR と LF を区別して表示(&D)", 2157 ); | sgMenu.Add( "CR と LF を区別して表示(&D)", 2157 ); | ||
sgMenu.Add( "変更行を強調表示(&H)", 2242 | if ( v2_6_9 ) { | ||
sgMenu.Add( "変更行を強調表示(&H)", 2242 ); | |||
} | |||
vMenu.Add( "-----", 0, meMenuSeparator ); | vMenu.Add( "-----", 0, meMenuSeparator ); | ||
vMenu.AddPopup( "ツールバー(&T)", tbMenu = CreatePopupMenu() ); | vMenu.AddPopup( "ツールバー(&T)", tbMenu = CreatePopupMenu() ); | ||
| 483行目: | 478行目: | ||
tbMenu.Add( "ツールバーのタイトル(&O)", 2162 ); | tbMenu.Add( "ツールバーのタイトル(&O)", 2162 ); | ||
tbMenu.Add( "ツールバーを固定する(&L)", 2163 ); | tbMenu.Add( "ツールバーを固定する(&L)", 2163 ); | ||
tbMenu.Add( "マクロバーのラベルを表示(&B)", 2252 | if ( v2_8_0 ) { | ||
tbMenu.Add( "マクロバーのラベルを表示(&B)", 2252 ); | |||
} | |||
tbMenu.Add( "-----", 0, meMenuSeparator ); | tbMenu.Add( "-----", 0, meMenuSeparator ); | ||
tbMenu.Add( "小アイコン(&A)", 2228 ); | tbMenu.Add( "小アイコン(&A)", 2228 ); | ||
| 493行目: | 490行目: | ||
vMenu.Add( "ステータスバー(&S)", 2165 ); | vMenu.Add( "ステータスバー(&S)", 2165 ); | ||
vMenu.Add( "アウトプット(&O)", 2166, OutputBar.Visible *1 ); | vMenu.Add( "アウトプット(&O)", 2166, OutputBar.Visible *1 ); | ||
vMenu.Add( "全画面表示(&U)", 2203 ); | vMenu.Add( "全画面表示(&U)", 2203 ); | ||
vMenu.Add( "Zen モード(&Z)", 2246 | if ( v2_6_15 ) { | ||
vMenu.Add( "タイプライタースクロール(&Y)", 2247 | vMenu.Add( "Zen モード(&Z)", 2246 ); | ||
vMenu.Add( "タイプライタースクロール(&Y)", 2247 ); | |||
} | |||
vMenu.Add( "-----", 0, meMenuSeparator ); | vMenu.Add( "-----", 0, meMenuSeparator ); | ||
if ( xMenuEnable ) { | if ( xMenuEnable && v2_7_0 ) { | ||
vMenu.Add( "スクロールバーのマーカー表示*", 2248 | vMenu.Add( "スクロールバーのマーカー表示*", 2248 ); // | ||
vMenu.Add( "-----", 0, meMenuSeparator ); // | vMenu.Add( "-----", 0, meMenuSeparator ); // | ||
} | } | ||
| 529行目: | 527行目: | ||
/* 「マクロ名」の表示は、各マクロのパスの解決と | /* 「マクロ名」の表示は、各マクロのパスの解決と | ||
すべての可視マクロの実体ファイルの #title の読み込みが必要。 | すべての可視マクロの実体ファイルの #title の読み込みが必要。 | ||
記録/停止(S) による一時マクロがらみの項目の 表示/非表示 の切り替えは無理。 */ | 記録/停止(S) による一時マクロがらみの項目の 表示/非表示 の切り替えは無理。 */ | ||
menu.AddPopup( "マクロ(&M)", mMenu = CreatePopupMenu() ); | menu.AddPopup( "マクロ(&M)", mMenu = CreatePopupMenu() ); | ||
| 542行目: | 539行目: | ||
mMenu.Add( "選択(&L)...", 2174 ); | mMenu.Add( "選択(&L)...", 2174 ); | ||
mMenu.Add( "これを選択(&T)", 2175, blank || unnamed ); | mMenu.Add( "これを選択(&T)", 2175, blank || unnamed ); | ||
if ( xMenuEnable && iniItem[0][2] | if ( xMenuEnable && iniItem[0][2] ) { // | ||
mMenu.Add( "このマクロを実行(&G)** " + fileName, | mMenu.Add( "このマクロを実行(&G)** " + fileName, 20, runFlags ); // | ||
} // | } // | ||
mMenu.Add( "カスタマイズ(&C)...", 2176 ); | mMenu.Add( "カスタマイズ(&C)...", 2176 ); | ||
mMenu.Add( "-----", 0, meMenuSeparator ); | mMenu.Add( "-----", 0, meMenuSeparator ); | ||
/* マクロのファイル名一覧を列挙 | /* マクロのファイル名一覧を列挙 | ||
※ 非表示マクロをサブメニュー化 */ | |||
if ( xMenuEnable ) { | |||
mMenu.AddPopup( "非表示マクロ(&J)**", smMenu = CreatePopupMenu() ); // ** | |||
mMenu.Add( "-----", 0, meMenuSeparator ); // ** | |||
} | |||
for ( var i = 0, j = 1; i < mcCount; i ++ ) { | for ( var i = 0, j = 1; i < mcCount; i ++ ) { | ||
id = i + 6144; | id = i + 6144; | ||
label = /([^\\] | label = /([^\\]+)[01]$/.exec( macroArray[i] )[1]; | ||
if ( macroArray[i].slice( -1 ) == "1" ) { | |||
num = ( " " + ( j ++ ) ).slice( - mcWidth ).replace( /\d$/, "&$&: " ); | |||
num = ( " " + ( | mMenu.Add( num + label, id ); | ||
} else if ( xMenuEnable ) { | |||
num = ( " " + ( k ++ ) ).slice( - mcWidth ).replace( /\d$/, "&$&: " ); | |||
smMenu.Add( num + label, id ); | |||
} | |||
} | } | ||
| 565行目: | 567行目: | ||
tMenu.Add( "-----", 0, meMenuSeparator ); | tMenu.Add( "-----", 0, meMenuSeparator ); | ||
if ( xMenuEnable ) { | if ( xMenuEnable ) { | ||
tMenu.Add( "単語補完*", 2178 ); | tMenu.Add( "単語補完*", 2178 ); // | ||
tMenu.Add( "-----", 0, meMenuSeparator ); // | tMenu.Add( "-----", 0, meMenuSeparator ); // | ||
} | } | ||
| 581行目: | 583行目: | ||
/* クリップボード履歴を列挙 */ | /* クリップボード履歴を列挙 */ | ||
tMenu.AddPopup( "クリップボード履歴(&C)", cbMenu = CreatePopupMenu() ); | tMenu.AddPopup( "クリップボード履歴(&C)", cbMenu = CreatePopupMenu() ); | ||
if ( | if ( cbCount ) { | ||
for ( var i = 0; i < cbCount; i ++ ) { | for ( var i = 0; i < cbCount; i ++ ) { | ||
id = i + 1; | id = i + 1; | ||
| 588行目: | 590行目: | ||
} | } | ||
cbMenu.Add( "", 0, meMenuSeparator ); | cbMenu.Add( "", 0, meMenuSeparator ); | ||
cbMenu.Add( "すべての履歴を削除する(&E)**", | cbMenu.Add( "すべての履歴を削除する(&E)**", 18 ); // | ||
} | } else if ( cbData.length ) { | ||
cbMenu.Add( MenuKey( cbData, 1, 1, menuWidth ), 17, readOnly ); // | |||
cbMenu.Add( MenuKey( cbData, 1, 1, menuWidth ), | } else { | ||
cbMenu.Add( "※ クリップボードにテキストデータはありません ※", 0, meMenuGrayed ); // | |||
} | } | ||
tMenu.Add( "-----", 0, meMenuSeparator ); | tMenu.Add( "-----", 0, meMenuSeparator ); | ||
tMenu.AddPopup( "プラグイン(&I)", plMenu = CreatePopupMenu() ); | tMenu.AddPopup( "プラグイン(&I)", plMenu = CreatePopupMenu() ); | ||
/* プラグイン名一覧を列挙 | /* プラグイン名一覧を列挙 | ||
有効/無効の ✔ チェックマーク表示は無理 | 有効/無効の ✔ チェックマーク表示は無理 */ | ||
for ( var i = 0; i < plCount; i ++ ) { | for ( var i = 0; i < plCount; i ++ ) { | ||
id = i + 7168; | id = i + 7168; | ||
| 607行目: | 609行目: | ||
plMenu.Add( "プラグインの設定(&C)...", 2181 ); | plMenu.Add( "プラグインの設定(&C)...", 2181 ); | ||
tMenu.AddPopup( "外部ツール(&E)", etMenu = CreatePopupMenu() ); | tMenu.AddPopup( "外部ツール(&E)", etMenu = CreatePopupMenu() ); | ||
/* 外部ツール名一覧を列挙 | /* 外部ツール名一覧を列挙 */ | ||
for ( var i = 0; i < tlCount; i ++ ) { | for ( var i = 0; i < tlCount; i ++ ) { | ||
id = i + 8192; | id = i + 8192; | ||
| 633行目: | 634行目: | ||
wMenu.Add( "次のペイン*", 2187 ); // | wMenu.Add( "次のペイン*", 2187 ); // | ||
wMenu.Add( "前のペイン*", 2188 ); // | wMenu.Add( "前のペイン*", 2188 ); // | ||
wMenu.Add( "アクティブなペイン*", 2189 | wMenu.Add( "アクティブなペイン*", 2189 ); // | ||
wMenu.Add( "-----*", 0, meMenuSeparator ); // | wMenu.Add( "-----*", 0, meMenuSeparator ); // | ||
} | } | ||
| 676行目: | 677行目: | ||
// クリップボード履歴の文字列を貼り付け | // クリップボード履歴の文字列を貼り付け | ||
else if ( r < | else if ( r <= 16 ) { | ||
d.Write( cbArray[ r -1 ] ); | d.Write( cbArray[ r -1 ] ); | ||
} | |||
else if ( r == 17 ) { | |||
d.Write( cbData ); | |||
} | } | ||
// クリップボード履歴をすべて削除する** | // クリップボード履歴をすべて削除する ** | ||
else if ( r == | else if ( r == 18 && Confirm( cbClearStr ) ) { | ||
for ( var i = 0; i < cbCount; i ++ ) { | for ( var i = 0; i < cbCount; i ++ ) { | ||
cb.ClearData( i ); | cb.ClearData( i ); | ||
| 688行目: | 692行目: | ||
} | } | ||
// 現在の編集モードのプロパティ** | // 現在の編集モードのプロパティ ** | ||
else if ( r == | else if ( r == 19 ) { | ||
WshShell.SendKeys( "%P" ); | WshShell.SendKeys( "%P" ); | ||
editor.ExecuteCommandByID( MEID_VIEW_MODE_CUSTOMIZE = 2144 ); | editor.ExecuteCommandByID( MEID_VIEW_MODE_CUSTOMIZE = 2144 ); | ||
} | } | ||
// このマクロを実行** | // このマクロを実行 ** | ||
else if ( r == | else if ( r == 20 ) { | ||
editor.ExecuteCommandByID( MEID_MACROS_SELECT_THIS = 2175 ); // これを選択 | editor.ExecuteCommandByID( MEID_MACROS_SELECT_THIS = 2175 ); // これを選択 | ||
WshShell.SendKeys( "{ | WshShell.SendKeys( "{" + iniItem[0][2] + "}" ); // マクロの実行 | ||
} | } | ||
// | // 拡張メニュー項目 ** | ||
else if ( r >= | else if ( r >= 21 && r <= 35 ) { | ||
switch ( r ) { | switch ( r ) { | ||
case | case 21: // ファイルのプロパティを開く | ||
var Shell = new ActiveXObject( "Shell.Application" ); | var Shell = new ActiveXObject( "Shell.Application" ); | ||
Shell.NameSpace( folderPath.replace( /\\+$/g, "" ) ) | Shell.NameSpace( folderPath.replace( /\\+$/g, "" ) ) | ||
| 710行目: | 714行目: | ||
break; | break; | ||
case 22: case 23: case 24: case 25: // パスをコピー | |||
var data = ( r == | var data = ( r == 22 ) ? fileName // ファイル名をコピー | ||
: ( r == | : ( r == 23 ) ? fullPath // フルパスをコピー | ||
: ( r == | : ( r == 24 ) ? folderPath // 親フォルダのパスをコピー | ||
:/* r == | :/* r == 25 */ meryPath; // Mery のフルパスをコピー | ||
cb.SetData( data.replace( /\\/g, "\\$&" ) ); | cb.SetData( data.replace( /\\/g, "\\$&" ) ); | ||
break; | break; | ||
case | case 26: case 27: case 28: // フォルダを開く | ||
var path = ( r == | var path = ( r == 26 ) ? fullPath // 親フォルダ | ||
: ( r == | : ( r == 27 ) ? meryPath // Mery フォルダ | ||
:/* r == | :/* r == 28 */ iniPath; // ユーザーフォルダ | ||
WshShell.Run( "explorer /select,\"" + ( path ) + "\"" ); | WshShell.Run( "explorer /select,\"" + ( path ) + "\"" ); | ||
break; | break; | ||
case 29: case 30: case 31: case 32: case 33: case 34: | |||
var folder = ( r == | var folder = ( r == 29 ) ? macroDir // Macros フォルダ | ||
: ( r == | : ( r == 30 ) ? autoSaveDir // 自動保存フォルダ | ||
: ( r == | : ( r == 31 ) ? backupDir // バックアップフォルダ | ||
: ( r == | : ( r == 32 ) ? desktoptDir // デスクトップフォルダ | ||
: ( r == | : ( r == 33 ) ? documentsDir // マイドキュメントフォルダ | ||
:/* r == | :/* r == 34 */ currentDir; // 作業フォルダ | ||
WshShell.Run( "\"" + folder + "\""); | WshShell.Run( "\"" + folder + "\""); | ||
break; | break; | ||
case | case 35: // メモ帳で開く | ||
WshShell.Run( "notepad.exe \"" + fullPath + "\""); | WshShell.Run( "notepad.exe \"" + fullPath + "\"" ); | ||
break; | break; | ||
} | } | ||
| 748行目: | 752行目: | ||
// 最後に閉じたファイルのアイテムを開く | // 最後に閉じたファイルのアイテムを開く | ||
else if ( r >= 200 && r < 300 ) { | else if ( r >= 200 && r < 300 ) { | ||
if ( ! unnamed || ! | if ( ! unnamed || ! blank ) { | ||
editor.NewFile(); | editor.NewFile(); | ||
} | } | ||
editor.OpenFile( | editor.OpenFile( recentFiles[ r - 200 ] ); | ||
} | } | ||
| 767行目: | 771行目: | ||
/** | /** | ||
* 関数 XMenu( objMenu | * 関数 XMenu( objMenu ) | ||
* ファイルメニュー拡張 | * ファイルメニュー拡張 | ||
*/ | */ | ||
function XMenu( objMenu | function XMenu( objMenu ) { | ||
objMenu.AddPopup( "拡張メニュー(&X)**", xMenu = CreatePopupMenu() ); | objMenu.AddPopup( "拡張メニュー(&X)**", xMenu = CreatePopupMenu() ); | ||
objMenu.Add( "", 0, meMenuSeparator ); | |||
if ( fullPath ) { | if ( fullPath ) { | ||
xMenu.Add( "プロパティ(&R)...", | xMenu.Add( "プロパティ(&R)...", 21 ); | ||
xMenu.Add( "", 0, meMenuSeparator ); | xMenu.Add( "", 0, meMenuSeparator ); | ||
xMenu.Add( "ファイル名をコピー(&N)", | xMenu.Add( "ファイル名をコピー(&N)", 22 ); | ||
xMenu.Add( "フルパスをコピー(&P)", | xMenu.Add( "フルパスをコピー(&P)", 23 ); | ||
xMenu.Add( "メモ帳で開く(&O)", | xMenu.Add( "メモ帳で開く(&O)", 35 ); | ||
xMenu.Add( "", 0, meMenuSeparator ); | xMenu.Add( "", 0, meMenuSeparator ); | ||
xMenu.Add( "親フォルダのパスをコピー(&F)", | xMenu.Add( "親フォルダのパスをコピー(&F)", 24 ); | ||
xMenu.Add( "親フォルダを開く(&D)", | xMenu.Add( "親フォルダを開く(&D)", 26 ); | ||
xMenu.Add( "", 0, meMenuSeparator ); | xMenu.Add( "", 0, meMenuSeparator ); | ||
} | } | ||
xMenu.Add( "Mery のフルパスをコピー(&E)", | xMenu.Add( "Mery.exe のフルパスをコピー(&E)", 25 ); | ||
xMenu.Add( "Mery | xMenu.Add( "Mery.exe の親フォルダを開く(&M)", 27 ); | ||
xMenu.Add( "Macros フォルダを開く(&S)", | xMenu.Add( "Macros フォルダを開く(&S)", 29 ); | ||
xMenu.Add( "自動保存フォルダを開く(&A)", | if ( v2_6_9 ) { | ||
xMenu.Add( "バックアップフォルダを開く(&B)", | xMenu.Add( "自動保存フォルダを開く(&A)", 30, ! Fso.FolderExists( autoSaveDir ) *2 ); | ||
xMenu.Add( "バックアップフォルダを開く(&B)", 31, ! Fso.FolderExists( backupDir ) *2 ); | |||
} | |||
if ( ! portableMode ) { | if ( ! portableMode ) { | ||
xMenu.Add( "ユーザーフォルダを開く(&U)", | xMenu.Add( "ユーザーフォルダを開く(&U)", 28 ); | ||
} | } | ||
xMenu.Add( "", 0, meMenuSeparator ); | xMenu.Add( "", 0, meMenuSeparator ); | ||
xMenu.Add( "デスクトップフォルダを開く(&H)", | xMenu.Add( "デスクトップフォルダを開く(&H)", 32 ); | ||
xMenu.Add( "マイドキュメントフォルダを開く(&D)", | xMenu.Add( "マイドキュメントフォルダを開く(&D)", 33 ); | ||
xMenu.Add( "作業フォルダを開く(&C)", | xMenu.Add( "作業フォルダを開く(&C)", 34 ); | ||
} | } | ||
| 834行目: | 840行目: | ||
var iniText = Adodb.ReadText( adReadAll ); | var iniText = Adodb.ReadText( adReadAll ); | ||
Adodb.Close(); | Adodb.Close(); | ||
// 引数の配列をループ処理して ini からオプションの値を取得する | // 引数の配列をループ処理して ini からオプションの値を取得する | ||
var reg1, value, iniOptionArray = []; | var reg1, value, iniOptionArray = []; | ||
| 844行目: | 848行目: | ||
iniOptionArray.push( value ); | iniOptionArray.push( value ); | ||
} | } | ||
// 編集モード名を取得する | // 編集モード名を取得する | ||
var reg2 = /\r\n\[Modes\\Mode\d+\]\r\nCaption=[^\r\n]+/g; | var reg2 = /\r\n\[Modes\\Mode\d+\]\r\nCaption=[^\r\n]+/g; | ||
var modeArray = iniText.match( reg2 ) || []; // 抽出結果の配列 | var modeArray = iniText.match( reg2 ) || []; // 抽出結果の配列 | ||
var reg3 = /Caption=([^\r\n]+)/; | var reg3 = /Caption=([^\r\n]+)/; | ||
for ( var i = 0, len = modeArray.length; i < len; i ++ ) { | for ( var i = 0, len = modeArray.length; i < len; i ++ ) { | ||
modeArray[i] = reg3.exec( modeArray[i] )[1]; | modeArray[i] = reg3.exec( modeArray[i] )[1]; | ||
} | } | ||
// マクロのパスを取得する(末尾に Visible キーの値を付加する) | // マクロのパスを取得する(末尾に Visible キーの値を付加する) | ||
var reg4 = /\r\n\[Macros\\Macro\d+\]\r\nFileName=[^\r\n]+\r\nVisible=\d/g; | var reg4 = /\r\n\[Macros\\Macro\d+\]\r\nFileName=[^\r\n]+\r\nVisible=\d/g; | ||
var macroArray = iniText.match( reg4 ) || []; // 抽出結果の配列 | var macroArray = iniText.match( reg4 ) || []; // 抽出結果の配列 | ||
var reg5 = /\r\nFileName=([^\r\n]+)\r\n/; | var reg5 = /\r\nFileName=([^\r\n]+)\r\n/; | ||
for ( var i = 0, len = macroArray.length; i < len; i ++ ) { | for ( var i = 0, len = macroArray.length; i < len; i ++ ) { | ||
| 865行目: | 863行目: | ||
+ macroArray[i].slice( -1 ); | + macroArray[i].slice( -1 ); | ||
} | } | ||
// プラグインのパスを取得する | // プラグインのパスを取得する | ||
var reg6 = /\r\n\[Plugins\\Plugin\d+\]\r\nFileName=[^\r\n]+/g; | var reg6 = /\r\n\[Plugins\\Plugin\d+\]\r\nFileName=[^\r\n]+/g; | ||
var pluginArray = iniText.match( reg6 ) || []; // 抽出結果の配列 | var pluginArray = iniText.match( reg6 ) || []; // 抽出結果の配列 | ||
var reg7 = /FileName=(?:[^\\]+\\)*([^\r\n]+)/; | var reg7 = /FileName=(?:[^\\]+\\)*([^\r\n]+)/; | ||
for ( var i = 0, len = pluginArray.length; i < len; i ++ ) { | for ( var i = 0, len = pluginArray.length; i < len; i ++ ) { | ||
pluginArray[i] = reg7.exec( pluginArray[i] )[1]; | pluginArray[i] = reg7.exec( pluginArray[i] )[1]; | ||
} | } | ||
// 外部ツール名を取得する | // 外部ツール名を取得する | ||
var reg8 = /\r\n\[Tools\\Tool\d+\]\r\nCaption=[^\r\n]+/g; | var reg8 = /\r\n\[Tools\\Tool\d+\]\r\nCaption=[^\r\n]+/g; | ||
var toolArray = iniText.match( reg8 ) || []; // 抽出結果の配列 | var toolArray = iniText.match( reg8 ) || []; // 抽出結果の配列 | ||
var reg9 = /Caption=([^\r\n]+)/; | var reg9 = /Caption=([^\r\n]+)/; | ||
for ( var i = 0, len = toolArray.length; i < len; i ++ ) { | for ( var i = 0, len = toolArray.length; i < len; i ++ ) { | ||
toolArray[i] = reg9.exec( toolArray[i] )[1]; | toolArray[i] = reg9.exec( toolArray[i] )[1]; | ||
} | } | ||
return [ iniOptionArray, modeArray, macroArray, pluginArray, toolArray ]; | return [ iniOptionArray, modeArray, macroArray, pluginArray, toolArray ]; | ||
} | } | ||
/** | /** | ||
* 関数 | * 関数 GetClosedFiles( num, hisPath ) | ||
* 「最後に閉じたファイル」のフルパスの配列を返す | * 「最後に閉じたファイル」のフルパスの配列を返す | ||
* | * | ||
| 896行目: | 887行目: | ||
* 第2引数: Mery.his のフルパス | * 第2引数: Mery.his のフルパス | ||
*/ | */ | ||
function | function GetClosedFiles( num, hisPath ) { | ||
var closedFile = "", closedFileArray = []; | var closedFile = "", closedFileArray = []; | ||
var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); | var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); | ||
if ( ! num || ! Fso.FileExists( hisPath ) ) { return closedFile; } | if ( ! num || ! Fso.FileExists( hisPath ) ) { return closedFile; } | ||
// Mery.his を読みこむ | // Mery.his を読みこむ | ||
var Adodb = new ActiveXObject( "ADODB.Stream" ); | var Adodb = new ActiveXObject( "ADODB.Stream" ); | ||
| 909行目: | 899行目: | ||
var hisText = Adodb.ReadText( adReadAll ); | var hisText = Adodb.ReadText( adReadAll ); | ||
Adodb.Close(); | Adodb.Close(); | ||
// Mery.his からファイルパスを抽出し、後ろから順にチェック | // Mery.his からファイルパスを抽出し、後ろから順にチェック | ||
var hisArray = hisText.match( /^\[.+\]$/gm ); | var hisArray = hisText.match( /^\[.+\]$/gm ); | ||
| 982行目: | 971行目: | ||
if ( dll.indexOf( "SearchToolbar" ) > -1 ) return "検索バー"; | if ( dll.indexOf( "SearchToolbar" ) > -1 ) return "検索バー"; | ||
else return dll.replace( /\.dll$/, "" ); | else return dll.replace( /\.dll$/, "" ); | ||
} | |||
/** | |||
* 関数 GetClipboardData( objClipboardData ) | |||
* クリップボード履歴を配列で返す | |||
* ※ ベータ版 2.8.1 以降 | |||
*/ | |||
function GetClipboardData( cb ) { | |||
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 ); // 履歴のアイテムを配列に追加 | |||
} | |||
return cbArray; | |||
} | } | ||
| 989行目: | 1,000行目: | ||
* | * | ||
* ・行頭空白を除去、空白文字を圧縮: →「›」(U+203A) | * ・行頭空白を除去、空白文字を圧縮: →「›」(U+203A) | ||
* ・改行記号を可視化: | * ・改行記号を可視化: →「↲」(U+21B2) または「⏎」(U+23CE) | ||
* ・削られてしまう「&」を補完 | * ・削られてしまう「&」を補完 | ||
* ・「¥」(U+005C) を「∖」に置換: →「∖」(U+2216) | * ・「¥」(U+005C) を「∖」に置換: →「∖」(U+2216) | ||
| 1,005行目: | 1,016行目: | ||
.replace( /[&]/g, "&&" ) | .replace( /[&]/g, "&&" ) | ||
.replace( /[\\]/g, "∖" ) | .replace( /[\\]/g, "∖" ) | ||
.replace( reg, "▯" ) | .replace( reg, "▯" ) // ⊠ | ||
.replace( /[!"%'(),.:;@\[\]`a-z{|}]/g, | .replace( /[!"%'(),.:;@\[\]`a-z{|}]/g, | ||
function( tmp ) { | function( tmp ) { | ||
2019年11月2日 (土) 00:00時点における版
機能
- メニューバーの全項目をひとつのポップアップメニューにまとめて表示します。
- [ ファイル(F) / 編集(E) / 検索(S) / 表示(V) / マクロ(M) / ツール(T) / ウィンドウ(W) / ヘルプ(H) ] の各メニュー項目とそれらのサブメニューを再現してあります。
- 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 「辞書」 「クリップボード履歴」 「タブ一覧」 は、自動で取得します(Mery.ini や Mery.his を読みこむ)。
- ショートカットキーまたはツールバーアイコンからの起動を想定しています。
- ※ このマクロを導入しても、エディタウインドウの「メニューバー」を非表示にすることはできないので、たいした意味はありません…。
- ポップアップメニューの表示位置は、ソースコード内の設定項目 menuPosMouse から変更可能です(デフォルト状態ではマウスポインタの位置に表示)。
- 標準メニューでは表示されない、ポップアップメニューやキーボードショートカット用のコマンドを表示できます。
- → ソースコード内の設定項目 xMenuEnable (デフォルト状態では非表示)
- ベータバージョン 2.8.6 までで追加されたものを含めて、すべてのコマンドを表示できます。
- → Mery 本体のバージョンに応じた項目の 表示/非表示 を自動化
制限事項
- 多分 Mery ver 2.6.7 以降であれば動作するはずです。
- 「編集モード」 「マクロ」 「プラグイン」 「外部ツール」 の一覧が表示されないときは、それぞれの設定ダイアログを開いて OK ボタンで閉じると表示されるようになるはず
(Mery を初期設定状態のまま使っている場合、それぞれの設定ダイアログを開いて [ OK ] で閉じたことがないと、Mery.ini に書きこまれない?)。
- すべてのメニュー項目の 完全な再現は無理 です( "エディタの状態" について、マクロからは取得できない部分が多々あるため)。
- 項目を グレーアウト させる条件の完全な再現は無理
- トグル項目などの左につける ✔ チェックマーク の完全な再現は無理
- メニュー右側の ショートカットキー の表示は無し(マクロのショートカットキーを取得できないので、全部まとめて無視した)
- ファイルメニューの「最近のファイル」の履歴の再現は無理 → 「最近閉じたファイル」の履歴で代替
- 表示メニュー配下の「フォント」の履歴の表示は無理
- ウインドウメニューの「タブ一覧」のアイテムの「無題-<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/11/01
*
* メニューバーのアイテムをポップアップメニューで階層化して表示する
* ※ ショートカットキーまたはツールバー(マクロバー)アイコンからの起動用
* ---------------------------------------------------------
* 2019/11/01: 拡張メニューを追加。バージョンチェックを追加
*
* 【仕様上の制限】
* ・すべてのメニュー項目の完全な再現は無理。
* ・状況に応じた項目のグレーアウトの完全な再現は無理。
* ・トグル項目などの左につける ✔ チェックマークの再現は無理。
* ・ウインドウメニューのタブ一覧のアイテムの 「無題-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 = false; // 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 = GetClosedFiles( maxRecentFile, hisPath );
var rfCount = recentFiles.length;
var rfWidth = ( "" + rfCount ).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 cbArray = [];
if ( VersionCheck( "2.8.1" ) ) {
cbArray = GetClipboardData( cb );
}
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 unnamed = d.FullName ? 0 : meMenuGrayed; // 無題タブ
var saved = d.Saved ? meMenuGrayed : 0; // 保存済み
var blank = d.Text ? 0 : meMenuGrayed; // 白紙の文書
var empty = s.IsEmpty ? meMenuGrayed : 0; // 選択範囲なし
var readOnly = d.ReadOnly ? meMenuGrayed : 0; // 書き換え禁止
var multi = ( Editors.Count == 1 ) ? meMenuGrayed : 0; // 複数ウインドウ
var sqlDll = Fso.FileExists( meryDir + "sqlfmt.dll" ); // SQL 整形
var eol = VersionCheck( "2.6.10" ) // ( typeof d.LineEnding == "number" )
? 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;
var v2_6_9 = VersionCheck( "2.6.9" );
var v2_6_12 = VersionCheck( "2.6.12" );
var v2_6_13 = VersionCheck( "2.6.13" );
var v2_6_15 = VersionCheck( "2.6.15" );
var v2_7_0 = VersionCheck( "2.7.0" );
var v2_7_5 = VersionCheck( "2.7.5" );
var v2_8_0 = VersionCheck( "2.8.0" );
if ( xMenuEnable ) {
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;
// 「ファイル」メニュー
/* 「最近開いたファイル」の替わりに「最後に閉じたファイル」を表示 */
menu.AddPopup( "ファイル(&F)", fMenu = CreatePopupMenu() );
if ( xMenuEnable ) {
// 拡張メニュー
XMenu( fMenu );
}
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 );
if ( v2_6_9 ) {
/* 「自動保存」ON/OFF の ✔ チェックマーク表示は不可 */
fMenu.Add( "自動保存(&U)", 2240 );
}
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 && rfCount ) {
for ( var i = 0; i < rfCount; i ++ ) {
id = i + 200;
num = ( " " + ( i + 1 ) ).slice( - rfWidth ).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 && v2_7_5 ) {
fMenu.Add( "他のタブをすべて閉じる(&Z)*", 2249 ); //
fMenu.Add( "左のタブをすべて閉じる(&H)*", 2250 ); //
fMenu.Add( "右のタブをすべて閉じる(&M)*", 2251 ); //
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 ); //
if ( v2_6_9 ) {
eMenu.Add( "最後に編集した位置へ移動(&L)*", 2241 ); //
}
if ( v2_6_12 ) {
eMenu.Add( "次の変更行(&N)*", 2243 ); //
eMenu.Add( "前の変更行(&M)*", 2244 ); //
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 );
if ( v2_6_13 ) {
cvMenu.Add( "文字コードの切り替え(&O)", 2245, blank || readOnly );
}
cvMenu.Add( "-----", 0, meMenuSeparator );
cvMenu.Add( "Base64 デコード(&B)...", 2124, empty );
cvMenu.Add( "Base64 エンコード(&C)...", 2239 );
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() );
/* 辞書一覧を列挙 */
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)...**", 19 );
mdMenu.Add( "-----**", 0, meMenuSeparator );
/* 編集モード一覧を列挙 */
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 );
if ( v2_6_9 ) {
sgMenu.Add( "変更行を強調表示(&H)", 2242 );
}
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 );
if ( v2_8_0 ) {
tbMenu.Add( "マクロバーのラベルを表示(&B)", 2252 );
}
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( "全画面表示(&U)", 2203 );
if ( v2_6_15 ) {
vMenu.Add( "Zen モード(&Z)", 2246 );
vMenu.Add( "タイプライタースクロール(&Y)", 2247 );
}
vMenu.Add( "-----", 0, meMenuSeparator );
if ( xMenuEnable && v2_7_0 ) {
vMenu.Add( "スクロールバーのマーカー表示*", 2248 ); //
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 の読み込みが必要。
記録/停止(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] ) { //
mMenu.Add( "このマクロを実行(&G)** " + fileName, 20, runFlags ); //
} //
mMenu.Add( "カスタマイズ(&C)...", 2176 );
mMenu.Add( "-----", 0, meMenuSeparator );
/* マクロのファイル名一覧を列挙
※ 非表示マクロをサブメニュー化 */
if ( xMenuEnable ) {
mMenu.AddPopup( "非表示マクロ(&J)**", smMenu = CreatePopupMenu() ); // **
mMenu.Add( "-----", 0, meMenuSeparator ); // **
}
for ( var i = 0, j = 1; i < mcCount; i ++ ) {
id = i + 6144;
label = /([^\\]+)[01]$/.exec( macroArray[i] )[1];
if ( macroArray[i].slice( -1 ) == "1" ) {
num = ( " " + ( j ++ ) ).slice( - mcWidth ).replace( /\d$/, "&$&: " );
mMenu.Add( num + label, id );
} else if ( xMenuEnable ) {
num = ( " " + ( k ++ ) ).slice( - mcWidth ).replace( /\d$/, "&$&: " );
smMenu.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 ( cbCount ) {
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)**", 18 ); //
} else if ( cbData.length ) {
cbMenu.Add( MenuKey( cbData, 1, 1, menuWidth ), 17, readOnly ); //
} else {
cbMenu.Add( "※ クリップボードにテキストデータはありません ※", 0, meMenuGrayed ); //
}
tMenu.Add( "-----", 0, meMenuSeparator );
tMenu.AddPopup( "プラグイン(&I)", plMenu = CreatePopupMenu() );
/* プラグイン名一覧を列挙
有効/無効の ✔ チェックマーク表示は無理 */
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() );
/* 外部ツール名一覧を列挙 */
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 ); //
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 <= 16 ) {
d.Write( cbArray[ r -1 ] );
}
else if ( r == 17 ) {
d.Write( cbData );
}
// クリップボード履歴をすべて削除する **
else if ( r == 18 && Confirm( cbClearStr ) ) {
for ( var i = 0; i < cbCount; i ++ ) {
cb.ClearData( i );
}
Status = " クリップボード履歴からすべてのアイテムを削除しました。";
}
// 現在の編集モードのプロパティ **
else if ( r == 19 ) {
WshShell.SendKeys( "%P" );
editor.ExecuteCommandByID( MEID_VIEW_MODE_CUSTOMIZE = 2144 );
}
// このマクロを実行 **
else if ( r == 20 ) {
editor.ExecuteCommandByID( MEID_MACROS_SELECT_THIS = 2175 ); // これを選択
WshShell.SendKeys( "{" + iniItem[0][2] + "}" ); // マクロの実行
}
// 拡張メニュー項目 **
else if ( r >= 21 && r <= 35 ) {
switch ( r ) {
case 21: // ファイルのプロパティを開く
var Shell = new ActiveXObject( "Shell.Application" );
Shell.NameSpace( folderPath.replace( /\\+$/g, "" ) )
.ParseName( fileName )
.InvokeVerb( "プロパティ(&R)" );
break;
case 22: case 23: case 24: case 25: // パスをコピー
var data = ( r == 22 ) ? fileName // ファイル名をコピー
: ( r == 23 ) ? fullPath // フルパスをコピー
: ( r == 24 ) ? folderPath // 親フォルダのパスをコピー
:/* r == 25 */ meryPath; // Mery のフルパスをコピー
cb.SetData( data.replace( /\\/g, "\\$&" ) );
break;
case 26: case 27: case 28: // フォルダを開く
var path = ( r == 26 ) ? fullPath // 親フォルダ
: ( r == 27 ) ? meryPath // Mery フォルダ
:/* r == 28 */ iniPath; // ユーザーフォルダ
WshShell.Run( "explorer /select,\"" + ( path ) + "\"" );
break;
case 29: case 30: case 31: case 32: case 33: case 34:
var folder = ( r == 29 ) ? macroDir // Macros フォルダ
: ( r == 30 ) ? autoSaveDir // 自動保存フォルダ
: ( r == 31 ) ? backupDir // バックアップフォルダ
: ( r == 32 ) ? desktoptDir // デスクトップフォルダ
: ( r == 33 ) ? documentsDir // マイドキュメントフォルダ
:/* r == 34 */ currentDir; // 作業フォルダ
WshShell.Run( "\"" + folder + "\"");
break;
case 35: // メモ帳で開く
WshShell.Run( "notepad.exe \"" + fullPath + "\"" );
break;
}
}
// 改行コードを変更
else if ( r >= 100 && r <= 102 ) {
d.LineEnding = r - 100;
}
// 最後に閉じたファイルのアイテムを開く
else if ( r >= 200 && r < 300 ) {
if ( ! unnamed || ! blank ) {
editor.NewFile();
}
editor.OpenFile( recentFiles[ r - 200 ] );
}
// 選択したタブをアクティブ化
else if ( r >= 300 && r < 400 ) {
docus.Item( r - 300 ).Activate();
}
// 標準コマンド
else {
editor.ExecuteCommandByID( r );
}
} catch ( err ) { Status = err.message; }
/**
* 関数 XMenu( objMenu )
* ファイルメニュー拡張
*/
function XMenu( objMenu ) {
objMenu.AddPopup( "拡張メニュー(&X)**", xMenu = CreatePopupMenu() );
objMenu.Add( "", 0, meMenuSeparator );
if ( fullPath ) {
xMenu.Add( "プロパティ(&R)...", 21 );
xMenu.Add( "", 0, meMenuSeparator );
xMenu.Add( "ファイル名をコピー(&N)", 22 );
xMenu.Add( "フルパスをコピー(&P)", 23 );
xMenu.Add( "メモ帳で開く(&O)", 35 );
xMenu.Add( "", 0, meMenuSeparator );
xMenu.Add( "親フォルダのパスをコピー(&F)", 24 );
xMenu.Add( "親フォルダを開く(&D)", 26 );
xMenu.Add( "", 0, meMenuSeparator );
}
xMenu.Add( "Mery.exe のフルパスをコピー(&E)", 25 );
xMenu.Add( "Mery.exe の親フォルダを開く(&M)", 27 );
xMenu.Add( "Macros フォルダを開く(&S)", 29 );
if ( v2_6_9 ) {
xMenu.Add( "自動保存フォルダを開く(&A)", 30, ! Fso.FolderExists( autoSaveDir ) *2 );
xMenu.Add( "バックアップフォルダを開く(&B)", 31, ! Fso.FolderExists( backupDir ) *2 );
}
if ( ! portableMode ) {
xMenu.Add( "ユーザーフォルダを開く(&U)", 28 );
}
xMenu.Add( "", 0, meMenuSeparator );
xMenu.Add( "デスクトップフォルダを開く(&H)", 32 );
xMenu.Add( "マイドキュメントフォルダを開く(&D)", 33 );
xMenu.Add( "作業フォルダを開く(&C)", 34 );
}
/**
* 関数 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();
// 引数の配列をループ処理して 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 );
}
// 編集モード名を取得する
var reg2 = /\r\n\[Modes\\Mode\d+\]\r\nCaption=[^\r\n]+/g;
var modeArray = iniText.match( reg2 ) || []; // 抽出結果の配列
var reg3 = /Caption=([^\r\n]+)/;
for ( var i = 0, len = modeArray.length; i < len; i ++ ) {
modeArray[i] = reg3.exec( modeArray[i] )[1];
}
// マクロのパスを取得する(末尾に Visible キーの値を付加する)
var reg4 = /\r\n\[Macros\\Macro\d+\]\r\nFileName=[^\r\n]+\r\nVisible=\d/g;
var macroArray = iniText.match( reg4 ) || []; // 抽出結果の配列
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 );
}
// プラグインのパスを取得する
var reg6 = /\r\n\[Plugins\\Plugin\d+\]\r\nFileName=[^\r\n]+/g;
var pluginArray = iniText.match( reg6 ) || []; // 抽出結果の配列
var reg7 = /FileName=(?:[^\\]+\\)*([^\r\n]+)/;
for ( var i = 0, len = pluginArray.length; i < len; i ++ ) {
pluginArray[i] = reg7.exec( pluginArray[i] )[1];
}
// 外部ツール名を取得する
var reg8 = /\r\n\[Tools\\Tool\d+\]\r\nCaption=[^\r\n]+/g;
var toolArray = iniText.match( reg8 ) || []; // 抽出結果の配列
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 ];
}
/**
* 関数 GetClosedFiles( num, hisPath )
* 「最後に閉じたファイル」のフルパスの配列を返す
*
* 第1引数: 「最後に閉じたファイル」の件数を指定
* 第2引数: Mery.his のフルパス
*/
function GetClosedFiles( 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$/, "" );
}
/**
* 関数 GetClipboardData( objClipboardData )
* クリップボード履歴を配列で返す
* ※ ベータ版 2.8.1 以降
*/
function GetClipboardData( cb ) {
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 ); // 履歴のアイテムを配列に追加
}
return cbArray;
}
/**
* 関数 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( /[!"%'(),.:;@\[\]`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 に反映されていない状態らしく、扱いが難しいです。
スポンサーリンク