「
コンパクトメニュー
」を編集中
2019年10月26日 (土) 14:29時点における
Sukemaru
(
トーク
|
投稿記録
)
による版
(ページを新規作成)
(差分) ← 古い版 |
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
== 機能 == メニューバーの全項目をひとつのポップアップメニューにまとめて表示します。 <br><br> * [ ファイル(F) / 編集(E) / 検索(S) / 表示(V) / マクロ(M) / ツール(T) / ウィンドウ(W) / ヘルプ(H) ] の各メニュー項目とそれらのサブメニューを再現してあります。 <br> *「辞書」「編集モード」「マクロ」「プラグイン」「外部ツール」「クリップボード履歴」「タブ一覧」は、自動で取得します。 <br> * ショートカットキーまたはツールバーアイコンからの起動を想定しています。 : また、ポップアップメニューの表示位置は変更可能です(デフォルト状態ではマウスポインタの位置に表示)。 == 制限事項 == このマクロを導入しても、エディタウインドウの「メニューバー」自体を非表示にすることはできませんので、たいした意味はありません。 <br><br> * Mery 本体の動作要件として、'''ベータ版 2.6.10 以上''' でないとこのマクロは動作しません。<br> また、ベータバージョン 2.8.6 までで追加されたものを含めて、すべてのコマンドを表示します <br>(実行できないコマンドをクリックした場合は、ステータスバーにエラーメッセージを表示) <br> * すべてのメニュー項目の '''完全な再現は無理''' です :* <span style="color:#c00;">条件ごとでの項目の <b style="color:#808080;">グレーアウト</b> の完全な再現は無理</span> :* <span style="color:#c00;">トグル項目などの左につける ✔ '''チェックマーク''' の完全な再現は無理</span> :* メニュー右側の '''ショートカットキー''' の表示は なし(マクロのショートカットキーを取得できないので、全部無視した) :* ファイルメニューの「最近のファイル」の履歴の再現は無理 → 「最近閉じたファイル」の履歴で代替 :* 編集メニュー配下の「辞書」は AFF ファイルのベース名順に表示しますが、正しく機能するか不明 :* 表示メニュー配下の「使用したフォント」の履歴の表示は無理 :* ウインドウメニューの「タブ一覧」のアイテムの「無題-x」の連番の再現は無理 <br> * マクロ名の自動取得は面倒なので、実体ファイルのファイル名(e.g. Hogehoge.js)で表示します * Mery Wiki に収録されているプラグイン名は表示できますが、DLL ファイルをリネームしている場合はファイルのベース名で表示します <br> * 項目の配置は任意に変更しても差しつかえありませんが、ExecuteCommandByID() メソッドに渡す定数値を変更しないで下さい == ダウンロード == [[ファイル:コンパクトメニュー.zip]] (アイコン入り) 2019/10/26 == ソースコード == <source lang="javascript" style="height:120em; overflow:auto;"> #title = "コンパクトメニュー" #tooltip = "メニューバーの全アイテムを階層化表示" #icon = "menu+.ico" /** * --------------------------------------------------------- * コンパクトメニュー * sukemaru, 2019/10/26 * * メニューバーのアイテムをポップアップメニューで階層化して表示する * ※ ショートカットキーまたはマクロバーアイコンからの起動用 * --------------------------------------------------------- * 【仕様上の制限】 * ・すべてのメニュー項目の完全な再現は無理。 * ・状況に応じた項目のグレーアウトの完全な再現は無理。 * ・トグル項目などの左につける ✔ チェックマークの再現は無理。 * ・ウインドウメニューのタブ一覧のアイテムの「無題-x」の連番の再現は無理。 * ※「編集モード」「マクロ」「プラグイン」「外部ツール」「辞書」は * 各アイテムを "標準メニュー上の項目と同じ順番で過不足なく" 並べないと * ExecuteCommandByID() での実行ができなくなる。 * * ・現状ではベータ機能のバージョンチェックなし。 * ・「フォント」の履歴アイテムの列挙なし(ExecuteCommandByID の対象外)。 * ・ショートカットキーの表示はなし(マクロのショートカットキーを取得できない)。 * ・マクロ名 (#title) の自動取得は面倒なので、実体ファイル名で表示。 */ // ---------- ▼ 設定項目 ▼ ---------- // // ■ ポップアップメニューを表示する位置 var menuPosMouse = true; // true: マウス位置 / false: キャレット位置 // ■ クリップボード履歴で表示する文字数の目安 var menuWidth = 60; // ---------- ▲ 設定項目 ▲ ---------- // // 【準備】 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\\"; if ( ! Fso.FileExists( iniPath ) ) { var profileDir = WshShell.SpecialFolders( "APPDATA" ) + "\\Mery\\"; iniPath = profileDir + mery + ".ini"; hisPath = profileDir + mery + ".his"; dicsDir = profileDir + "Dicts\\"; } // Mery.ini から各種データを取得 var iniItem = GetIniOptionCM( [ "MaxRecentFile" ], iniPath ); // [ iniOptionArray, modeArray, macroArray, pluginArray, toolArray ]; // 「最後に閉じたファイル」の準備 // 表示数は「オプション」の「最近のファイルの表示数」の設定値を利用する var maxRecentFile = Number( iniItem[0] || 0 ); var recentFile = LatestClosedFile( maxRecentFile, hisPath ); var lcCount = recentFile.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(), cbData0 = cb.GetData( 0 ); if ( cbData0 ) { 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 ds = editor.Documents; var dCount = ds.Count; var dsWidth = ( "" + dCount ).length; // 【ポップアップメニュー項目】 var menu = CreatePopupMenu(); // オプションフラグ var unnamed = d.FullName ? 0 : meMenuGrayed; var empty = s.IsEmpty ? meMenuGrayed : 0; var readOnly = d.ReadOnly ? meMenuGrayed : 0; var multi = ( editors.Count == 1 ) ? meMenuGrayed : 0; // 「ファイル」メニュー /* 「最近開いたファイル」の替わりに「最後に閉じたファイル」を表示 */ menu.AddPopup( "ファイル(&F)", fMenu = CreatePopupMenu() ); fMenu.Add( "新規作成(&N)", 2061 ); fMenu.Add( "開く(&O)...", 2062 ); fMenu.Add( "閉じて開く(&D)...", 2063, unnamed ); fMenu.Add( "上書き保存(&S)", 2064, unnamed ); fMenu.Add( "名前を付けて保存(&A)...", 2065 ); fMenu.Add( "すべて保存(&L)", 2066 ); fMenu.Add( "-----", 0, meMenuSeparator ); /* 「自動保存」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 ); rlMenu.Add( "UTF-16BE", 2070 ); rlMenu.Add( "UTF-8", 2071 ); rlMenu.Add( "UTF-7", 2072 ); rlMenu.Add( "-----", 0, meMenuSeparator ); rlMenu.Add( "アラビア語", 2073 ); rlMenu.Add( "バルト言語", 2074 ); rlMenu.Add( "中央ヨーロッパ言語", 2075 ); rlMenu.Add( "簡体中国語 (GB2312)", 2076 ); rlMenu.Add( "繁体中国語 (Big5)", 2077 ); rlMenu.Add( "キリル言語", 2078 ); rlMenu.Add( "ギリシャ語", 2079 ); rlMenu.Add( "ヘブライ語", 2080 ); rlMenu.Add( "日本語 (&EUC)", 2081 ); rlMenu.Add( "日本語 (&JIS)", 2082 ); rlMenu.Add( "日本語 (シフト JIS)", 2083 ); rlMenu.Add( "韓国語", 2084 ); rlMenu.Add( "タイ語", 2085 ); rlMenu.Add( "トルコ語", 2086 ); rlMenu.Add( "ベトナム語", 2087 ); rlMenu.Add( "西ヨーロッパ言語", 2088 ); } fMenu.AddPopup( "改行コード(&G)", leMenu = CreatePopupMenu() ); leMenu.Add( "CR+LF (Windows)", 100, d.LineEnding == 0 ? 1 : 0 ); leMenu.Add( "CR (Macintosh)", 101, d.LineEnding == 1 ? 1 : 0 ); leMenu.Add( "LF (UNIX)", 102, d.LineEnding == 2 ? 1 : 0 ); fMenu.Add( "-----", 0, meMenuSeparator ); fMenu.Add( "印刷(&P)...", 2092 ); fMenu.Add( "印刷プレビュー(&W)...", 2093 ); fMenu.Add( "-----", 0, meMenuSeparator ); /* 最後に閉じたファイル */ if ( maxRecentFile && lcCount ) { for ( var i = 0, num, label, id; i < lcCount; i ++ ) { id = i + 200; // 「連番: 親フォルダ名\ ファイル名」に切りつめる num = ( " " + id ).slice( - lcWidth ).replace( /\d$/, "&$&: " ); label = recentFile[i].replace( /(?:.+\\)*([^\\]+)$/, "$1" ); fMenu.Add( num + label, id ); } fMenu.Add( "-----", 0, meMenuSeparator ); } fMenu.Add( "保存して閉じる(&E)", 2094 ); 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( "すべて保存して閉じる(&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 ); // eMenu.Add( "引用つき貼り付け(&V)", 2200, readOnly ); eMenu.Add( "削除(&L)", 2104, readOnly ); eMenu.Add( "-----", 0, meMenuSeparator ); eMenu.Add( "すべて選択(&A)", 2105 ); eMenu.Add( "日付と時刻(&D)", 2106, readOnly ); eMenu.Add( "-----", 0, meMenuSeparator ); // eMenu.Add( "リンクをコピー", 2201 ); // eMenu.Add( "リンクを開く", 2202 ); // eMenu.Add( "-----", 0, meMenuSeparator ); eMenu.Add( "行へ移動(&G)...", 2107 ); // eMenu.Add( "ファイルへ移動", 2108 ); // eMenu.Add( "-----", 0, meMenuSeparator ); // eMenu.Add( "最後に編集した位置へ移動(&L)", 2241 ); // eMenu.Add( "次の変更行(&N)", 2243 ); // eMenu.Add( "前の変更行(&H)", 2244 ); // eMenu.Add( "-----", 0, meMenuSeparator ); // eMenu.Add( "挿入/上書きの切り替え", 2125 ); eMenu.Add( "書き換え禁止(&Y)", 2109, + d.ReadOnly ); 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 ); // cvMenu.Add( "行コピー", 2218 ); // cvMenu.Add( "行切り取り", 2217, readOnly ); // 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 ); cvMenu.Add( "-----", 0, meMenuSeparator ); cvMenu.Add( "ベース64デコード(&B)", 2124, empty ); cvMenu.Add( "ベース64エンコード(&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() ); // dicMenu.Add( "&1 en_US", 4096 ); // dicMenu.Add( "&2 js_JS", 4097 ); /* 辞書を自動列挙。 Add() の第2引数 id は 4096 からの連番。 */ for ( var i = 0, id, dic; i < dcCount; i ++ ) { id = i + 4096; dic = /([^\\]+)\.\w+$/.exec( dicsArray[i] )[1]; // 「連番: 辞書名」に切りつめる num = ( " " + ( i + 1 ) ).slice( - dcWidth ).replace( /\d$/, "&$&: " ); label = num + dic; dicMenu.Add( label, id ); } scMenu.Add( "-----", 0, meMenuSeparator ); scMenu.Add( "次のスペルミス(&N)", 2131 ); scMenu.Add( "前のスペルミス(&P)", 2132 ); // 「検索」メニュー var sMenu = CreatePopupMenu(); menu.AddPopup( "検索(&S)", sMenu ); 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 ); // 「表示」メニュー /* トグル項目の ✔ チェックマーク表示は無理。 */ var vMenu = CreatePopupMenu(); menu.AddPopup( "表示(&V)", vMenu ); vMenu.AddPopup( "編集モード(&M)", mdMenu = CreatePopupMenu() ); /* 編集モードサブメニューを自動生成。 Add() の第2引数 id は 5120 からの連番。 */ for ( var i = 0, mode; i < mdCount; i ++ ) { mode = modeArray[i]; mdMenu.Add( mode, i + 5120, + ( mode == dMode ) ) } 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 ); 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 ); 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 ); vMenu.Add( "-----", 0, meMenuSeparator ); vMenu.Add( "全画面表示(&U)", 2203 ); vMenu.Add( "zen モード(&Z)", 2246 ); vMenu.Add( "タイプライタースクロール(&Y)", 2247 ); // vMenu.Add( "-----", 0, meMenuSeparator ); // 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 ); // ftMenu.Add( "大きいフォントサイズ(&L)", 2167 ); // ftMenu.Add( "小さいフォントサイズ(&S)", 2168 ); // ftMenu.Add( "フォントサイズをリセット(&R)", 2205 ); // ftMenu.Add( "現在のフォントサイズを規定に設定(&D)", 2206 ); // ftMenu.Add( "-----", 0, meMenuSeparator ); ftMenu.Add( "フォントの設定(&C)...", 2169 ); // 「マクロ」メニュー /* 「マクロ名」の表示は Mery.ini の読み込みと、各マクロのパスの解決、 すべてのマクロの実体ファイルの #title の読み込みが必要。 実行(R) と 編集(E) の後ろにつけるファイルパスの表示は無理。 記録/停止(S) による一時マクロがらみの項目の表示/非表示の切り替えは無理。 */ var mMenu = CreatePopupMenu(); menu.AddPopup( "マクロ(&M)", mMenu ); mMenu.Add( "記録/停止(&S)", 2170 ); mMenu.Add( "実行(&R)", 2171 ); // mMenu.Add( "一時オプションを設定してマクロ実行...", 2204 ); mMenu.Add( "-----", 0, meMenuSeparator ); mMenu.Add( "名前を付けて保存(&A)", 2172 ); mMenu.Add( "編集(&E)", 2173 ); mMenu.Add( "これを選択(&T)", 2175, empty ); mMenu.Add( "カスタマイズ(&C)...", 2176 ); mMenu.Add( "-----", 0, meMenuSeparator ); /* マクロのファイル名を自動列挙。 Add() の第2引数 id は 6144 からの連番 (仕様上、不可視のアイテムにも連番が適用される)。 */ for ( var i = 0, j = 0, id, macro, label; i < mcCount; i ++ ) { if ( macroArray[i].slice( -1 ) != "1" ) { continue; } id = i + 6144; macro = /([^\\]+\.\w+)\d$/.exec( macroArray[i] )[1]; // 「連番: マクロ名」に切りつめる num = ( " " + ( ++ j ) ).slice( - mcWidth ).replace( /\d$/, "&$&: " ); label = num + macro; mMenu.Add( label, id ); } // 「ツール」メニュー var tMenu = CreatePopupMenu(); menu.AddPopup( "ツール(&T)", tMenu ); tMenu.Add( "オプション(&O)...", 2177 ); tMenu.Add( "-----", 0, meMenuSeparator ); if ( readOnly ) { tMenu.Add( "HTML Tidy(&H)", 0, readOnly ); } else { tMenu.AddPopup( "HTML Tidy(&H)", htMenu = CreatePopupMenu() ); htMenu.Add( "ドキュメントの整形(&C)", 2178, readOnly ); htMenu.Add( "ドキュメントのエラーをチェック(&F)", 2225, readOnly ); } tMenu.Add( "SQL整形(&S)", 2179, readOnly ); tMenu.Add( "-----", 0, meMenuSeparator ); /* クリップボード履歴 */ tMenu.AddPopup( "クリップボード履歴(&C)", cbMenu = CreatePopupMenu() ); if ( cbCount ) { for ( var i = 0, id, label; 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)", piMenu = CreatePopupMenu() ); /* プラグイン名を自動列挙。 有効/無効の ✔ チェックマーク表示は無理。 Add() の第2引数 id は 7168 からの連番。 */ for ( var i = 0, id, plugin, label; i < plCount; i ++ ) { id = i + 7168; plugin = PluginName( pluginArray[i] ); // 「連番: プラグイン名」に切りつめる num = ( " " + ( i + 1 ) ).slice( - plWidth ).replace( /\d$/, "&$&: " ); label = num + plugin; piMenu.Add( label, id ); } piMenu.Add( "-----", 0, meMenuSeparator ); piMenu.Add( "プラグインの設定(&C)...", 2181 ); tMenu.AddPopup( "外部ツール(&E)", etMenu = CreatePopupMenu() ); /* 外部ツール名を自動列挙。 Add() の第2引数 id は 8192 からの連番。 */ for ( var i = 0, id, tool, label; i < tlCount; i ++ ) { id = i + 8192; tool = toolArray[i]; // 「連番: 外部ツール名」に切りつめる num = ( " " + ( i + 1 ) ).slice( - tlWidth ).replace( /\d$/, "&$&: " ); label = num + tool; etMenu.Add( 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 ); // 「ウインドウ」メニュー /* トグル項目の ✔ チェックマーク表示は無理。 */ var wMenu = CreatePopupMenu(); menu.AddPopup( "ウインドウ(&W)", wMenu ); wMenu.Add( "常に最上位(&A)", 2185 ); wMenu.Add( "-----", 0, meMenuSeparator ); wMenu.Add( "上下に分割(&S)", 2186 ); wMenu.Add( "左右に分割(&L)", 2226 ); // wMenu.Add( "-----", 0, meMenuSeparator ); // wMenu.Add( "次のペイン", 2187 ); // wMenu.Add( "前のペイン", 2188 ); wMenu.Add( "-----", 0, meMenuSeparator ); wMenu.Add( "タブを有効にする(&T)", 2190, + editor.EnableTab ); 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, id, docu; i < dCount; i ++ ) { id = i + 300; docu = ds.Item( i ); // 「連番: ファイルパス」に切りつめる num = ( " " + ( i + 1 ) ).slice( - dsWidth ).replace( /\d$/, "&$&: " ); label = num + ( docu.FullName || "無題" ) wMenu.Add( label, id, + ( docu == d ) ); } // 「ヘルプ」メニュー var hMenu = CreatePopupMenu(); menu.AddPopup( "ヘルプ(&H)", hMenu ); 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 { if ( r == 0 ) { ; } // クリップボード履歴の文字列を貼り付け else if ( r < 17 ) { d.Write( cbArray[ r -1 ] ); } // クリップボード履歴をすべて削除する else if ( r == 17 && Confirm( "クリップボードのすべての履歴を削除しますか? " ) ) { for ( var i = 0; i < cbCount; i ++ ) { cb.ClearData( i ); Status = " 履歴からすべてのアイテムを削除しました。"; } } // 改行コードを変更 else if ( r >= 100 && r <= 102 ) { d.LineEnding = r - 100; } // 最後に閉じたファイルのアイテムを開く else if ( r >= 200 && r < 300 ) { if ( d.FullName || d.Text ) { editor.NewFile(); } editor.OpenFile( recentFile[ r - 200 ] ); } // タブをアクティブに else if ( r >= 300 && r < 400 ) { ds.Item( r - 300 ).Activate(); } // 標準コマンド else { editor.ExecuteCommandByID( r ); } } catch ( err ) { Status = err.message; } /** * 関数 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 reg, value, iniOptionArray = []; for ( var i = 0, len = keyArray.length; i < len; i ++ ) { reg = new RegExp( "^" + keyArray[i] + "=(.*?)$" , "m" ); value = reg.exec( iniText )[1] || ""; 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 num = ( num > 0 ) ? num : 1; var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); if ( ! 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 ); 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 affArray = []; for ( ; ! dics.atEnd(); dics.moveNext() ) { if ( /\.aff$/i.test( dics.item() ) ) { affArray.push( dics.item() ); } } return affArray; } /** * 関数 PluginName( dllName ) * プラグイン.DLL のファイル名から「プラグイン名」を返す */ function PluginName( 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; } </source>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク