すべて閉じる

いっぺんに複数のタブを閉じます。

  • 途中で「保存の確認」ダイアログを表示するタイプと表示しないタイプがあります。

※「保存の確認」ダイアログで「キャンセル」ボタンを押した場合、そのタブは閉じず、他のタブにたいしては「すべて閉じる」の処理を継続します。

ダウンロード編集

ファイル:すべて閉じるマクロ集.zip

(最終更新: 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;
  }
}

いつもポップアップメニューのマクロばかりなので、少しだけヒネってみました。

スポンサーリンク