「すべて閉じる」の版間の差分
空行と改行の除去 |
|||
| (2人の利用者による、間の7版が非表示) | |||
| 1行目: | 1行目: | ||
いっぺんに複数のタブを閉じます。 | いっぺんに複数のタブを閉じます。 | ||
* | *途中で「保存の確認」ダイアログを表示するタイプと表示しないタイプがあります。 | ||
※「保存の確認」ダイアログで「キャンセル」ボタンを押した場合、そのタブは閉じず、他のタブにたいしては「すべて閉じる」の処理を継続します。 | |||
< | <div style="float:right">__TOC__</div> | ||
== ダウンロード == | == ダウンロード == | ||
[[ファイル:すべて閉じるマクロ集.zip]] | ;[[ファイル:すべて閉じるマクロ集.zip]] | ||
(最終更新: 2019/05/03)<br> | |||
マクロ×8本、アイコン入り | |||
*2019/04/25② sukemaru | |||
:[[#「すべて閉じる」の統合版(モード選択)|統合版]] を追加。 | |||
:アイコンのデザインをちょっと変更。 | |||
*2019/05/03 sukemaru | |||
:途中で「保存の確認」ダイアログが出て「キャンセル」した場合に、元のタブをアクティブにするように変更。 | |||
:アイコンのデザインをもうちょっと変更。 | |||
:[[#「すべて閉じる」の統合版(include版)|include版]] を追加。 | |||
== すべて閉じる == | == すべて閉じる == | ||
ウインドウを閉じるさいに、保存していないタブにたいして「 **** への変更を保存しますか?」の確認ダイアログを表示させずに終了できます。<br> | |||
※基本的に、「未保存*」の名前つきタブがあるときは、保存の確認ダイアログを表示します。 | |||
* | *「未保存*」以外のタブ(変更マーク「*」がないタブ)をすべて閉じるなら、別ページに「[[変更なしのタブをすべて閉じる]]」マクロがあります。 | ||
*「無題」をふくめたすべての「未保存*」のタブについて保存処理や確認ダイアログが必要であれば、[[ヘルプ:ファイル#すべて保存して閉じる|ファイルメニュー]]の「すべて保存して閉じる」や「すべて閉じる」を使用してください。 | |||
ファイルメニューの「'''すべて閉じる''' (Shift+Alt+X)」の [[マクロリファレンス:Window インターフェイス#Close メソッド|マクロコード]] | |||
<syntaxhighlight lang="javascript"> | |||
// すべてのエディタウインドウを閉じる | |||
editor.ExecuteCommandByID( MEID_FILE_CLOSE_ALL = 2097 ); | |||
// アクティブウインドウだけ閉じるなら | |||
// window.Close(); | |||
</syntaxhighlight> | |||
ファイルメニューの「'''すべて保存して閉じる''' (Shift+Ctrl+E)」の [[マクロリファレンス:Editor インターフェイス#SaveCloseAll メソッド|マクロコード]] | |||
<syntaxhighlight lang="javascript"> | |||
// すべてのエディタウインドウを閉じる(未保存のタブは保存する) | |||
editor.SaveCloseAll(); | |||
</syntaxhighlight> | |||
=== 保存の確認をせずに閉じる === | === 保存の確認をせずに閉じる === | ||
すべての「未保存*」タブについて、いっさい保存の確認をせずに閉じます。 <br> | |||
※<b style="color:#c00;">問答無用</b> | ※<b style="color:#c00;">問答無用</b>でエディタウインドウが閉じるので、ご利用は自己責任で。 | ||
< | <syntaxhighlight lang="javascript"> | ||
#title = "すべて閉じる(保存の確認なし)" | #title = "すべて閉じる(保存の確認なし)" | ||
#tooltip = " | #tooltip = "未保存のタブがあっても保存の確認をせずに終了する" | ||
#icon = "close_all[2].ico" | |||
for ( var i = 0; i < editor.Documents.Count; i ++ ) { | for ( var i = 0; i < editor.Documents.Count; i ++ ) { | ||
| 30行目: | 52行目: | ||
} | } | ||
window.Close(); | window.Close(); | ||
</ | </syntaxhighlight> | ||
=== 保存の確認ダイログを出す === | === 保存の確認ダイログを出す === | ||
名前のある(実体ファイルのある)「未保存*」のタブにたいしては、保存の確認ダイログを表示します。<br> | |||
※「無題」のタブにたいしては、保存の確認をしません。 | |||
< | <syntaxhighlight lang="javascript"> | ||
#title = "すべて閉じる(無題は保存の確認しない)" | #title = "すべて閉じる(無題は保存の確認しない)" | ||
#tooltip = " | #tooltip = "無題のタブは保存の確認をせずに終了する" | ||
#icon = "close_all[1].ico" | |||
for ( var i = 0; i < editor.Documents.Count; i ++ ) { | for ( var i = 0; i < editor.Documents.Count; i ++ ) { | ||
| 47行目: | 69行目: | ||
} | } | ||
window.Close(); | window.Close(); | ||
</ | </syntaxhighlight> | ||
== | == 他のタブを閉じる == | ||
アクティブなタブ以外を閉じます。 | |||
※「無題」のタブでも名前つきのタブでも、「未保存*」のタブについては保存の確認ダイアログを表示します。 | |||
=== | === 左側のタブを閉じる === | ||
<syntaxhighlight lang="javascript"> | |||
< | #title = "左側のタブをすべて閉じる" | ||
#title = " | #tooltip = "左側のタブをすべて閉じる" | ||
#tooltip = " | #icon = "close_left.ico" | ||
var d = document; | var d = document; | ||
var dCount = editor.Documents.Count; | var dCount = editor.Documents.Count; | ||
var | var docu, hit; | ||
for ( var i = | for ( var i = dCount - 1; i >= 0; i -- ) { | ||
docu = editor.Documents.Item( i ); | docu = editor.Documents.Item( i ); | ||
if ( docu == d ) { | if ( docu == d ) { hit = 1; continue; } | ||
if ( ! hit ) { continue; } | |||
docu.Close(); | |||
} | } | ||
d.Activate(); | |||
</syntaxhighlight> | |||
</ | |||
=== 右側のタブをすべて閉じる === | |||
=== | <syntaxhighlight lang="javascript"> | ||
#title = "右側のタブをすべて閉じる" | |||
< | #tooltip = "右側のタブをすべて閉じる" | ||
#title = " | #icon = "close_right.ico" | ||
#tooltip = " | |||
var d = document; | var d = document; | ||
var dCount = editor.Documents.Count; | var dCount = editor.Documents.Count; | ||
for ( var i = dCount - 1; editor.Documents.Item( i ) != d; i -- ) { | |||
for ( var i = | editor.Documents.Item( i ).Close(); | ||
} | } | ||
d.Activate(); | |||
</syntaxhighlight> | |||
</ | |||
=== 他のタブをすべて閉じる === | === 他のタブをすべて閉じる === | ||
<syntaxhighlight lang="javascript"> | |||
< | |||
#title = "他のタブをすべて閉じる" | #title = "他のタブをすべて閉じる" | ||
#tooltip = "他のタブをすべて閉じる" | #tooltip = "他のタブをすべて閉じる" | ||
#icon = "close_other.ico" | |||
var d = document; | var d = document; | ||
var dCount = editor.Documents.Count; | var dCount = editor.Documents.Count; | ||
var docu; | var docu; | ||
for ( var i = dCount - 1; i >= 0; i -- ) { | for ( var i = dCount - 1; i >= 0; i -- ) { | ||
docu = editor.Documents.Item( i ); | docu = editor.Documents.Item( i ); | ||
| 125行目: | 123行目: | ||
} | } | ||
} | } | ||
</ | d.Activate(); | ||
</syntaxhighlight> | |||
== 他のタブをすべて閉じる(オプションつき) == | |||
※「未保存*」のタブにたいして 保存の確認ダイログを表示するか/しないか のオプションを設定できます。<br> | |||
※設定項目で動作モードを 1 や 2 に変更して別名の .JS ファイルに保存すれば、「右側/左側のタブをすべて閉じる」マクロになります。 | |||
< | <syntaxhighlight lang="javascript"> | ||
#title = "他のタブをすべて閉じる" | #title = "他のタブをすべて閉じる" | ||
#tooltip = "他のタブをすべて閉じる" | #tooltip = "他のタブをすべて閉じる" | ||
| 144行目: | 143行目: | ||
var ignoreUnNamed = false; | var ignoreUnNamed = false; | ||
// true: 「無題」ドキュメントにたいしては保存の確認ダイアログを表示しない | // true: 「無題」ドキュメントにたいしては保存の確認ダイアログを表示しない | ||
// false: 「無題」ドキュメントにたいしても保存の確認ダイアログを表示する | // false: 「無題」ドキュメントにたいしても保存の確認ダイアログを表示する | ||
| 159行目: | 158行目: | ||
} | } | ||
} | } | ||
// 他のタブをすべて閉じる | // 他のタブをすべて閉じる | ||
var start = ( closeMode == 2 ) ? dd - 1 : dCount - 1; | var start = ( closeMode == 2 ) ? dd - 1 : dCount - 1; | ||
var end = ( closeMode == 1 ) ? dd + 1 : 0; | var end = ( closeMode == 1 ) ? dd + 1 : 0; | ||
for ( var i = start; i + 1 > end; i -- ) { | for ( var i = start; i + 1 > end; i -- ) { | ||
docu = editor.Documents.Item( i ); | docu = editor.Documents.Item( i ); | ||
| 171行目: | 172行目: | ||
} | } | ||
} | } | ||
</ | d.Activate(); | ||
</syntaxhighlight> | |||
== 「すべて閉じる」の統合版(モード選択) == | |||
[[ファイル:Mery_すべて閉じる(入力).png|link=|border|right|入力ダイアログ]] | |||
[[ファイル:Mery_すべて閉じる(メニュー).png|link=|border|right|ポップアップメニュー]] | |||
「すべて閉じる」と「他のタブを閉じる」の機能 '''全部入り''' です。<br><br> | |||
※入力ダイアログかポップアップメニューで動作モードを指定します(ソースコード内の設定項目で「デフォルト値」を指定しておくと Enter または Space キーだけで処理を開始できます)。 | |||
<br clear=all> | |||
<syntaxhighlight lang="javascript" style="height:60em; overflow:auto;"> | |||
#title = "すべて閉じる(モード選択)" | |||
#tooltip = "すべて閉じる(入力ダイアログ)" | |||
#icon = "close_all[4].ico" | |||
// または #tooltip = "すべて閉じる(ポップアップメニュー)" | |||
// ---------- ▼ 設定項目 ▼ ---------- | |||
// ■起動モード | |||
var userModeInput = true; | |||
// true: 入力ダイアログ | |||
// false: ポップアップメニュー | |||
// ■デフォルト値( 1 ~ 6 ) | |||
var defaultMode = ""; | |||
// デフォルト: 入力ダイアログでは Enter キーで確定 | |||
// ポップアップメニューでは Space キーで確定 | |||
// "": 表示しない | |||
// 1: 他のタブをすべて閉じる | |||
// 2: 左側のタブをすべて閉じる | |||
// 3: 右側のタブをすべて閉じる | |||
// 4: 変更なしのタブをすべて閉じる(「未保存*」のタブは閉じない) | |||
// 5: すべてのタブを閉じる | |||
// 6: 問答無用ですべて閉じる(すべてのタブの「未保存*」を無視) | |||
// ※ 4 ですべてのタブが保存済み、かつタブの閉じるボタンを表示している場合は、 | |||
// さいごに新規「無題」タブが残る(閉じるボタン無しならウインドウが閉じる) | |||
// ※ 4, 6 以外は、「未保存*」の名前つきドキュメントで保存の確認ダイアログ | |||
// ※ 5, 6 で閉じた場合、「ワークスペース」の復元可(Mery Ver. 2.6.15 以降) | |||
// ■未保存* の「無題」ドキュメント | |||
var ignoreUnNamed = false; | |||
// true: 保存の確認ダイアログを表示しない | |||
// false: 保存の確認ダイアログを表示する | |||
// ※ mode = 6 では無効(表示しない) | |||
// ---------- ▲ 設定項目 ▲ ---------- | |||
var mode; | |||
// 入力ダイアログ | |||
if ( userModeInput ) { | |||
// (全角 0-9 のみ)半角変換した数字を文字列で返す | |||
var ToHalfWidthNum = function( strVal ){ | |||
return strVal.replace( /[0-9]/g, function( tmp ) { | |||
return String.fromCharCode( tmp.charCodeAt(0) - 0xFEE0 ) | |||
} ) }; | |||
// 1 ~ 6 以外の無効な文字列はすべて無視 | |||
mode = + ToHalfWidthNum( Prompt( "1: 他のタブ. 2: 左側. 3: 右側. 4: 変更なし. 5: すべて. 6: 強制終了.", defaultMode ) ).replace( /[^1-6]/g , "" ); | |||
} | |||
// ポップアップメニュー | |||
else { | |||
var menu = CreatePopupMenu(); | |||
menu.Add( "&1:\t他のタブをすべて閉じる", 1 ); | |||
menu.Add( "&2:\t左側のタブをすべて閉じる", 2 ); | |||
menu.Add( "&3:\t右側のタブをすべて閉じる", 3 ); | |||
menu.Add( "&4:\t変更なしのタブをすべて閉じる", 4 ); | |||
menu.Add( "&5:\tすべてのタブを閉じる", 5 ); | |||
menu.Add( "&6:\t未保存* を無視してすべて閉じる", 6 ); | |||
if ( /^[0-6]$/.test( defaultMode.toString() ) ) { | |||
menu.Add( "", 0, meMenuSeparator ); | |||
menu.Add( defaultMode + ":\tデフォルトモードを実行 ( Space& キー )", + defaultMode ); | |||
} | |||
menu.Add( "", 0, meMenuSeparator ); | |||
menu.Add( "&0:\tキャンセル", 0 ); | |||
mode = menu.Track( mePosMouse ); | |||
} | |||
var d = document; | |||
var dCount = editor.Documents.Count; | |||
var dd, docu; | |||
switch ( mode ) { | |||
// 他のタブをすべて閉じる | |||
case 1: case 2: case 3: | |||
loop: | |||
for ( var i = 0; i < dCount; i ++ ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( docu == d ) { | |||
dd = i; | |||
break loop; | |||
} | |||
} | |||
var start = ( mode == 2 ) ? dd - 1 : dCount - 1; | |||
var end = ( mode == 3 ) ? dd + 1 : 0; | |||
for ( var i = start; i + 1 > end; i -- ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( docu != d ) { | |||
if ( ignoreUnNamed && ! docu.Name ) { | |||
docu.Saved = true; | |||
} | |||
docu.Close(); | |||
} | |||
} | |||
d.Activate(); | |||
break; | |||
// すべて閉じる | |||
case 4: case 5: case 6: | |||
for ( var i = dCount- 1; i + 1 > 0; i -- ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( mode == 4 && docu.Saved ) { | |||
docu.Close(); | |||
} | |||
else if ( mode == 6 | |||
|| ( mode == 5 && ignoreUnNamed && ! docu.Name ) ) { | |||
docu.Saved = true; | |||
} | |||
} | |||
if ( mode != 4 ) { | |||
window.Close(); | |||
} | |||
break; | |||
default: | |||
break; | |||
} | |||
</syntaxhighlight> | |||
== 「すべて閉じる」の統合版(include版) == | |||
macros フォルダに [[includeライブラリ]] を導入しているばあいは、「[[#「すべて閉じる」の統合版(モード選択)|統合版]]」の設定をポップアップメニュー内のサブメニューからから変更できるという …ただそれだけです(一応メニュー項目を少し増やしてます)。<br> | |||
興味のある方は、[[#ダウンロード|ZIP書庫]] 内の「include版」フォルダの JS ファイルをご利用ください。 | |||
※ ソースコード4行目「#include "include/IO.js"」をコメントアウトすると、ふつうの「統合版」としても使用できます。 | |||
<syntaxhighlight lang="javascript" style="height:40em; overflow:auto;"> | |||
#title = "すべて閉じる(モード選択)" | |||
#tooltip = "すべて閉じる(ポップアップメニュー)" | |||
#icon = "close_all[4].ico" | |||
#include "include/IO.js" | |||
// または #tooltip = "すべて閉じる(入力ダイアログ)" | |||
// ---------- ▼ 設定項目 ▼ ---------- | |||
// ■ 起動モード | |||
var userModeInput = false; | |||
// true: 入力ダイアログ | |||
// false: ポップアップメニュー | |||
// ■ デフォルト値( 1 ~ 6 ) | |||
var defaultMode = ""; | |||
// デフォルト: 入力ダイアログでは Enter キーで確定 | |||
// ポップアップメニューでは Space キーで確定 | |||
// "": 表示しない | |||
// 1: 他のタブをすべて閉じる | |||
// 2: 左側のタブをすべて閉じる | |||
// 3: 右側のタブをすべて閉じる | |||
// 4: 変更なしのタブをすべて閉じる(「未保存*」のタブは閉じない) | |||
// 5: すべてのタブを閉じる | |||
// 6: 問答無用ですべて閉じる(すべてのタブの「未保存*」を無視) | |||
// ▼ ポップアップメニュー専用(※「無題」タブの「未保存*」確認あり) ▼ | |||
// 7: すべて閉じる (※同一ウインドウ内の全タブ) | |||
// 8: すべて閉じる (※ファイルメニューのコマンド) | |||
// 9: すべて保存して閉じる (※ファイルメニューのコマンド) | |||
// ※ 4 ですべてのタブが保存済み、かつタブの閉じるボタンを表示している場合は、 | |||
// さいごに新規「無題」タブが残る(閉じるボタン無しならウインドウが閉じる) | |||
// ※ 4, 6 以外は、「未保存*」の名前つきドキュメントで保存の確認ダイアログ | |||
// ※ 1 ~ 7 で閉じるのは同一ウインドウ内のタブのみ | |||
// ※ 8, 9 は、すべてのエディタウインドウの全タブ | |||
// ※ 5 ~ 9 で閉じた場合、「ワークスペース」の復元可(Mery Ver. 2.6.15 以降) | |||
// ■未保存* の「無題」ドキュメント | |||
var ignoreUnNamed = false; | |||
// true: 保存の確認ダイアログを表示しない | |||
// false: 保存の確認ダイアログを表示する | |||
// ※ mode = 6 ~ 8 では ignoreUnNamed オプション無効 | |||
// ---------- ▼ 【include版】 初期設定項目 ▼ ---------- | |||
// ソースコードの4行目 #include "include/IO.js" が有効で | |||
// 起動モードがポップアップメニューの場合のみ使用可 | |||
// ◆ 「設定変更」サブメニューを表示するか? | |||
var settingEnable = true; | |||
// ◆ JSON ファイルのベース名 | |||
var jsonName = ScriptName.replace( /\.js$/i, "" ); | |||
// ---------- ▲ 設定項目 ▲ ---------- | |||
/* ▼ 【include版】の追加コード ▼ */ | |||
var setting; | |||
var initialSettings = { settingEnable: false }; | |||
if ( typeof IO == "object" && settingEnable ) { | |||
initialSettings = { | |||
settingEnable: settingEnable, | |||
userModeInput: userModeInput, | |||
defaultMode: defaultMode, | |||
ignoreUnNamed: ignoreUnNamed | |||
} | |||
setting = initialSettings; | |||
jsonName = jsonName || ScriptName.replace( /\.js$/i, "" ); | |||
setting = IO.Deserialize( setting, jsonName ); | |||
settingEnable = setting.settingEnable; | |||
// userModeInput = setting.userModeInput; | |||
defaultMode = setting.defaultMode; | |||
ignoreUnNamed = setting.ignoreUnNamed; | |||
} | |||
var mode; | |||
// 入力ダイアログ | |||
if ( userModeInput ) { | |||
// 半角変換した ascii 文字列を返す | |||
var ToHalfWidth = function( strVal ){ | |||
return strVal.replace( /[!-~]/g, function( tmp ) { | |||
return String.fromCharCode( tmp.charCodeAt(0) - 0xFEE0 ) | |||
} ) }; | |||
// 1 ~ 6 以外の無効な文字列はすべて無視 | |||
var label = "1: 他のタブ. 2: 左側. 3: 右側. 4: 変更なし. 5: すべて. 6: 強制終了."; | |||
var string = defaultMode > 6 ? "" : defaultMode; | |||
mode = ToHalfWidth( Prompt( label, string ) ).toLowerCase(); | |||
/* 【include版】の追加コード */ | |||
// ※ include 版で "js" か "open" と入力した場合は、JS ファイルを開く | |||
// または "menu" か "setting" と入力した場合は、ポップアップメニューを開く | |||
mode = ( typeof IO == "object" && initialSettings.settingEnable ) | |||
? ( mode == "js" || mode == "open" ) | |||
? 1014 | |||
: ( mode == "menu" || mode == "setting" ) | |||
? "menu" | |||
: + mode.replace( /[^1-6]/g , "" ) | |||
: + mode.replace( /[^1-6]/g , "" ); | |||
} | |||
// ポップアップメニュー | |||
if ( ! userModeInput || mode == "menu" ) { | |||
var menu = CreatePopupMenu(); | |||
/* 【include版】の設定変更サブメニュー */ | |||
if ( initialSettings.settingEnable ) { | |||
SettingsMenu( menu ); | |||
} | |||
menu.Add( "&0:\tキャンセル", 0 ); | |||
menu.Add( "", 10, meMenuSeparator ); | |||
menu.Add( "&1:\t他のタブをすべて閉じる", 1 ); | |||
menu.Add( "&2:\t左側のタブをすべて閉じる", 2 ); | |||
menu.Add( "&3:\t右側のタブをすべて閉じる", 3 ); | |||
menu.Add( "&4:\t変更なしのタブをすべて閉じる", 4 ); | |||
menu.Add( "&5:\tすべてのタブを閉じる", 5 ); | |||
menu.Add( "&6:\t未保存* の確認なしですべて閉じる", 6 ); | |||
menu.Add( "", 10, meMenuSeparator ); | |||
menu.Add( "&7:\tすべて閉じる (同一ウインドウ)", 7 ); | |||
menu.Add( "&8:\tすべて閉じる (全ウインドウ)", 8 ); | |||
menu.Add( "&9:\tすべて保存して閉じる (全ウインドウ)", 9 ); | |||
if ( /^[0-9]$/.test( defaultMode.toString() ) ) { | |||
menu.Add( "", 10, meMenuSeparator ); | |||
// デフォルトモードのラベルで表示するなら(※「キャンセル」を先頭にピンすること) | |||
menu.Add( menu.GetText( defaultMode ).replace( "&", "" ) + " ( Space& キー )", + defaultMode ); | |||
// // 「デフォルトモードを実行」で表示するなら | |||
// menu.Add( defaultMode + ":\tデフォルトモードを実行 ( Space& キー )", + defaultMode ); | |||
} | |||
mode = menu.Track( mePosMouse ); | |||
} | |||
/* 【include版】の設定変更サブメニュー項目を選択した場合 */ | |||
// include 版の設定変更 | |||
if ( typeof IO == "object" && mode >= 1000 ) { | |||
SettingsChange( mode ); | |||
} | |||
else { | |||
var d = document; | |||
var dCount = editor.Documents.Count; | |||
var dd, docu; | |||
switch ( mode ) { | |||
// 他のタブをすべて閉じる | |||
case 1: case 2: case 3: | |||
loop: | |||
for ( var i = 0; i < dCount; i ++ ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( docu == d ) { | |||
dd = i; | |||
break loop; | |||
} | |||
} | |||
var start = ( mode == 2 ) ? dd - 1 : dCount - 1; | |||
var end = ( mode == 3 ) ? dd + 1 : 0; | |||
for ( var i = start; i + 1 > end; i -- ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( docu != d ) { | |||
if ( ignoreUnNamed && ! docu.Name ) { | |||
docu.Saved = true; | |||
} | |||
docu.Close(); | |||
} | |||
} | |||
break; | |||
// すべて閉じる | |||
case 4: case 5: case 6: | |||
for ( var i = dCount- 1; i + 1 > 0; i -- ) { | |||
docu = editor.Documents.Item( i ); | |||
if ( mode == 4 && docu.Saved ) { | |||
docu.Close(); | |||
} | |||
else if ( mode == 6 | |||
|| ( mode == 5 && ignoreUnNamed && ! docu.Name ) ) { | |||
docu.Saved = true; | |||
} | |||
} | |||
if ( mode != 4 ) { | |||
window.Close(); | |||
} | |||
break; | |||
// すべて閉じる(同一ウインドウ内の全タブ) | |||
case 7: | |||
window.Close(); | |||
break; | |||
// すべて閉じる(ファイルメニューのコマンド、すべてのエディタウインドウ) | |||
case 8: | |||
editor.ExecuteCommandByID( MEID_FILE_CLOSE_ALL = 2097 ); | |||
break; | |||
// すべて保存して閉じる(ファイルメニューのコマンド、すべてのエディタウインドウ) | |||
case 9: | |||
editor.SaveCloseAll(); | |||
break; | |||
default: | |||
break; | |||
} | |||
if ( document == d ) { | |||
d.Activate(); | |||
} | |||
} | |||
/* ▼ 【include版】の追加コード ▼ */ | |||
/** | |||
* 関数 SettingsMenu( objPopupMenu ) | |||
* ポップアップメニューに「設定変更」サブメニューを表示する | |||
* 引数: メインコードのポップアップメニューオブジェクト | |||
*/ | |||
function SettingsMenu( objMenu ) { | |||
var subMenu = CreatePopupMenu(); | |||
// メニューのオプションフラグ | |||
// ※定数 meMenuChecked の値は 1 なので xxxEnable *1 で代用できる | |||
var Check = function( num ) { | |||
return + ( defaultMode.toString() == num.toString() ); | |||
} | |||
var grayFlag = settingEnable ? 0 : meMenuGrayed; | |||
// 「設定変更」サブメニューのアイテム | |||
objMenu.AddPopup( "\t設定を変更する (&S)", subMenu ); | |||
objMenu.Add( "", 100, meMenuSeparator ); | |||
subMenu.Add( "\t未保存* タブの保存を確認する (&C)", 1012, !ignoreUnNamed*1 + grayFlag ); | |||
subMenu.Add( "", 100, meMenuSeparator ); | |||
subMenu.Add( "\t▼ デフォルトモードを変更する ▼", 10 , meMenuGrayed ); | |||
subMenu.Add( "&0:\tキャンセル", 1000, Check( 0 ) + grayFlag ); | |||
subMenu.Add( "&1:\t他のタブをすべて閉じる", 1001, Check( 1 ) + grayFlag ); | |||
subMenu.Add( "&2:\t左側のタブをすべて閉じる", 1002, Check( 2 ) + grayFlag ); | |||
subMenu.Add( "&3:\t右側のタブをすべて閉じる", 1003, Check( 3 ) + grayFlag ); | |||
subMenu.Add( "&4:\t変更なしのタブをすべて閉じる", 1004, Check( 4 ) + grayFlag ); | |||
subMenu.Add( "&5:\tすべてのタブを閉じる", 1005, Check( 5 ) + grayFlag ); | |||
subMenu.Add( "&6:\t未保存* の確認なしですべて閉じる", 1006, Check( 6 ) + grayFlag ); | |||
subMenu.Add( "&7:\tすべて閉じる (同一ウインドウ)", 1007, Check( 7 ) + grayFlag ); | |||
subMenu.Add( "&8:\tすべて閉じる (全ウインドウ)", 1008, Check( 8 ) + grayFlag ); | |||
subMenu.Add( "&9:\tすべて保存して閉じる (全ウインドウ", 1009, Check( 9 ) + grayFlag ); | |||
subMenu.Add( "&10:\t(なし)", 1010, Check( "" ) + grayFlag ); | |||
subMenu.Add( "\t▲ デフォルトモードを変更する ▲", 10, meMenuGrayed ); | |||
subMenu.Add( "", 10, meMenuSeparator ); | |||
subMenu.Add( "", 10, meMenuSeparator ); | |||
subMenu.Add( "\t設定内容をロックする (&S)", 1011, !settingEnable*1 ); | |||
subMenu.Add( ( userModeInput ? "\tポップアップメニュー" : "\t入力ダイアログ" ) | |||
+ "モードに変更する (&M)", 1013, grayFlag ); | |||
subMenu.Add( "", 10, meMenuSeparator ); | |||
subMenu.Add( "\t「閉じる」マクロの JS ファイルを開く (&O)", 1014 ); | |||
subMenu.Add( "\t「閉じる」マクロの JSON ファイルを開く (&J)", 1015 ); | |||
subMenu.Add( "", 10, meMenuSeparator ); | |||
subMenu.Add( "\t設定内容を初期化する (&I)", 1016, grayFlag ); | |||
subMenu.Add( "& \tキャンセル", 0 ); | |||
} | |||
/** | |||
* 関数 SettingsChange( num ) | |||
* ポップアップメニューで選択した項目の設定状態を変更する | |||
*/ | |||
function SettingsChange( num ) { | |||
// var setting = IO.Deserialize( setting, jsonName ); | |||
var jsonPath = JsonDir() + "\\" + jsonName + ".json"; | |||
var sIsChanged = true; | |||
switch ( num ) { | |||
case 1000: case 1001: case 1002: case 1003: case 1004: | |||
case 1005: case 1006: | |||
setting.defaultMode = num - 1000; | |||
break; | |||
case 1007: case 1008: case 1009: | |||
if ( ! userModeInput ) { | |||
setting.defaultMode = num - 1000; | |||
} | |||
break; | |||
case 1010: | |||
setting.defaultMode = ""; | |||
break; | |||
case 1011: | |||
setting.settingEnable = ! settingEnable; | |||
break; | |||
case 1012: | |||
setting.ignoreUnNamed = ! ignoreUnNamed; | |||
break; | |||
case 1013: | |||
sIsChanged = false; | |||
Status = " " + ScriptName; | |||
var modeChange = userModeInput ? "ポップアップメニュー" | |||
: "入力ダイアログ"; | |||
var confirmStr = ScriptFullName + " \n\n" | |||
+ modeChange | |||
+ " モードへの変更は、ソースコード内で \n" | |||
+ "userModeInput = " + ! userModeInput | |||
+ "; に変更する必要があります。 \n\n" | |||
+ "このマクロの .JS ファイルを開きますか? "; | |||
if ( Confirm( confirmStr ) ) { | |||
OpenJumpJS( "var userModeInput = " ); | |||
} | |||
break; | |||
case 1014: | |||
sIsChanged = false; | |||
Status = " " + ScriptFullName; | |||
OpenJumpJS( "var settingEnable = " ); | |||
break; | |||
case 1015: | |||
sIsChanged = false; | |||
Status = " " + jsonPath; | |||
OpenJumpJson( jsonName ); | |||
break; | |||
case 1016: | |||
sIsChanged = false; | |||
Status = " " + jsonPath; | |||
CheckJsonFile( jsonName ); | |||
break; | |||
default: | |||
sIsChanged = false; | |||
break; | |||
} | |||
if ( sIsChanged ) { | |||
IO.Serialize( setting, jsonName ); | |||
Status = " 設定の変更を保存しました。"; | |||
} | |||
} | |||
/** | |||
* 関数 OpenJumpJS( str ) | |||
* このマクロの JS ファイルを開いて設定項目の行にジャンプする | |||
* 引数: 検索文字列(設定項目の行の文字列) | |||
* ※引数がないときは文頭 | |||
*/ | |||
function OpenJumpJS( str ) { | |||
Redraw = false; | |||
var targetStr = str || ""; | |||
// Count は 1 からの整数値、Item は 0 からの整数値 | |||
var eCount = editors.Count; | |||
var dCount, dItem, ee , dd; | |||
var isOpen = false; | |||
OuterLoop: | |||
for ( var j = 0; j < eCount; j ++ ) { | |||
dCount = editors.Item( j ).documents.Count; | |||
for ( var i = 0; i < dCount; i ++ ) { | |||
dItem = editors.Item( j ).documents.Item( i ); | |||
if ( dItem.FullName == ScriptFullName ) { | |||
isOpen = true; | |||
ee = j; | |||
dd = i; | |||
break OuterLoop; | |||
} | |||
} | |||
} | |||
if ( isOpen ) { | |||
editors.Item( ee ).documents.Item( dd ).Activate(); | |||
} | |||
else { | |||
editor.NewFile(); | |||
ee = ( editors.Count == 1 ) ? 0 : eCount; | |||
editors.Item( ee ).OpenFile( ScriptFullName ); | |||
} | |||
var js = editors.Item( ee ).ActiveDocument; | |||
var settingPos = js.Text.indexOf( targetStr ); | |||
js.selection.SetActivePos( settingPos + targetStr.length ); | |||
js.selection.WordRight( true ); // true/false を範囲選択 | |||
var vy = js.selection.GetActivePointY( mePosView ); | |||
ScrollY = vy; | |||
// 狙った行にスクロールしないようなら、強引にやる | |||
// var ly = js.selection.GetActivePointY( mePosLogical ); | |||
// var WshShell = new ActiveXObject( "WScript.Shell" ); | |||
// WshShell.Run( '"' + editor.FullName + '" /l ' + ly + ' "' | |||
// + ScriptFullName + '"' ); | |||
// ScrollY = vy; | |||
Redraw = true; | |||
} | |||
/** | |||
* 関数 OpenJumpJson( jsonName ) | |||
* JSON ファイルを開く | |||
*/ | |||
function OpenJumpJson( jsonName ) { | |||
// var jsonName = jsonName || ScriptName.replace( /\.js$/i, "" ); | |||
IO.Serialize( setting, jsonName ); | |||
Sleep( 500 ); | |||
var jsonDir = JsonDir(); | |||
var jsonPath = jsonDir + "\\" + jsonName + ".json"; | |||
if ( IO.Path.IsExist( jsonPath ) | |||
&& JsonContents( jsonPath ).length ) { | |||
var confirmStr = "設定ファイルは正常です \n\n" | |||
+ JsonContents( jsonPath ) | |||
+ "設定ファイルを開きますか? "; | |||
if ( Confirm( confirmStr ) ) { | |||
var WshShell = new ActiveXObject( "WScript.Shell" ); | |||
WshShell.Run( '"' + editor.FullName | |||
+ '" "' + jsonPath + '"' ); | |||
} | |||
} | |||
else { | |||
Alert( "設定ファイルがありません \n" | |||
+ jsonDir + " " ); | |||
} | |||
} | |||
/** | |||
* 関数 CheckJsonFile( jsonName ) | |||
* JSON ファイルの初期化/実在確認 | |||
*/ | |||
function CheckJsonFile( jsonName ) { | |||
// var jsonName = jsonName || ScriptName.replace( /\.js$/i, "" ); | |||
var jsonDir = JsonDir(); | |||
var jsonPath = jsonDir + "\\" + jsonName + ".json"; | |||
var confirmStr = jsonPath + " \n\n" | |||
+ "設定ファイルを初期化しますか? " | |||
if ( Confirm( confirmStr ) ) { | |||
IO.Serialize( initialSettings, jsonName ); | |||
Sleep( 500 ); | |||
var alertStr = ( IO.Path.IsExist( jsonPath ) | |||
&& JsonContents( jsonPath ).length ) | |||
? "設定ファイルは正常です \n\n" | |||
+ JsonContents( jsonPath ) | |||
: "設定ファイルがありません \n" | |||
+ jsonDir + " "; | |||
Alert( alertStr ); | |||
} | |||
} | |||
/** | |||
* 関数 JsonDir() | |||
* JSON ファイルの親フォルダのパス | |||
*/ | |||
function JsonDir() { | |||
var jsonDir; | |||
if ( IO.Path.IsExist( editor.FullName.replace( /\.exe$/i, ".ini" ) ) ) { | |||
jsonDir = editor.FullName.replace( /Mery\.exe$/i, "" ) | |||
+ "Macros\\MacroSettings"; | |||
} | |||
else { | |||
var WshShell = new ActiveXObject( "WScript.Shell" ); | |||
jsonDir = WshShell.ExpandEnvironmentStrings( "%APPDATA%" ) | |||
+ "\\Mery\\MacroSettings"; | |||
} | |||
return jsonDir; | |||
} | |||
/** | |||
* 関数 JsonContents( jsonPath [, bool] ) | |||
* JSON ファイルの文字列をメッセージボックス用に整形する | |||
* | |||
* 第1引数は JSON ファイルのパス | |||
* 第2引数は真偽値(省略可) | |||
* true なら \uHHHH をデコードする | |||
*/ | |||
function JsonContents( jsonPath, bool ) { | |||
var contents = ( jsonPath + " \n" | |||
+ IO.LoadFromFile( jsonPath ) | |||
.replace( /^\{/, "\n{\n " ) | |||
.replace( /\}$/g, "\n}\n\n" ) | |||
.replace( /,/g, " ,\n " ) | |||
.replace( /\":/g, "\": " ) | |||
); | |||
if ( bool ) { | |||
// 「テキスト整形」マクロより >> 符号化/復号化 >> \uHHHH デコード | |||
var Decode_uHHHH = function( str ) { | |||
return str.replace( /\\u([0-9A-Fa-f]{4})/g, function( s, n ) { | |||
return String.fromCharCode( Number( "0x" + n ) ) | |||
} ) | |||
}; | |||
return Decode_uHHHH( contents ); | |||
} | |||
else { | |||
// 半角アルファベットの小文字を全角にするなら | |||
contents = contents.replace( /[a-z]/g, | |||
function( $0 ) { | |||
return String.fromCharCode( $0.charCodeAt( 0 ) + 0xFEE0 ) | |||
} ) | |||
return contents; | |||
} | |||
} | |||
</syntaxhighlight> | |||
いつもポップアップメニューのマクロばかりなので、少しだけヒネってみました。 | |||
2024年9月9日 (月) 10:27時点における最新版
いっぺんに複数のタブを閉じます。
- 途中で「保存の確認」ダイアログを表示するタイプと表示しないタイプがあります。
※「保存の確認」ダイアログで「キャンセル」ボタンを押した場合、そのタブは閉じず、他のタブにたいしては「すべて閉じる」の処理を継続します。
ダウンロード[編集]
(最終更新: 2019/05/03)
マクロ×8本、アイコン入り
- 2019/04/25② sukemaru
- 統合版 を追加。
- アイコンのデザインをちょっと変更。
- 2019/05/03 sukemaru
- 途中で「保存の確認」ダイアログが出て「キャンセル」した場合に、元のタブをアクティブにするように変更。
- アイコンのデザインをもうちょっと変更。
- include版 を追加。
すべて閉じる[編集]
ウインドウを閉じるさいに、保存していないタブにたいして「 **** への変更を保存しますか?」の確認ダイアログを表示させずに終了できます。
※基本的に、「未保存*」の名前つきタブがあるときは、保存の確認ダイアログを表示します。
- 「未保存*」以外のタブ(変更マーク「*」がないタブ)をすべて閉じるなら、別ページに「変更なしのタブをすべて閉じる」マクロがあります。
- 「無題」をふくめたすべての「未保存*」のタブについて保存処理や確認ダイアログが必要であれば、ファイルメニューの「すべて保存して閉じる」や「すべて閉じる」を使用してください。
ファイルメニューの「すべて閉じる (Shift+Alt+X)」の マクロコード
// すべてのエディタウインドウを閉じる
editor.ExecuteCommandByID( MEID_FILE_CLOSE_ALL = 2097 );
// アクティブウインドウだけ閉じるなら
// window.Close();
ファイルメニューの「すべて保存して閉じる (Shift+Ctrl+E)」の マクロコード
// すべてのエディタウインドウを閉じる(未保存のタブは保存する)
editor.SaveCloseAll();
保存の確認をせずに閉じる[編集]
すべての「未保存*」タブについて、いっさい保存の確認をせずに閉じます。
※問答無用でエディタウインドウが閉じるので、ご利用は自己責任で。
#title = "すべて閉じる(保存の確認なし)"
#tooltip = "未保存のタブがあっても保存の確認をせずに終了する"
#icon = "close_all[2].ico"
for ( var i = 0; i < editor.Documents.Count; i ++ ) {
editor.Documents.Item( i ).Saved = true;
}
window.Close();
保存の確認ダイログを出す[編集]
名前のある(実体ファイルのある)「未保存*」のタブにたいしては、保存の確認ダイログを表示します。
※「無題」のタブにたいしては、保存の確認をしません。
#title = "すべて閉じる(無題は保存の確認しない)"
#tooltip = "無題のタブは保存の確認をせずに終了する"
#icon = "close_all[1].ico"
for ( var i = 0; i < editor.Documents.Count; i ++ ) {
if ( ! editor.Documents.Item( i ).Name ) {
editor.Documents.Item( i ).Saved = true;
}
}
window.Close();
他のタブを閉じる[編集]
アクティブなタブ以外を閉じます。
※「無題」のタブでも名前つきのタブでも、「未保存*」のタブについては保存の確認ダイアログを表示します。
左側のタブを閉じる[編集]
#title = "左側のタブをすべて閉じる"
#tooltip = "左側のタブをすべて閉じる"
#icon = "close_left.ico"
var d = document;
var dCount = editor.Documents.Count;
var docu, hit;
for ( var i = dCount - 1; i >= 0; i -- ) {
docu = editor.Documents.Item( i );
if ( docu == d ) { hit = 1; continue; }
if ( ! hit ) { continue; }
docu.Close();
}
d.Activate();
右側のタブをすべて閉じる[編集]
#title = "右側のタブをすべて閉じる"
#tooltip = "右側のタブをすべて閉じる"
#icon = "close_right.ico"
var d = document;
var dCount = editor.Documents.Count;
for ( var i = dCount - 1; editor.Documents.Item( i ) != d; i -- ) {
editor.Documents.Item( i ).Close();
}
d.Activate();
他のタブをすべて閉じる[編集]
#title = "他のタブをすべて閉じる"
#tooltip = "他のタブをすべて閉じる"
#icon = "close_other.ico"
var d = document;
var dCount = editor.Documents.Count;
var docu;
for ( var i = dCount - 1; i >= 0; i -- ) {
docu = editor.Documents.Item( i );
if ( docu != d ) {
docu.Close();
}
}
d.Activate();
他のタブをすべて閉じる(オプションつき)[編集]
※「未保存*」のタブにたいして 保存の確認ダイログを表示するか/しないか のオプションを設定できます。
※設定項目で動作モードを 1 や 2 に変更して別名の .JS ファイルに保存すれば、「右側/左側のタブをすべて閉じる」マクロになります。
#title = "他のタブをすべて閉じる"
#tooltip = "他のタブをすべて閉じる"
#icon = "close_other.ico"
// ---------- ▼ 設定項目 ▼ ----------
var closeMode = 0;
// 0: 他のタブをすべて閉じる
// 1: 右側のタブをすべて閉じる
// 2: 左側のタブをすべて閉じる
var ignoreUnNamed = false;
// true: 「無題」ドキュメントにたいしては保存の確認ダイアログを表示しない
// false: 「無題」ドキュメントにたいしても保存の確認ダイアログを表示する
// ---------- ▲ 設定項目 ▲ ----------
var d = document;
var dCount = editor.Documents.Count;
var dd, docu;
for ( var i = 0; i < dCount; i ++ ) {
docu = editor.Documents.Item( i );
if ( docu == d ) {
dd = i;
break;
}
}
// 他のタブをすべて閉じる
var start = ( closeMode == 2 ) ? dd - 1 : dCount - 1;
var end = ( closeMode == 1 ) ? dd + 1 : 0;
for ( var i = start; i + 1 > end; i -- ) {
docu = editor.Documents.Item( i );
if ( docu != d ) {
if ( ignoreUnNamed && docu.Name == "" ) {
docu.Saved = true;
}
docu.Close();
}
}
d.Activate();
「すべて閉じる」の統合版(モード選択)[編集]


「すべて閉じる」と「他のタブを閉じる」の機能 全部入り です。
※入力ダイアログかポップアップメニューで動作モードを指定します(ソースコード内の設定項目で「デフォルト値」を指定しておくと Enter または Space キーだけで処理を開始できます)。
#title = "すべて閉じる(モード選択)"
#tooltip = "すべて閉じる(入力ダイアログ)"
#icon = "close_all[4].ico"
// または #tooltip = "すべて閉じる(ポップアップメニュー)"
// ---------- ▼ 設定項目 ▼ ----------
// ■起動モード
var userModeInput = true;
// true: 入力ダイアログ
// false: ポップアップメニュー
// ■デフォルト値( 1 ~ 6 )
var defaultMode = "";
// デフォルト: 入力ダイアログでは Enter キーで確定
// ポップアップメニューでは Space キーで確定
// "": 表示しない
// 1: 他のタブをすべて閉じる
// 2: 左側のタブをすべて閉じる
// 3: 右側のタブをすべて閉じる
// 4: 変更なしのタブをすべて閉じる(「未保存*」のタブは閉じない)
// 5: すべてのタブを閉じる
// 6: 問答無用ですべて閉じる(すべてのタブの「未保存*」を無視)
// ※ 4 ですべてのタブが保存済み、かつタブの閉じるボタンを表示している場合は、
// さいごに新規「無題」タブが残る(閉じるボタン無しならウインドウが閉じる)
// ※ 4, 6 以外は、「未保存*」の名前つきドキュメントで保存の確認ダイアログ
// ※ 5, 6 で閉じた場合、「ワークスペース」の復元可(Mery Ver. 2.6.15 以降)
// ■未保存* の「無題」ドキュメント
var ignoreUnNamed = false;
// true: 保存の確認ダイアログを表示しない
// false: 保存の確認ダイアログを表示する
// ※ mode = 6 では無効(表示しない)
// ---------- ▲ 設定項目 ▲ ----------
var mode;
// 入力ダイアログ
if ( userModeInput ) {
// (全角 0-9 のみ)半角変換した数字を文字列で返す
var ToHalfWidthNum = function( strVal ){
return strVal.replace( /[0-9]/g, function( tmp ) {
return String.fromCharCode( tmp.charCodeAt(0) - 0xFEE0 )
} ) };
// 1 ~ 6 以外の無効な文字列はすべて無視
mode = + ToHalfWidthNum( Prompt( "1: 他のタブ. 2: 左側. 3: 右側. 4: 変更なし. 5: すべて. 6: 強制終了.", defaultMode ) ).replace( /[^1-6]/g , "" );
}
// ポップアップメニュー
else {
var menu = CreatePopupMenu();
menu.Add( "&1:\t他のタブをすべて閉じる", 1 );
menu.Add( "&2:\t左側のタブをすべて閉じる", 2 );
menu.Add( "&3:\t右側のタブをすべて閉じる", 3 );
menu.Add( "&4:\t変更なしのタブをすべて閉じる", 4 );
menu.Add( "&5:\tすべてのタブを閉じる", 5 );
menu.Add( "&6:\t未保存* を無視してすべて閉じる", 6 );
if ( /^[0-6]$/.test( defaultMode.toString() ) ) {
menu.Add( "", 0, meMenuSeparator );
menu.Add( defaultMode + ":\tデフォルトモードを実行 ( Space& キー )", + defaultMode );
}
menu.Add( "", 0, meMenuSeparator );
menu.Add( "&0:\tキャンセル", 0 );
mode = menu.Track( mePosMouse );
}
var d = document;
var dCount = editor.Documents.Count;
var dd, docu;
switch ( mode ) {
// 他のタブをすべて閉じる
case 1: case 2: case 3:
loop:
for ( var i = 0; i < dCount; i ++ ) {
docu = editor.Documents.Item( i );
if ( docu == d ) {
dd = i;
break loop;
}
}
var start = ( mode == 2 ) ? dd - 1 : dCount - 1;
var end = ( mode == 3 ) ? dd + 1 : 0;
for ( var i = start; i + 1 > end; i -- ) {
docu = editor.Documents.Item( i );
if ( docu != d ) {
if ( ignoreUnNamed && ! docu.Name ) {
docu.Saved = true;
}
docu.Close();
}
}
d.Activate();
break;
// すべて閉じる
case 4: case 5: case 6:
for ( var i = dCount- 1; i + 1 > 0; i -- ) {
docu = editor.Documents.Item( i );
if ( mode == 4 && docu.Saved ) {
docu.Close();
}
else if ( mode == 6
|| ( mode == 5 && ignoreUnNamed && ! docu.Name ) ) {
docu.Saved = true;
}
}
if ( mode != 4 ) {
window.Close();
}
break;
default:
break;
}
「すべて閉じる」の統合版(include版)[編集]
macros フォルダに includeライブラリ を導入しているばあいは、「統合版」の設定をポップアップメニュー内のサブメニューからから変更できるという …ただそれだけです(一応メニュー項目を少し増やしてます)。
興味のある方は、ZIP書庫 内の「include版」フォルダの JS ファイルをご利用ください。
※ ソースコード4行目「#include "include/IO.js"」をコメントアウトすると、ふつうの「統合版」としても使用できます。
#title = "すべて閉じる(モード選択)"
#tooltip = "すべて閉じる(ポップアップメニュー)"
#icon = "close_all[4].ico"
#include "include/IO.js"
// または #tooltip = "すべて閉じる(入力ダイアログ)"
// ---------- ▼ 設定項目 ▼ ----------
// ■ 起動モード
var userModeInput = false;
// true: 入力ダイアログ
// false: ポップアップメニュー
// ■ デフォルト値( 1 ~ 6 )
var defaultMode = "";
// デフォルト: 入力ダイアログでは Enter キーで確定
// ポップアップメニューでは Space キーで確定
// "": 表示しない
// 1: 他のタブをすべて閉じる
// 2: 左側のタブをすべて閉じる
// 3: 右側のタブをすべて閉じる
// 4: 変更なしのタブをすべて閉じる(「未保存*」のタブは閉じない)
// 5: すべてのタブを閉じる
// 6: 問答無用ですべて閉じる(すべてのタブの「未保存*」を無視)
// ▼ ポップアップメニュー専用(※「無題」タブの「未保存*」確認あり) ▼
// 7: すべて閉じる (※同一ウインドウ内の全タブ)
// 8: すべて閉じる (※ファイルメニューのコマンド)
// 9: すべて保存して閉じる (※ファイルメニューのコマンド)
// ※ 4 ですべてのタブが保存済み、かつタブの閉じるボタンを表示している場合は、
// さいごに新規「無題」タブが残る(閉じるボタン無しならウインドウが閉じる)
// ※ 4, 6 以外は、「未保存*」の名前つきドキュメントで保存の確認ダイアログ
// ※ 1 ~ 7 で閉じるのは同一ウインドウ内のタブのみ
// ※ 8, 9 は、すべてのエディタウインドウの全タブ
// ※ 5 ~ 9 で閉じた場合、「ワークスペース」の復元可(Mery Ver. 2.6.15 以降)
// ■未保存* の「無題」ドキュメント
var ignoreUnNamed = false;
// true: 保存の確認ダイアログを表示しない
// false: 保存の確認ダイアログを表示する
// ※ mode = 6 ~ 8 では ignoreUnNamed オプション無効
// ---------- ▼ 【include版】 初期設定項目 ▼ ----------
// ソースコードの4行目 #include "include/IO.js" が有効で
// 起動モードがポップアップメニューの場合のみ使用可
// ◆ 「設定変更」サブメニューを表示するか?
var settingEnable = true;
// ◆ JSON ファイルのベース名
var jsonName = ScriptName.replace( /\.js$/i, "" );
// ---------- ▲ 設定項目 ▲ ----------
/* ▼ 【include版】の追加コード ▼ */
var setting;
var initialSettings = { settingEnable: false };
if ( typeof IO == "object" && settingEnable ) {
initialSettings = {
settingEnable: settingEnable,
userModeInput: userModeInput,
defaultMode: defaultMode,
ignoreUnNamed: ignoreUnNamed
}
setting = initialSettings;
jsonName = jsonName || ScriptName.replace( /\.js$/i, "" );
setting = IO.Deserialize( setting, jsonName );
settingEnable = setting.settingEnable;
// userModeInput = setting.userModeInput;
defaultMode = setting.defaultMode;
ignoreUnNamed = setting.ignoreUnNamed;
}
var mode;
// 入力ダイアログ
if ( userModeInput ) {
// 半角変換した ascii 文字列を返す
var ToHalfWidth = function( strVal ){
return strVal.replace( /[!-~]/g, function( tmp ) {
return String.fromCharCode( tmp.charCodeAt(0) - 0xFEE0 )
} ) };
// 1 ~ 6 以外の無効な文字列はすべて無視
var label = "1: 他のタブ. 2: 左側. 3: 右側. 4: 変更なし. 5: すべて. 6: 強制終了.";
var string = defaultMode > 6 ? "" : defaultMode;
mode = ToHalfWidth( Prompt( label, string ) ).toLowerCase();
/* 【include版】の追加コード */
// ※ include 版で "js" か "open" と入力した場合は、JS ファイルを開く
// または "menu" か "setting" と入力した場合は、ポップアップメニューを開く
mode = ( typeof IO == "object" && initialSettings.settingEnable )
? ( mode == "js" || mode == "open" )
? 1014
: ( mode == "menu" || mode == "setting" )
? "menu"
: + mode.replace( /[^1-6]/g , "" )
: + mode.replace( /[^1-6]/g , "" );
}
// ポップアップメニュー
if ( ! userModeInput || mode == "menu" ) {
var menu = CreatePopupMenu();
/* 【include版】の設定変更サブメニュー */
if ( initialSettings.settingEnable ) {
SettingsMenu( menu );
}
menu.Add( "&0:\tキャンセル", 0 );
menu.Add( "", 10, meMenuSeparator );
menu.Add( "&1:\t他のタブをすべて閉じる", 1 );
menu.Add( "&2:\t左側のタブをすべて閉じる", 2 );
menu.Add( "&3:\t右側のタブをすべて閉じる", 3 );
menu.Add( "&4:\t変更なしのタブをすべて閉じる", 4 );
menu.Add( "&5:\tすべてのタブを閉じる", 5 );
menu.Add( "&6:\t未保存* の確認なしですべて閉じる", 6 );
menu.Add( "", 10, meMenuSeparator );
menu.Add( "&7:\tすべて閉じる (同一ウインドウ)", 7 );
menu.Add( "&8:\tすべて閉じる (全ウインドウ)", 8 );
menu.Add( "&9:\tすべて保存して閉じる (全ウインドウ)", 9 );
if ( /^[0-9]$/.test( defaultMode.toString() ) ) {
menu.Add( "", 10, meMenuSeparator );
// デフォルトモードのラベルで表示するなら(※「キャンセル」を先頭にピンすること)
menu.Add( menu.GetText( defaultMode ).replace( "&", "" ) + " ( Space& キー )", + defaultMode );
// // 「デフォルトモードを実行」で表示するなら
// menu.Add( defaultMode + ":\tデフォルトモードを実行 ( Space& キー )", + defaultMode );
}
mode = menu.Track( mePosMouse );
}
/* 【include版】の設定変更サブメニュー項目を選択した場合 */
// include 版の設定変更
if ( typeof IO == "object" && mode >= 1000 ) {
SettingsChange( mode );
}
else {
var d = document;
var dCount = editor.Documents.Count;
var dd, docu;
switch ( mode ) {
// 他のタブをすべて閉じる
case 1: case 2: case 3:
loop:
for ( var i = 0; i < dCount; i ++ ) {
docu = editor.Documents.Item( i );
if ( docu == d ) {
dd = i;
break loop;
}
}
var start = ( mode == 2 ) ? dd - 1 : dCount - 1;
var end = ( mode == 3 ) ? dd + 1 : 0;
for ( var i = start; i + 1 > end; i -- ) {
docu = editor.Documents.Item( i );
if ( docu != d ) {
if ( ignoreUnNamed && ! docu.Name ) {
docu.Saved = true;
}
docu.Close();
}
}
break;
// すべて閉じる
case 4: case 5: case 6:
for ( var i = dCount- 1; i + 1 > 0; i -- ) {
docu = editor.Documents.Item( i );
if ( mode == 4 && docu.Saved ) {
docu.Close();
}
else if ( mode == 6
|| ( mode == 5 && ignoreUnNamed && ! docu.Name ) ) {
docu.Saved = true;
}
}
if ( mode != 4 ) {
window.Close();
}
break;
// すべて閉じる(同一ウインドウ内の全タブ)
case 7:
window.Close();
break;
// すべて閉じる(ファイルメニューのコマンド、すべてのエディタウインドウ)
case 8:
editor.ExecuteCommandByID( MEID_FILE_CLOSE_ALL = 2097 );
break;
// すべて保存して閉じる(ファイルメニューのコマンド、すべてのエディタウインドウ)
case 9:
editor.SaveCloseAll();
break;
default:
break;
}
if ( document == d ) {
d.Activate();
}
}
/* ▼ 【include版】の追加コード ▼ */
/**
* 関数 SettingsMenu( objPopupMenu )
* ポップアップメニューに「設定変更」サブメニューを表示する
* 引数: メインコードのポップアップメニューオブジェクト
*/
function SettingsMenu( objMenu ) {
var subMenu = CreatePopupMenu();
// メニューのオプションフラグ
// ※定数 meMenuChecked の値は 1 なので xxxEnable *1 で代用できる
var Check = function( num ) {
return + ( defaultMode.toString() == num.toString() );
}
var grayFlag = settingEnable ? 0 : meMenuGrayed;
// 「設定変更」サブメニューのアイテム
objMenu.AddPopup( "\t設定を変更する (&S)", subMenu );
objMenu.Add( "", 100, meMenuSeparator );
subMenu.Add( "\t未保存* タブの保存を確認する (&C)", 1012, !ignoreUnNamed*1 + grayFlag );
subMenu.Add( "", 100, meMenuSeparator );
subMenu.Add( "\t▼ デフォルトモードを変更する ▼", 10 , meMenuGrayed );
subMenu.Add( "&0:\tキャンセル", 1000, Check( 0 ) + grayFlag );
subMenu.Add( "&1:\t他のタブをすべて閉じる", 1001, Check( 1 ) + grayFlag );
subMenu.Add( "&2:\t左側のタブをすべて閉じる", 1002, Check( 2 ) + grayFlag );
subMenu.Add( "&3:\t右側のタブをすべて閉じる", 1003, Check( 3 ) + grayFlag );
subMenu.Add( "&4:\t変更なしのタブをすべて閉じる", 1004, Check( 4 ) + grayFlag );
subMenu.Add( "&5:\tすべてのタブを閉じる", 1005, Check( 5 ) + grayFlag );
subMenu.Add( "&6:\t未保存* の確認なしですべて閉じる", 1006, Check( 6 ) + grayFlag );
subMenu.Add( "&7:\tすべて閉じる (同一ウインドウ)", 1007, Check( 7 ) + grayFlag );
subMenu.Add( "&8:\tすべて閉じる (全ウインドウ)", 1008, Check( 8 ) + grayFlag );
subMenu.Add( "&9:\tすべて保存して閉じる (全ウインドウ", 1009, Check( 9 ) + grayFlag );
subMenu.Add( "&10:\t(なし)", 1010, Check( "" ) + grayFlag );
subMenu.Add( "\t▲ デフォルトモードを変更する ▲", 10, meMenuGrayed );
subMenu.Add( "", 10, meMenuSeparator );
subMenu.Add( "", 10, meMenuSeparator );
subMenu.Add( "\t設定内容をロックする (&S)", 1011, !settingEnable*1 );
subMenu.Add( ( userModeInput ? "\tポップアップメニュー" : "\t入力ダイアログ" )
+ "モードに変更する (&M)", 1013, grayFlag );
subMenu.Add( "", 10, meMenuSeparator );
subMenu.Add( "\t「閉じる」マクロの JS ファイルを開く (&O)", 1014 );
subMenu.Add( "\t「閉じる」マクロの JSON ファイルを開く (&J)", 1015 );
subMenu.Add( "", 10, meMenuSeparator );
subMenu.Add( "\t設定内容を初期化する (&I)", 1016, grayFlag );
subMenu.Add( "& \tキャンセル", 0 );
}
/**
* 関数 SettingsChange( num )
* ポップアップメニューで選択した項目の設定状態を変更する
*/
function SettingsChange( num ) {
// var setting = IO.Deserialize( setting, jsonName );
var jsonPath = JsonDir() + "\\" + jsonName + ".json";
var sIsChanged = true;
switch ( num ) {
case 1000: case 1001: case 1002: case 1003: case 1004:
case 1005: case 1006:
setting.defaultMode = num - 1000;
break;
case 1007: case 1008: case 1009:
if ( ! userModeInput ) {
setting.defaultMode = num - 1000;
}
break;
case 1010:
setting.defaultMode = "";
break;
case 1011:
setting.settingEnable = ! settingEnable;
break;
case 1012:
setting.ignoreUnNamed = ! ignoreUnNamed;
break;
case 1013:
sIsChanged = false;
Status = " " + ScriptName;
var modeChange = userModeInput ? "ポップアップメニュー"
: "入力ダイアログ";
var confirmStr = ScriptFullName + " \n\n"
+ modeChange
+ " モードへの変更は、ソースコード内で \n"
+ "userModeInput = " + ! userModeInput
+ "; に変更する必要があります。 \n\n"
+ "このマクロの .JS ファイルを開きますか? ";
if ( Confirm( confirmStr ) ) {
OpenJumpJS( "var userModeInput = " );
}
break;
case 1014:
sIsChanged = false;
Status = " " + ScriptFullName;
OpenJumpJS( "var settingEnable = " );
break;
case 1015:
sIsChanged = false;
Status = " " + jsonPath;
OpenJumpJson( jsonName );
break;
case 1016:
sIsChanged = false;
Status = " " + jsonPath;
CheckJsonFile( jsonName );
break;
default:
sIsChanged = false;
break;
}
if ( sIsChanged ) {
IO.Serialize( setting, jsonName );
Status = " 設定の変更を保存しました。";
}
}
/**
* 関数 OpenJumpJS( str )
* このマクロの JS ファイルを開いて設定項目の行にジャンプする
* 引数: 検索文字列(設定項目の行の文字列)
* ※引数がないときは文頭
*/
function OpenJumpJS( str ) {
Redraw = false;
var targetStr = str || "";
// Count は 1 からの整数値、Item は 0 からの整数値
var eCount = editors.Count;
var dCount, dItem, ee , dd;
var isOpen = false;
OuterLoop:
for ( var j = 0; j < eCount; j ++ ) {
dCount = editors.Item( j ).documents.Count;
for ( var i = 0; i < dCount; i ++ ) {
dItem = editors.Item( j ).documents.Item( i );
if ( dItem.FullName == ScriptFullName ) {
isOpen = true;
ee = j;
dd = i;
break OuterLoop;
}
}
}
if ( isOpen ) {
editors.Item( ee ).documents.Item( dd ).Activate();
}
else {
editor.NewFile();
ee = ( editors.Count == 1 ) ? 0 : eCount;
editors.Item( ee ).OpenFile( ScriptFullName );
}
var js = editors.Item( ee ).ActiveDocument;
var settingPos = js.Text.indexOf( targetStr );
js.selection.SetActivePos( settingPos + targetStr.length );
js.selection.WordRight( true ); // true/false を範囲選択
var vy = js.selection.GetActivePointY( mePosView );
ScrollY = vy;
// 狙った行にスクロールしないようなら、強引にやる
// var ly = js.selection.GetActivePointY( mePosLogical );
// var WshShell = new ActiveXObject( "WScript.Shell" );
// WshShell.Run( '"' + editor.FullName + '" /l ' + ly + ' "'
// + ScriptFullName + '"' );
// ScrollY = vy;
Redraw = true;
}
/**
* 関数 OpenJumpJson( jsonName )
* JSON ファイルを開く
*/
function OpenJumpJson( jsonName ) {
// var jsonName = jsonName || ScriptName.replace( /\.js$/i, "" );
IO.Serialize( setting, jsonName );
Sleep( 500 );
var jsonDir = JsonDir();
var jsonPath = jsonDir + "\\" + jsonName + ".json";
if ( IO.Path.IsExist( jsonPath )
&& JsonContents( jsonPath ).length ) {
var confirmStr = "設定ファイルは正常です \n\n"
+ JsonContents( jsonPath )
+ "設定ファイルを開きますか? ";
if ( Confirm( confirmStr ) ) {
var WshShell = new ActiveXObject( "WScript.Shell" );
WshShell.Run( '"' + editor.FullName
+ '" "' + jsonPath + '"' );
}
}
else {
Alert( "設定ファイルがありません \n"
+ jsonDir + " " );
}
}
/**
* 関数 CheckJsonFile( jsonName )
* JSON ファイルの初期化/実在確認
*/
function CheckJsonFile( jsonName ) {
// var jsonName = jsonName || ScriptName.replace( /\.js$/i, "" );
var jsonDir = JsonDir();
var jsonPath = jsonDir + "\\" + jsonName + ".json";
var confirmStr = jsonPath + " \n\n"
+ "設定ファイルを初期化しますか? "
if ( Confirm( confirmStr ) ) {
IO.Serialize( initialSettings, jsonName );
Sleep( 500 );
var alertStr = ( IO.Path.IsExist( jsonPath )
&& JsonContents( jsonPath ).length )
? "設定ファイルは正常です \n\n"
+ JsonContents( jsonPath )
: "設定ファイルがありません \n"
+ jsonDir + " ";
Alert( alertStr );
}
}
/**
* 関数 JsonDir()
* JSON ファイルの親フォルダのパス
*/
function JsonDir() {
var jsonDir;
if ( IO.Path.IsExist( editor.FullName.replace( /\.exe$/i, ".ini" ) ) ) {
jsonDir = editor.FullName.replace( /Mery\.exe$/i, "" )
+ "Macros\\MacroSettings";
}
else {
var WshShell = new ActiveXObject( "WScript.Shell" );
jsonDir = WshShell.ExpandEnvironmentStrings( "%APPDATA%" )
+ "\\Mery\\MacroSettings";
}
return jsonDir;
}
/**
* 関数 JsonContents( jsonPath [, bool] )
* JSON ファイルの文字列をメッセージボックス用に整形する
*
* 第1引数は JSON ファイルのパス
* 第2引数は真偽値(省略可)
* true なら \uHHHH をデコードする
*/
function JsonContents( jsonPath, bool ) {
var contents = ( jsonPath + " \n"
+ IO.LoadFromFile( jsonPath )
.replace( /^\{/, "\n{\n " )
.replace( /\}$/g, "\n}\n\n" )
.replace( /,/g, " ,\n " )
.replace( /\":/g, "\": " )
);
if ( bool ) {
// 「テキスト整形」マクロより >> 符号化/復号化 >> \uHHHH デコード
var Decode_uHHHH = function( str ) {
return str.replace( /\\u([0-9A-Fa-f]{4})/g, function( s, n ) {
return String.fromCharCode( Number( "0x" + n ) )
} )
};
return Decode_uHHHH( contents );
}
else {
// 半角アルファベットの小文字を全角にするなら
contents = contents.replace( /[a-z]/g,
function( $0 ) {
return String.fromCharCode( $0.charCodeAt( 0 ) + 0xFEE0 )
} )
return contents;
}
}
いつもポップアップメニューのマクロばかりなので、少しだけヒネってみました。