「
ファイルを読み直す・開きなおす
」を編集中 (節単位)
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
== ソースコード == <syntaxhighlight lang="javascript" style="height:120em; overflow:auto;" highlight="15-35,230-285"> #title = "ファイルを読み直す・開きなおす..." #tooltip = "エンコード指定/読み取り専用属性/編集モードの変更" #icon = "reload.ico" // #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",262 var start = new Date(); // 所要時間計測(開始) /** * --------------------------------------------------------- * ファイルを読み直す・開きなおす * sukemaru (2019-03-29 - 2019-11-30) * --------------------------------------------------------- */ // ---------- ▼ 設定項目 ▼ ---------- // // ■「編集モード」を Mery.ini から自動で取得する var viewModeAutoSerchEnable = false; // ■諸外国語用(UTF-** とシフトJIS 以外)の文字コードを表示する var variousLanguageEnable = true; // ■エンコードを変更して読みなおししたとき変更前のテキストを貼り付けする var pasteAfterReload = false; // ■「さいごに閉じたファイル」の件数 var numLatestClosed = 5; // ■「さいごに閉じたファイル」に自動保存・バックアップフォルダのファイルを含めない var woAutoSaved = false; // ■ ポップアップメニューを表示する位置 var menuPosMouse = true; // ---------- ▲ 設定項目 ▲ ---------- // var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); var WshShell = new ActiveXObject( "WScript.Shell" ); var d = editor.ActiveDocument; var fullPath = Fso.FileExists( d.FullName ) ? d.FullName : ""; var desktopDir = WshShell.SpecialFolders( "Desktop" ); var currentDir = WshShell.CurrentDirectory; // Mery フォルダとデータフォルダ var meryPath = editor.FullName; var mery = Fso.GetBaseName( meryPath ); var meryDir = Fso.GetParentFolderName( meryPath ) + "\\"; var profileDir = meryDir; var iniPath = meryDir + mery + ".ini"; var hisPath = meryDir + mery + ".his"; if ( ! Fso.FileExists( iniPath ) ) { profileDir = WshShell.SpecialFolders( "APPDATA" ) + "\\Mery\\"; iniPath = profileDir + mery + ".ini"; hisPath = profileDir + mery + ".his"; } var profileDirExist = ( profileDir != meryDir ); var meryVer = + ( editor.Version.replace( /[0-9]+/g , function( digit ) { return digit.length < 2 ? "0" + digit : digit } ).replace( /\./g, "" ).slice( 0, 6 ) ); // エンコード と 編集モード var dEnc = d.Encoding; var dMode = d.Mode; // Mery.ini から情報収集 var iniKey = [ "AutoSaveEnabled", "AutoSaveToFolder", "AutoSaveFolder" , "BackupSaveToFolder", "BackupFolder" , "TabCloseButton" , "SaveHistory" ]; /* 配列 iniValue には編集モード名の配列もふくまれる */ // GetIniOption 関数は「読みなおし」マクロ用に改造 var iniValue = GetIniOptionRL( iniPath, iniKey, viewModeAutoSerchEnable ); // メニューに付けるチェックマークとグレーアウト設定 // 書き換え禁止フラグ var dReadOnly = d.ReadOnly; var rCheckFlags = dReadOnly ? meMenuChecked : 0; var rGrayFlags1 = dReadOnly ? meMenuGrayed : 0; var rGrayFlags2 = dReadOnly ? 0 : meMenuGrayed; // ウインドウの「タブを有効にする」と「閉じるボタン」の設定状態 var tabEnable = editor.EnableTab; if ( fullPath ) { var tabCloseButton = iniValue[0][5]; // 「読み取り専用属性 ON/OFF」と「閉じて開きなおす」の必要条件 var reopenEnable = ( tabEnable && ( editor.documents.Count > 1 || tabCloseButton ) ); // 読み取り専用属性 var f = Fso.GetFile( fullPath ); var attributeReadOnly = ( f.Attributes & 1 ); var aCheckFlags = attributeReadOnly ? meMenuChecked : 0; var aGrayFlags = tabEnable ? 0 : meMenuGrayed; var aGrayFlags1 = attributeReadOnly ? meMenuGrayed : 0; var aGrayFlags2 = attributeReadOnly ? 0 : meMenuGrayed; // エンコード 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 versionCheck20609 = ( meryVer >= 20609 ); if ( versionCheck20609 ) { // 相対パス解決のためにカレントディレクトリを設定 WshShell.CurrentDirectory = meryDir; var autoSaveFolder = Fso.GetAbsolutePathName( iniValue[0][2] ); var backupFolder = Fso.GetAbsolutePathName( iniValue[0][4] ); // パスが "" のときも FolderExists は True なのでグレーアウトの条件を追加 var autoSaveFlags = ( iniValue[0][1] && iniValue[0][2] && Fso.FolderExists( autoSaveFolder ) ) ? 0 : meMenuGrayed; var backupFlags = ( iniValue[0][3] && Fso.FolderExists( backupFolder ) ) ? 0 : meMenuGrayed; } else { woAutoSaved = false; } var autoSaveBackup = ( versionCheck20609 && ( autoSaveFlags == 0 || backupFlags == 0 ) ); // さいごに閉じたファイル if ( numLatestClosed > 0 ) { var saveHistory = iniValue[0][6]; if ( saveHistory ) { var setting = [ numLatestClosed, woAutoSaved ]; var folders = [ autoSaveFolder, backupFolder ]; var latestClosedFile = LatestClosedFile( hisPath, setting, folders ); numLatestClosed = latestClosedFile.length; } } // ポップアップメニュー項目 var m = CreatePopupMenu(); var sm1 = CreatePopupMenu(); // ファイル・フォルダ サブメニュー var sm2 = CreatePopupMenu(); // 編集モード サブメニュー m.Add( "書き換え禁止 ON/OFF (&Y)", 2, rCheckFlags ); // 「無題」ドキュメントではファイル・フォルダ サブメニューを表示しない if ( fullPath ) { if ( tabEnable ) { m.Add( "読み取り専用属性 ON/OFF (&W)", 3, aCheckFlags + aGrayFlags ); m.Add( "閉じて開きなおす (&L)", 1 ); } m.Add( "", 0, meMenuSeparator ); m.Add( "親フォルダを開く (&F)", 10 ); m.Add( "フルパスをコピー (&C)", 32 ); m.Add( "プロパティ (&R)", 4 ); // ファイル・フォルダ サブメニュー m.Add( "", 0, meMenuSeparator ); m.AddPopup( "ファイル・フォルダ サブメニュー (&F)", sm1 ); sm1.Add( "書き換え禁止にする (&Y)", 2, rGrayFlags1 ); sm1.Add( "書き換え禁止を解除 (&Y)", 2, rGrayFlags2 ); sm1.Add( "", 0, meMenuSeparator ); if ( tabEnable ) { sm1.Add( "読み取り専用属性にして開きなおす (&W)", 3, aGrayFlags1 ); sm1.Add( "読み取り専用属性を解除して開きなおす (&W)", 3, aGrayFlags2 ); sm1.Add( "", 0, meMenuSeparator ); } sm1.Add( "", 0, meMenuSeparator ); sm1.Add( "フルパスをコピー (&C)", 32 ); sm1.Add( "ファイル名をコピー (&N)", 33 ); if ( tabEnable && d.Text ) { sm1.Add( "新規タブで開く (&G)", 64 ); } sm1.Add( "メモ帳で開く (&V)", 62 ); sm1.Add( "デスクトップにコピー (&X)", 60 ); sm1.Add( "任意のフォルダにコピー (&Z) ...", 61 ); sm1.Add( "", 0, meMenuSeparator ); sm1.Add( "プロパティ (&R)", 4 ); sm1.Add( "", 0, meMenuSeparator ); sm1.Add( "親フォルダのパスをコピー (&F)", 34 ); sm1.Add( "親フォルダを開く (&P)", 10 ); sm1.Add( "", 0, meMenuSeparator ); sm1.Add( mery + ".exe のフルパスをコピー (&E)", 30 ); sm1.Add( "Mery フォルダのパスをコピー (&D)", 31 ); sm1.Add( "Mery フォルダを開く (&M)", 11 ); if ( profileDirExist ) { sm1.Add( "ユーザーフォルダを開く (&U)", 12 ); } if ( autoSaveBackup ) { sm1.Add( "自動保存フォルダを開く (&A)", 13, autoSaveFlags ); sm1.Add( "バックアップフォルダを開く (&B)", 14, backupFlags ); } sm1.Add( "デスクトップフォルダを開く (&H)", 15 ); // 「さいごに閉じたファイル」 if ( numLatestClosed > 0 ) { LatestClosedFileMenu( latestClosedFile, sm1, 300 ); } sm1.Add( "", 0, meMenuSeparator ); sm1.Add( "Mery.txt を開く (&T)", 41 ); sm1.Add( mery + ".ini を開く (&I)", 42 ); sm1.Add( "「読み直し」マクロの JS ファイルを開く (&J)", 6 ); sm1.Add( "オプション (&O) ...", 5 ); sm1.Add( "", 0, meMenuSeparator ); sm1.Add( "キャンセル & ", 0 ); // Esc キーまたは Space キーでキャンセル可 } // 編集モード サブメニュー m.Add( "", 0, meMenuSeparator ); m.AddPopup( "編集モード サブメニュー (&M)", sm2 ); sm2.Add( "現在の編集モードのプロパティ (&P)...", 100 ); sm2.Add( "", 0, meMenuSeparator ); // 編集モードサブメニューの項目を自動で生成する場合 if ( viewModeAutoSerchEnable ) { var len = iniValue[1].length, mode; for ( var i = 0; i < len; i ++ ) { mode = iniValue[1][i].replace( /&/g, "&&" ); sm2.Add( "&" + mode, i + 5120, ( dMode == mode ) *1 ) // 下にセパレータを入れたい if ( mode == "XML" && i + 1 != len ) { sm2.Add( "", 0, meMenuSeparator ); } } sm2.Add( "", 0, meMenuSeparator ); sm2.Add( "編集モードの設定 (&C) ...", 200 ); } // 編集モードサブメニューの項目を手動で取捨選択する場合 else { sm2.Add( "編集モードの設定 (&C)...", 200 ); sm2.Add( "", 0, meMenuSeparator ); /** * 以下、追加/削除したものがあれば任意で変更すること。 * ※ 編集モード各アイテムは sm2.Add(); の行のコメントアウトで非表示にできる * ※ sm2 グループ内での並べ替え可。 */ // ▼ デフォルトの編集モード ▼ sm2.Add( "&Bat", 101, + ( dMode == "Bat" ) ); sm2.Add( "C&#", 102, + ( dMode == "C#" ) ); sm2.Add( "C&++", 103, + ( dMode == "C++" ) ); sm2.Add( "ColdFusion", 104, + ( dMode == "ColdFusion" ) ); sm2.Add( "&CSS", 105, + ( dMode == "CSS" ) ); sm2.Add( "&Delphi", 106, + ( dMode == "Delphi" ) ); sm2.Add( "HSP", 107, + ( dMode == "HSP" ) ); sm2.Add( "&HTML", 108, + ( dMode == "HTML" ) ); sm2.Add( "&INI", 109, + ( dMode == "INI" ) ); sm2.Add( "J&ava", 110, + ( dMode == "Java" ) ); sm2.Add( "&JavaScript", 111, + ( dMode == "JavaScript" ) ); sm2.Add( "JSP", 112, + ( dMode == "JSP" ) ); sm2.Add( "Per&l", 113, + ( dMode == "Perl" ) ); sm2.Add( "P&erlScript", 114, + ( dMode == "PerlScript" ) ); sm2.Add( "&PHP", 115, + ( dMode == "PHP" ) ); sm2.Add( "P&owerShell", 116, + ( dMode == "PowerShell" ) ); sm2.Add( "P&ython", 117, + ( dMode == "Python" ) ); sm2.Add( "RHT&ML", 118, + ( dMode == "RHTML" ) ); sm2.Add( "&Ruby", 119, + ( dMode == "Ruby" ) ); sm2.Add( "S&QL", 120, + ( dMode == "SQL" ) ); sm2.Add( "TeX", 121, + ( dMode == "TeX" ) ); sm2.Add( "&Text", 122, + ( dMode == "Text" ) ); sm2.Add( "&UWSC", 123, + ( dMode == "UWSC" ) ); sm2.Add( "VB&Script", 124, + ( dMode == "VBScript" ) ); sm2.Add( "&VisualBasic", 125, + ( dMode == "VisualBasic" ) ); sm2.Add( "&Windows Script", 126, + ( dMode == "Windows Script" ) ); sm2.Add( "x86 Assembler", 127, + ( dMode == "x86 Assembler" ) ); sm2.Add( "&XML", 128, + ( dMode == "XML" ) ); // ▲ デフォルトの編集モード ▲ sm2.Add( "", 0, meMenuSeparator ); /* ▼ ココに追加の編集モードを列挙する ▼ */ // 編集モード名は正確に! // ※大文字/小文字、全角/半角の区別、空白やアンダースコア、 // ハイフン、カッコの種類 // ※アクセラレータの「&」または「(&A)」以外は付加しないこと // sm2.Add( "Hoge (&G)", 129 ); // sm2.Add( "Fuga (&F)", 130 ); // sm2.Add( "Piyo", 131 ); // sm2.Add( "&Mery_Macro_JS", 132, ModeCheck( "Mery_Macro_JS" ) ); // sm2.Add( "Mery MS&Y", 133, ModeCheck( "Mery MSY" ) ); // sm2.Add( "&JaneStyle (正規表現用)", 135, ModeCheck( "JaneStyle (正規表現用)" ) ); /* ▲ ココに追加の編集モードを列挙する ▲ */ } sm2.Add( "", 0, meMenuSeparator ); sm2.Add( "キャンセル & ", 0 ); // Esc キーまたは Space キーでキャンセル可 // 「無題」ドキュメントではエンコードメニューを表示しない if ( fullPath ) { // 2068 からの ID は ExecuteCommandByID() の定数 m.Add( "", 0, meMenuSeparator ); m.Add( "", 0, meMenuSeparator ); m.Add( "自動選択 (&A)", 2068 ); m.Add( "", 0, meMenuSeparator ); m.Add( "UTF-1&6LE", 2069, utf16le ); m.Add( "UTF-16&BE", 2070, utf16be ); m.Add( "UTF-&8", 2071, utf8 ); m.Add( "UTF-&7", 2072, ( dEnc == 65000 ) *1 ); m.Add( "", 0, meMenuSeparator ); m.Add( "日本語 (シフト JI&S)", 2083, ( dEnc == 932 ) *1 ); if ( variousLanguageEnable ) { m.Add( "日本語 (&JIS)", 2082, ( dEnc == 50222 ) *1 ); m.Add( "日本語 (&EUC)", 2081, ( dEnc == 51932 ) *1 ); m.Add( "", 0, meMenuSeparator ); m.Add( "西ヨーロッパ言語", 2088, ( dEnc == 1252 ) *1 ); m.Add( "中央ヨーロッパ言語", 2075, ( dEnc == 1250 ) *1 ); m.Add( "キリル言語", 2078, ( dEnc == 1251 ) *1 ); m.Add( "バルト言語", 2074, ( dEnc == 1257 ) *1 ); m.Add( "ギリシャ語", 2079, ( dEnc == 1253 ) *1 ); m.Add( "ヘブライ語", 2080, ( dEnc == 1255 ) *1 ); m.Add( "トルコ語", 2086, ( dEnc == 1254 ) *1 ); m.Add( "アラビア語", 2073, ( dEnc == 1256 ) *1 ); m.Add( "タイ語", 2085, ( dEnc == 874 ) *1 ); m.Add( "ベトナム語", 2087, ( dEnc == 1258 ) *1 ); m.Add( "簡体中国語 (GB2312)", 2076, ( dEnc == 936 ) *1 ); m.Add( "繁体中国語 (Big5)", 2077, ( dEnc == 950 ) *1 ); m.Add( "韓国語", 2084, ( dEnc == 949 ) *1 ); } } // 「無題」ドキュメント用のメインメニュー項目 if ( ! fullPath ) { m.Add( "", 0, meMenuSeparator ); m.Add( mery + ".exe のフルパスをコピー (&E)", 30 ); m.Add( "Mery フォルダのパスをコピー (&D)", 31 ); m.Add( "Mery フォルダを開く (&M)", 11 ); if ( profileDirExist ) { m.Add( "ユーザーフォルダを開く (&U)", 12 ); } if ( autoSaveBackup ) { m.Add( "自動保存フォルダを開く (&A)", 13, autoSaveFlags ); m.Add( "バックアップフォルダを開く (&B)", 14, backupFlags ); } m.Add( "デスクトップフォルダを開く (&H)", 15 ); // 「さいごに閉じたファイル」 if ( numLatestClosed > 0 ) { LatestClosedFileMenu( latestClosedFile, m, 300 ); } m.Add( "", 0, meMenuSeparator ); m.Add( "Mery.txt を開く (&T)", 41 ); m.Add( mery + ".ini を開く (&I)", 42 ); m.Add( "「読み直し」マクロの JS ファイルを開く (&J)", 6 ); m.Add( "オプション (&O) ...", 5 ); } m.Add( "", 0, meMenuSeparator ); m.Add( "キャンセル & ", 0 ); // Esc キーまたは Space キーでキャンセル可 // ポップアップメニューを表示 Status = " 「読みなおし」 マクロ [ " + ( ( new Date() - start ) /1000 ).toFixed( 3 ).replace( /\./, ". " ) +" 秒 ]"; var r = m.Track( menuPosMouse ); switch ( r ) { case 0: break; case 1: // ファイルを閉じて開きなおす d.Close(); ReopenFile( fullPath ); break; // 書き換え禁止フラグ ON/OFF を変更する case 2: // 未保存のとき、変更内容破棄について確認ダイアログが出る( ~ Ver 2.7.4) d.ReadOnly = ! dReadOnly; break; // 読み取り専用属性 ON/OFF を変更して開き直す case 3: // d.Save(); // コメントアウトすると未保存で閉じる前に確認ダイアログ d.Close(); f.Attributes = attributeReadOnly ? attributeReadOnly - 1 : attributeReadOnly + 1; ReopenFile( fullPath ); break; case 4: // ファイルのプロパティを開く var fileName = d.Name; var folderPath = d.Path.replace( /\\+$/g, "" ); var shell = new ActiveXObject( "Shell.Application" ); shell.NameSpace( folderPath ) .ParseName( fileName ) .InvokeVerb( "プロパティ(&R)" ); break; case 5: // オプション... (環境設定) editor.ExecuteCommandByID( MEID_TOOLS_OPTIONS = 2177 ); break; case 6: // このマクロの JS ファイルを開く Status = " " + ScriptFullName; ReopenFile( ScriptFullName ); // OpenJumpJS( "▼ 設定項目 ▼" ); break; // フォルダを開く case 10: case 11: case 12: var path = ( r == 10 ) ? fullPath // 親フォルダ : ( r == 11 ) ? meryPath // Mery フォルダ :/* r == 12 */ iniPath; // ユーザーフォルダ Status = " " + Fso.GetParentFolderName( path ); WshShell.Run( "explorer /select,\"" + path + "\"" ); break; case 13: case 14: case 15: var path = ( r == 13 ) ? autoSaveFolder // 自動保存フォルダ : ( r == 14 ) ? backupFolder // バックアップフォルダ :/* r == 15 */ desktopDir; // デスクトップフォルダ Status = " " + path; WshShell.Run( "\"" + path + "\""); break; // パスをコピー case 30: case 31: case 32: case 33: case 34: var path = ( r == 30 ) ? meryPath // Mery.exe のフルパスをコピー : ( r == 31 ) ? meryDir // Mery フォルダのパスをコピー : ( r == 32 ) ? fullPath // フルパスをコピー : ( r == 33 ) ? d.Name // ファイル名をコピー :/* r == 34 */ d.Path; // 親フォルダのパスをコピー Status = " " + path; ClipboardData.SetData( path ); break; // Mery の設定ファイルを開く case 41: case 42: var path = ( r == 41 ) ? meryDir + "Mery.txt" // Mery.txt を開く :/* r == 42 */ iniPath; // Mery.ini を開く Status = " " + path; ReopenFile( path ); break; case 60: case 61: // デスクトップ/任意のフォルダにコピー confirmStr = "未保存の編集内容はコピーされませんが " + "\nこのままファイルコピーを実行しますか?"; var targetDir = desktopDir; if ( d.Saved || Confirm( confirmStr ) ) { // フォルダを選択 if ( r == 61 ) { targetDir = FolderSelectDilaog(); // フォルダ選択ダイアログ if ( ! targetDir ) { break; } } // FileSystemObject でファイルコピー targetDirName = ( targetDir.toLowerCase() != desktopDir.toLowerCase() ) ? Fso.GetBaseName( targetDir ) + " フォルダ" : "デスクトップ"; Status = " \"" + targetDir + "\" にコピー"; CopyFileTo( fullPath, targetDir, targetDirName ); } break; case 62: // メモ帳で開く var command = "\"notepad.exe\" \"" + fullPath + "\""; Status = " " + command; WshShell.Run( command ); break; case 64: // 新規タブで開く var sx = ScrollX, sy = ScrollY; if ( fullPath || d.Text ) { editor.NewFile(); } var ad = editor.ActiveDocument; ad.Mode = dMode; ad.Encoding = dEnc; if ( meryVer >= 20610 ) { ad.LineEnding = d.LineEnding; } ad.Text = d.Text; ad.Saved = true; ad.selection.SetActivePos( d.selection.GetAnchorPos() ); ad.selection.SetActivePos( d.selection.GetActivePos(), true ); ScrollX = sx; ScrollY = sy; break; case 100: // 現在の編集モードのプロパティ... Status = " \"" + dMode + "\" のプロパティ"; WshShell.SendKeys( "%P" ); editor.ExecuteCommandByID( MEID_VIEW_MODE_CUSTOMIZE = 2144 ); break; case 200: // 編集モードの設定... Status = " 編集モードの設定を行います。"; editor.ExecuteCommandByID( MEID_VIEW_MODE_CUSTOMIZE = 2144 ); break; default: if ( r >= 300 && r < 400 ) { // さいごに閉じたファイル ReopenFile( latestClosedFile[ r - 300 ] ); } else if ( r >= 2068 && r <= 2091 ) { // エンコード指定で読みなおす if ( pasteAfterReload ) { // 貼り付けオプション PasteAfterReload( d, r ); } else { editor.ExecuteCommandByID( r ); } } else if ( r >= 5120 && r < 6144 ) { // 編集モードを変更する editor.ExecuteCommandByID( r ); } else { // 編集モードを変更する( r = 100 番台) var label = m.GetText( r ).replace( /[ ]*\(&.\)[ ]*|&/g , "" ); d.Mode = label; } break; } // プロセスのカレントディレクトリを復旧する WshShell.CurrentDirectory = currentDir; // ---------- ▼ 関数 ▼ ---------- // ※各関数は部分的にメインスコープの変数を参照する /** * 組み込み関数 GetIniOptionRL( meryIniPath, keyArray, viewModeSerch ) * 引数で指定した INI オプション項目の値と * 編集モード一覧を配列で返す */ function GetIniOptionRL( iniPath, keyArray, viewModeSerch ) { // 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 reg, value, iniOption = []; for ( var i = 0, len = keyArray.length; i < len; i ++ ) { reg = new RegExp( "^" + keyArray[i] + "=(.*?)$" , "m" ); if ( reg.test( iniText ) ) { value = reg.exec( iniText )[1]; if ( /^-?[1-9][0-9]*$/.test( value ) ) { value = Number( value ); // 10進数なら Number 型で返す } } else { value = ""; } // エラーがあっても継続 iniOption.push( value ); } // 編集モード名を取得する var modeArray = []; if ( viewModeSerch ) { // \r\n [Modes\Mode##] \r\n Caption=ModeName を抽出 var reg2 = /\r\n\[Modes\\Mode\d+\]\r\nCaption=[^\r\n]+/g; 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]; } } return [ iniOption, modeArray ]; } /** * 関数 LatestClosedFile( meryhisPath, setting, folders ) * ※「読みなおし」マクロ用改造版 * Mery.his を読み込んで「さいごに閉じたファイル」のフルパスの配列を返す * * ※ Mery の「オプション」設定で「カーソル位置とブックマークを保存する」 * が無効(Mery.his がない)なら [] を返す */ function LatestClosedFile( hisPath, setting, folders ) { var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); if ( ! Fso.FileExists( hisPath ) ) { return []; } var num = setting[0] ? setting[0] : 1; var woAutoSaved = setting[1]; var closedFile = ""; var closedFileArray = []; // 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 []; } // 現在タブに開かれていないものを「さいごに閉じたファイル」とする hisArray.reverse(); var hCount = hisArray.length; var eCount = Editors.Count; var docus, dCount, filePath; if ( woAutoSaved ) { var autoSaveDir = folders[0].toLowerCase() + "\\"; var backupDir = folders[1].toLowerCase() + "\\"; var CheckAutoSaveBackup = function( path, autoSaveDir, backupDir ) { return ( path.toLowerCase().indexOf( autoSaveDir ) != -1 || path.toLowerCase().indexOf( backupDir ) != -1 ); }; } outerLoop: for ( var i = 0; i < hCount && closedFileArray.length < num; i ++ ) { closedFile = hisArray[i].slice( 1, -1 ); if ( woAutoSaved && CheckAutoSaveBackup( closedFile, autoSaveDir, backupDir ) ) { continue outerLoop; } for ( var ee = 0; ee < eCount; ee ++ ) { docus = Editors.Item( ee ).Documents; dCount = docus.Count; for ( var dd = 0; dd < dCount; dd ++ ) { filePath = docus.Item( dd ).FullName.toLowerCase(); if ( closedFile.toLowerCase() == filePath ) { continue outerLoop; } } } if ( Fso.FileExists( closedFile ) ) { closedFileArray.push( closedFile ); } } return closedFileArray; } /** * 関数 LatestClosedFileMenu( objArray, objMenu, id ) * 「さいごに閉じたファイル」のメニューを返す */ function LatestClosedFileMenu( objArray, objMenu, id ) { var count = objArray.length; var width = String( count ).length; var label, num; objMenu.Add( "", 0, meMenuSeparator ); objMenu.Add( " ▼ さいごに閉じたファイル " + count + " 件 ▼" , 0, meMenuGrayed ); for ( var i = 0; i < count; i ++ ) { // 「通し番号: 親フォルダ名\ ファイル名」に切りつめる num = ( " " + ( i + 1 ) ).slice( - width ).replace( /\d$/, "&$&: " ); label = objArray[i].replace( /(?:.+\\)*([^\\]+\\)([^\\]+)$/, "$1 $2" ); objMenu.Add( num + label, i + id ); } } /** * 関数 ReopenFile( strPath ) * 「開きなおす」 */ function ReopenFile( strPath ) { // if ( editor.ActiveDocument.FullName // || editor.ActiveDocument.Text ) { // editor.NewFile(); // } // editor.OpenFile( strPath ); var WshShell = new ActiveXObject( "WScript.Shell" ); WshShell.Run( "\"" + editor.FullName + "\" \"" + strPath + "\"" ); } /** * 関数 CopyFileTo( sourcePath, targetDir, targetDirName ) * 「デスクトップにコピー」 */ function CopyFileTo( sourcePath, targetDir, targetDirName ) { targetDir = targetDir.replace( /[\\]*$/, "\\" ); var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); try { // 上書きなしでコピーを実行 Fso.CopyFile( sourcePath, targetDir, false ); } catch( e ) { var fileName = /[^\\]+$/.exec( sourcePath )[0]; if ( e.number == -2146828230 ) { // "既に同名のファイルが存在しています。" var targetPath = targetDir + fileName; var modified = DateTime( Fso.GetFile( targetPath ).DateLastModified ); var msgStr = e.message + " \n\n " + targetPath + " \n " + "更新日時: " + modified + " \n\n上書きしますか? \n\n\n" + "「はい」:上書き、 " + "「いいえ」:フォルダを開く、 " + "「キャンセル」:中止 "; var nSecondsToWait = 0; var strTitle = "Mery: \"" + targetDirName + "にコピー\" - " + "「読みなおし」マクロ"; // ボタン 3:[はい][いいえ][キャンセル]、アイコン 32:[?]、標準ボタン 512:第3ボタン var nType = 3 + 32 + 512; var msgBox = WshShell.Popup( msgStr, nSecondsToWait, strTitle, nType ); if ( msgBox == 6 ) { // 6:[はい] // 上書きありでコピーを実行 try { Fso.CopyFile( sourcePath, targetDir, true ); } catch( e ) { Alert( e ); } // e.g. "書き込みできません。" (-2146828218) } else if ( msgBox == 7 ) { // 7:[いいえ] // 親フォルダを開く WshShell.Run( "explorer /select,\"" + sourcePath + "\"" ); // コピー先フォルダを開く var sourceDir = Fso.GetParentFolderName( sourcePath ).toLowerCase(); var targetDir = targetDir.toLowerCase().replace( /\\+$/, "" ); if ( sourceDir != targetDir ) { var targetPath = targetDir + "\\" + fileName; WshShell.Run( "explorer /select,\"" + targetPath + "\"" ); } } } // 重複以外のエラーのとき else { Alert( e ); } // e.g. "書き込みできません。" (-2146828218) } } /** * 関数 DateTime( date ) * 日時を "YYYY年M月D日、h:mm:ss" で返す */ function DateTime( date ) { var dd = new Date( date ); return dd.getFullYear() + "年" + ( dd.getMonth() + 1 ) + "月" + dd.getDate() +"日、" + dd.toLocaleTimeString(); } /** * 関数 FolderSelectDilaog() * フォルダ選択ダイアログ(手石氏, 2013-02-04) * https://www.haijin-boys.com/wiki/フォルダ選択ダイアログ */ function FolderSelectDilaog() { var sTitle = "フォルダを選択してください"; var iOptions = 0x0040; // 新しいフォルダの作成を許可する。 var vRootDir = 0; var ShellApp = new ActiveXObject( "Shell.Application" ); var folder = ShellApp.BrowseForFolder( 0, sTitle, iOptions, vRootDir ); return ( folder ) ? folder.Self.Path : "" ; } /** * 関数 PasteAfterReload( objDocu, encoding ) * エンコードを変更して読み直しをしたあとに、元のテキストをコピペする * ※ 2019-10-28: 改行形式(要 Mery 2.6.10 以上)と * キャレット位置の復元処理を追加 */ function PasteAfterReload( objDocu, encoding ) { Redraw = false; var d = objDocu, s = d.selection; var txt = d.Text; var pos = s.GetActivePos(); var saved = d.Saved; var eol = ( meryVer >= 20610 ) ? d.LineEnding : 3; d.ReadOnly = false; editor.ExecuteCommandByID( encoding ); d.Text = txt; s.SetActivePos( pos ); if ( eol < 3 ) { d.LineEnding = eol; } d.Saved = true; // 変更行の強調(太字)を解除 d.Saved = saved; // 「未保存*」フラグを読みなおし前の状態に戻す } /** * 関数 OpenJumpJS( str ) * ※「読みなおし」マクロ用改造版 * このマクロを開いて設定項目の行にジャンプする */ function OpenJumpJS( str ) { var targetStr = str || ""; var eCount = editors.Count; var docus, dCount, dd, ee, js; var isOpen = false; outerLoop: for ( var j = 0; j < eCount; j ++ ) { docus = editors.Item( j ).documents; dCount = docus.Count; for ( var i = 0; i < dCount; i ++ ) { dd = docus.Item( i ); if ( dd.FullName == ScriptFullName ) { js = dd; isOpen = true; break outerLoop; } } } Redraw = false; if ( ! isOpen ) { editor.NewFile(); ee = ( editor.EnableTab ) ? editor : editors.Item( eCount ); ee.OpenFile( ScriptFullName, 0 ); js = ee.ActiveDocument; } js.Activate(); if ( targetStr ) { var settingPos = js.Text.indexOf( targetStr ); js.selection.EndOfDocument(); // ScrollY よりも確実性が高い js.selection.SetActivePos( settingPos + targetStr.length ); js.selection.WordRight( true ); } Redraw = true; } </syntaxhighlight>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク