「
検索ジャンプの include版
」を編集中
2018年12月17日 (月) 19:37時点における
Sukemaru
(
トーク
|
投稿記録
)
による版
(ソースコードを修正)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
[[ポップアップメニューで検索先にジャンプ#include版のソースコード|>> もとのページ]] ポップアップメニューで検索先にジャンプ(sukemaru 版) == include版 == includeライブラリを使用し、設定内容を外部ファイルに保存します(◆settingEnable 変数で設定。デフォルト: 有効)。 設定内容の読み込み/書き出しが可能になったので、設定の変更はポップアップメニュー内の項目のチェック ON/OFF でできるようになります。 <div class="warningbox"> * あらかじめ [[includeライブラリ]] をインストールしてください。 * 設定内容の保存場所は Mery\Macros\MacroSettings\ジャンプ.json です<br> ※ <ジャンプ> の部分はこのマクロのファイル名)。 </div> * 「▼ 通常版 初期設定項目 ▼」以降の設定項目は『初期値』としてのみ利用され、ソースコード内の設定項目を直接書き換えする必要はありません。<br> ただし、settingEnable 変数をを無効にする場合は、ソースコード内で変更する必要があります。 <br> settingEnable を無効にした場合は「[[#人柱版|人柱版]]」と同じ状態になるので、設定変更はソースコードの直接編集(変数の true/false の変更)でおこなう必要があります。 * はじめての設定変更のさいにエラーが発生する場合は、 # ポップアップメニューの「設定内容を初期化する」を実行して、ファイルを確認してください( → JSON ファイルを新規作成して設定値を書き出します)。 # ポップアップメニューの「JSON ファイルを開く」を実行して、ファイルを確認してください。 # JSON ファイルが正常に作成されない場合は、同梱の「ジャンプ.json」を Mery\Macros\MacroSettings\ フォルダに配置してください。 ▼ 追加オプション ▼ * 検索のさいに「英単語のみ検索」するかしないかを選択できます(◆変数で設定)。 :* ただし、このオプションを有効にして検索できるのは英単語のみです (日本語不可)。<br> 欧文でも ascii 範囲外のアルファベットを使った単語では正常に機能しません。 :* 有効にした場合は正規表現を使用しての検索になるので、処理がやや遅くなります。 [[ポップアップメニューで検索先にジャンプ#include版のソースコード|>> もとのページ]] == ソースコード == 新規追加: 2018/12/17 <source lang="javascript"> #title = "ジャンプ" #tooltip = "ポップアップメニューで検索先にジャンプ" #include "include/IO.js" #include "include/MeryInfo.js" // #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",229 // ※※ メニューに検索ヒットした行が表示されないときは、メニューの「英単語のみ」のチェックをはずしてください ※※ // ※※ メニューから設定の変更ができないときは、メニューの「JSON ファイルを開く」から設定ファイルの実在確認をしてください ※※ /** * ------------------------------------------------------------ * "ポップアップメニューで検索先にジャンプ" * Original Copyright: 手石 (2014/04/04) * ------------------------------------------------------------ * Modified by: sukemaru (2018/11/12 - 2018/12/17) * ------------------------------------------------------------ */ // ◆ include版 ◆ // 「includeライブラリ」を使用 // 設定内容を外部 JSON ファイルに書き出し/読み込み // 設定項目はポップアップメニューから変更可 // 「英単語のみ検索する」に対応 // ◆ 人柱版 ◆ // 「大文字/小文字の区別」に対応(■通常版へ逆移植済み) // 「空行+空白行」の検索に対応 // 「ヒット件数(出現回数)」を表示 // スペースキーでポップアップメニューをキャンセル可 // 「検索履歴に残さない」を追加(■通常版へ逆移植済み) // 「行の表示方法」を Mery.ini から取得 // 「自動マーカー」オプションを廃止(デフォルト: 自動マーカー有効) // 「検索所要時間」の表示(■通常版へ逆移植済み) // 検索ジャンプ後のスクロールの挙動を調整(■通常版へ逆移植済み) // 「変数/関数の定義行」のマーキング var start = new Date(); // 所要時間の計測開始 var setting = {}; // ← ※この "var setting = {}" の行を削除・書き換えしないこと!! // ---------- ▼ include版 追加設定項目 ▼ ---------- // ◆このマクロの「設定を変更するための項目」をポップアップメニューに表示するか? setting.settingEnable = true; // ◆初期値 = true; (表示しない) // ◆英単語のみを検索する? (true; する / false; しない) setting.wholeWordEnable = false; // ◆初期値 = false; (しない) // ---------- ▼ 通常版 初期設定項目 ▼ ---------- // ■行の表示方法 (true; 論理座標 /false; 表示座標) // ※ ◆人柱版◆ の追加設定で autoLineModeEnable が true の場合は無効(自動設定) setting.logical = true; // ■初期値 = true; (論理座標) // ■検索文字列の強調表示を残すか? (true; 残す / false; 残さない) // ※ ◆人柱版◆ の追加設定で historyDisable が true の場合は無効(強調表示しない) setting.highlightEnable = true; // ■初期値 = true; (残す) // ---------- ▼ 人柱版 初期設定項目 ▼ ---------- // ◆人柱版のオプションを有効にすると処理が遅くなります // ◆検索処理の所要時間を表示するか? (true; する / false; しない) setting.timerEnable = true; // ◆初期値 = true; (する) // ◆行の表示方法を Mery.ini から自動で読み込むか? (true; 読み込む /false; 読み込まない) setting.autoLineModeEnable = false; // ◆初期値 = false; (読み込まない) // ◆検索文字列を「検索履歴」に残さない? (true; 残さない / false; 残す) setting.historyDisable = false; // ◆初期値 = true; (残す) // ◆検索文字列の「大文字/小文字」を区別するか? (true; 区別する / false; 区別しない) setting.caseEnable = false; // ◆初期値 = false; (区別しない) // ◆空行/空白行を検索対象にするか? (true; する / false; しない) setting.blankEnable = false; // ◆初期値 = true; (します) // ◆ヒット件数(出現回数)を表示するか? (true; 表示する / false; 表示しない) setting.countEnable = false; // ◆初期値 = true; (表示します) // ---------- ▼ 手石版 初期設定項目 ▼ ---------- // ●ポップアップメニューに表示する文字数 setting.menuWidth = 65; // ---------- ▲ 設定項目 ここまで ▲ ---------- var initialSettings = setting; var json = ScriptName.replace( /\.js$/i , "" ); // ◆ JSON ファイルの初期化 / 実在確認 ◆ // CheckJsonFile(); // JSON ファイルから設定を読み込む if ( setting.settingEnable ) { setting = IO.Deserialize( setting, json ); } /* ポップアップメニューの「行番号の表示方法」 */ if ( setting.autoLineModeEnable ) { var iniText = IO.LoadFromFile( MeryInfo.GetIniPath(), "utf-8" ); $LineColumnView = Number( iniText.match( /^LineColumnView=[01]$/m ).shift().slice( -1 ) ); setting.logical = Math.abs( $LineColumnView - 1 ); } var posMode = setting.logical ? mePosLogical : mePosView; var lineMode = setting.logical ? 0 : meGetLineView; var d = document, s = document.selection; var sx = ScrollX, sy = ScrollY; var ty = s.GetTopPointY( posMode ); var lines = d.GetLines( lineMode ); /* 検索文字列の準備 */ var blank = new RegExp( "^[\t ]*$" , "" ); var re; if ( s.IsEmpty ) { var pos = s.GetActivePos(); s.SelectWord(); } var st = s.Text; // 選択範囲の末尾が改行 "\n" なら検索文字列から除外する if ( ! st || st.charAt( st.length - 1 ) == "\n" ) { st = st.replace( /\n$/g , "" ); var anc = s.GetAnchorPos(); var act = s.GetActivePos(); if ( anc < act && ! ( setting.blankEnable && st.match( blank ) ) ) s.SetActivePos( act - 1, true ); if ( act < anc && ! ( setting.blankEnable && st.match( blank ) ) ) { s.SetAnchorPos( anc - 1 ); s.SetActivePos( act, true ); } if ( setting.blankEnable && st.match( blank ) ) re = true; } else if ( ty == lines && st == d.GetLine( ty, lineMode ) && setting.blankEnable && st.match( blank ) ) re = true; var cancel = 5; // "キャンセル" フラグ if ( ! setting.blankEnable && ! st ) cancel = 1; else if ( st.match( /\n/g ) ) cancel = 2; else { /* ポップアップメニューの準備 */ var m = CreatePopupMenu(), flags; // include 版の設定変更メニュー if ( setting.settingEnable ) SettingsMenu(); // 「文字列」の検索では先頭に「キャンセル」のアイテムを表示 if ( ! re ) { m.Add( " キャンセル & ", 0 ); m.Add( "", 0, meMenuSeparator ); // Hit, Grand total, Variables var mArray = [], hit = 0, t, gt = 0, v = 0, check = ""; if ( setting.countEnable ) var activeLine = d.GetLine( ty, lineMode ); var stQuote = st.replace( /\W/g , "\\$&" ); var reg = new RegExp( stQuote , setting.caseEnable ? "g" : "gi" ); } else { var hArray = [], nArray = [], wArray = []; var h = 0, b = 0, n = 0, w = 0; } /* 文書全体を行単位で分割し、配列に */ for ( var a = [ "" ], i = 1; i <= lines ; i ++ ) a.push( d.GetLine( i, lineMode ) ); /* 検索文字列がヒットした行をポップアップメニューのアイテムとして取得する */ for ( var i = 1, len = a.length; i < len; i ++ ) { flags = ( i == ty ) ? meMenuChecked : 0; // + meMenuGrayed // 「検索文字列」がヒットしたら(「大文字/小文字」「英単語のみ」オプションに対応) if ( ! re && findCaseTF( a[i], st ) >= 0 ) { // 行内でのヒット回数 if ( setting.countEnable ) { t = a[i].match( reg ); gt += t.length; check = Marking(); // 右側につけるマーキング // 変数/関数の定義行はメニューの先頭にも置く if ( check.match( /←/ ) ) { m.Add( Labeling( a[i], i ) + check, i, flags ); v ++; } } // 行頭空白を除去、空白文字を半角スペースに置換、文字数を圧縮 // 「検索文字列がヒットした行」を配列に格納 mArray.push( [ Labeling( a[i], i ) + check, i, flags ] ); hit ++; } // 「空行+空白行」の検索ではサブメニュー用の配列に分別 else if ( re && a[i].match( blank ) ) { b ++; if ( a[i] == st ) { hArray.push( [ Labeling( a[i], i ), i, flags ] ); h ++; } if ( st && ! a[i] ) { nArray.push( [ Labeling( a[i], i ), i, flags ] ); n ++; } else if ( a[i] ) { wArray.push( [ Labeling( a[i], i ), i, flags ] ); w ++; } } } // 配列から「検索文字列がヒットした行」をポップアップメニューに追加する if ( ! re && hit ) { if ( v ) m.Add( "", 0, meMenuSeparator ); for ( var i = 0; i < hit; i ++ ) { if ( v && v == hit ) break; AddCancelLines( m, i ); // 10件ごとにセパレータ、30件ごとに「キャンセル」行 m.Add( mArray[i][0], mArray[i][1], mArray[i][2] ); } } // 配列から「空行+空白行」をポップアップメニューに追加する if ( re && b ) { if ( b != h ) { // ( n + w ) > h m.Add( " すべての空行+空白行: " + SeparateNum( b ) + " 行", 0 ); m.Add( "", 0, meMenuSeparator ); } if ( n && st ) { var sm1 = CreatePopupMenu(); m.AddPopup( " すべての空行: " + SeparateNum( n ) + " 行 (&N)", sm1 ); for ( var i = 0; i < n; i ++ ) { AddCancelLines( sm1, i ); // 30件ごとに「キャンセル」行を追加 sm1.Add( nArray[i][0], nArray[i][1], nArray[i][2] ); } } if ( w && n + h != b ) { var sm2 = CreatePopupMenu(); m.AddPopup( " すべての空白行: " + SeparateNum( w ) + " 行 (&W)", sm2 ); for ( var i = 0; i < w; i ++ ) { AddCancelLines( sm2, i ); // 30件ごとに「キャンセル」行を追加 sm2.Add( wArray[i][0], wArray[i][1], wArray[i][2] ); } } if ( ( n && st ) || ( w && n + h != b ) ) m.Add( "", 0, meMenuSeparator ); // キャンセルを兼ねる(Space キーでキャンセル可) m.Add( " ▼ 一致した行: " + SeparateNum( h ) + " 行 ▼\t& ", 0 ); for ( var i = 0; i < h; i ++ ) { // h == hArray.length AddCancelLines( m, i ); // 30件ごとに「キャンセル」行を追加 m.Add( hArray[i][0], hArray[i][1], hArray[i][2] ); } } /* 検索開始からポップアップメニューを表示するまでの所要時間を取得 */ if ( setting.timerEnable ) var timerStatus = TimerElapsed( new Date(), start ); /* ポップアップメニューを表示するのは、検索ヒット行が複数のとき */ if ( hit > 1 || b > 1 || setting.settingEnable ) { var findStatus = ( ( re ? " 一致した行数: " + SeparateNum( h ) + " 行" + " / すべての空(白)行数: " + SeparateNum( b ) + " 行 / " : /*!re*/ ( gt ? ( " ヒット数: " + SeparateNum( gt ) + " 件 ・ " ) : " ヒットした行数: " ) + SeparateNum( hit ) + " 行 / " ) + "全体の行数: " + SeparateNum( lines ) + ( setting.logical ? " 行 (論理行)" : " 行 (表示行)" ) + ( setting.timerEnable ? timerStatus : "" ) ); // ポップアップメニューを出すまえにステータスバー表示 Status = findStatus; /* カーソル位置にポップアップメニューを表示 */ var y = m.Track( mePosMouse ); // Track( 0 ) ならキャレット位置 /* include 版の設定変更サブメニュー項目を選択した場合 */ if ( y >= 100000 ) { SettingsChange( y ); var isChanged = true; } /* 選択した行番号(行頭)にジャンプして、検索文字列を範囲選択 */ else if ( y ) { s.SetActivePoint( posMode, 1, y ); // 空白行でジャンプしたときは検索履歴に残さない if ( re && d.GetLine( y, lineMode ) ) // 行(空白文字列)全体を範囲選択する(※完全な空行 ^\n では範囲選択しない) s.SetAnchorPoint( posMode, 1, y + 1 ); // 文字列でジャンプしたとき else if ( ! re ) { if ( setting.historyDisable ) { // 検索履歴に残さない ※「検索文字列の強調表示」なし s.SetActivePos( s.GetActivePos() + findCaseTF( d.GetLine( y, lineMode ), st ) ); s.SetAnchorPos( s.GetActivePos() + st.length ); } else { // 検索履歴に残す ※ Mery の検索機能で文字列を範囲選択 s.Find( st, meFindNext ); d.HighlightFind = setting.highlightEnable; // 「検索文字列の強調表示」を解除する/しない } } ScrollY = ( ScrollY == sy ) ? ScrollY : s.GetActivePointY( mePosView ); Quit(); } /* キャンセルした場合 */ else cancel = 3; // ポップアップメニューをキャンセル ( y == 0 ) } else cancel = 4; // ほかの行でヒットなし ( hit == 1 || b == 1 ) } /* ジャンプしなかったときは、キャレット位置/選択範囲を復帰 */ if ( cancel || isChanged ) { if ( pos || pos === 0 ) s.SetActivePos( pos ); else if ( act ) { s.SetAnchorPos( anc ); s.SetActivePos( act, true ); } ScrollX = sx; ScrollY = sy; /* ステータスバーにキャンセルメッセージを表示 */ if ( setting.timerEnable && ! timerStatus ) var timerStatus = TimerElapsed( new Date(), start ); Status = ( ( isChanged || cancel == 3 ) ? findStatus : // ヒット数表示のまま ( ( cancel == 1 ) ? " 検索文字列がありません(空行)。 " : ( cancel == 2 ) ? " 検索文字列に【 改行 】を含めることはできません。 " : ( cancel == 4 ) ? " ヒットなし。 " : /* else */ " 無効な検索文字列。 " // ← 使われないはず ) + "全体の行数: " + SeparateNum( lines ) + ( setting.logical ? " 行 (論理行)" : " 行 (表示行)" ) + ( setting.timerEnable ? timerStatus : "" ) ); } Quit(); // ------------------------------------------------------------ /* 関数 TimerElapsed( end, start ) */ // start からの経過時間を [ s.sss 秒 ] で返す function TimerElapsed( end, start ) { var elapsed = end - start; return " [ " + ( ( elapsed / 1000 ) + "000" ).replace( /(\.)(\d{3})(0*)/, "$1 $2" ) + " 秒 ]"; } /* 関数 FindCaseTF( str, st ) */ // 文字列 str 内で st を検索するさいに「大文字/小文字を区別」する/しない // および 「英単語のみ検索」する/しない オプションにに対応 function FindCaseTF( str, st ) { return setting.wholeWordEnable ? str.search( RegExp( "\\b" + stQuote + "\\b" , setting.caseEnable ? "g" : "gi" ) ) : setting.caseEnable ? str.indexOf( st ) : str.toLowerCase().indexOf( st.toLowerCase() ); } /* 関数 Marking() */ // ポップアップメニューの右側に表示するマーキング function Marking() { var _check = ( // 変数の宣言の行: "var st" ... / "var hoge = piyo , st " ... a[i].match( RegExp( "\\b(?:var |let |const )(?:\\s*|[^\(]+[,]\\s+)[$]?" + stQuote + "(?=\\s*(?:[=,;]|$))" , "" ) ) ? "\t ← v a r" : // 変数の宣言の行: "var hoge = fuga(), " + st ( a[i].match( RegExp( "\\b(?:var |let |const ).*?\\(.*?[,]\\s*[$]?" + stQuote + "(?=\\s*(?:[=,;]|$))" , "" ) ) // 閉じていないカッコがあるかの簡易的なチェック // ※カッコの員数あわせ→)※ && SearchCloseBrc( a[i], stQuote ) ) ? "\t ← v a r" : // 変数に値を代入している行 st + " = fuga" a[i].match( RegExp( "\\b" + stQuote + "(?=\\s*=(?!=))" , "" ) ) ? "\t ← s u b" : // 関数の定義の行 a[i].match( RegExp( "\\bfunction +[$]?" + stQuote + "(?=[\\s(])" , "" ) ) ? "\t ← f n" : // ※カッコの員数あわせ→)※ ( i != ty && a[i] == activeLine ) ? "\t **" : // ①アクティブ行と完全一致する行(重複行) ( t && t.length > 1 ) ? "\t x" + t.length : // ②検索文字列が複数ヒットした行 ( i == ty && a[i] == st ) ? "\t ⏎" : // ③アクティブ行(行検索のとき)✓↵ ( i != ty && a[i] == st ) ? "\t *" : // ④検索文字列と完全一致する行 "" // ⑤検索文字列を含む行 ); return _check; } /* 関数 Labeling( str, num ) */ // ポップアップメニューに表示する文字列の整形 function Labeling( line, i ) { // Labeling( a[i], i ) ※ line = a[i] ヒットした行全体 // 行頭空白を除去、空白文字は全角スペースに置換、文字数を圧縮して取得 // 判別しづらい半角メタ文字を全角に置きかえる var label = line.replace( /^[\t ]+/ , "" ) .replace( /(\t|[ ]{3,}|[ ]{2,})+/g , " › " ) .replace( /[.,:;(){}]/g , function( $0 ) { return String.fromCharCode( $0.charCodeAt( 0 ) + 0xFEE0 ) } ); label = ( ( ! line.length ) ? "( 空行 )" : ( ! label.length ) ? ( line == st ) ? "( 空白行 " + line.length + " 文字 * )" : "( 空白行 " + line.length + " 文字 )" : ( label.length > setting.menuWidth + 1 ) ? label.slice( 0, setting.menuWidth ) + "..." : /* else */ label ); return ( " " + i ).slice( -4 ) + " : " + label; } /* 関数 AddCancelLines( menu, num ) */ // 30行ごとに「キャンセル」行を追加する function AddCancelLines( menu, num ) { // 「文字列の検索」では10件ごとにセパレータを追加 if ( ! re && num > 0 && num % 10 == 0 && num % 30 != 0 ) menu.Add( "", 0, meMenuSeparator ); if ( num % 30 == 0 ) { if ( num != 0 ) menu.Add( "", 0, meMenuSeparator ); if ( num != 0 || menu != m) { menu.Add( " キャンセル", 0 ); menu.Add( "", 0, meMenuSeparator ); } } } /* 関数 SeparateNum( num ) */ // 数値を3ケタ区切りに function SeparateNum( num ) { if ( ! num ) { num = ""; } return num.toString().replace( /(\d)(?=(?:\d{3})+$)/g , "$1," ); } /* 関数 SearchCloseBrc( str, word ) */ // 閉じていないカッコがないかを簡易的にチェックする(閉じていなければ false ) function SearchCloseBrc( str, word ) { var txt = str.substr( str.search( /\b(?:var |let |const )/ ), str.search( RegExp( "\\b" + word + "\\b" , "" ) ) ); var oBrc = txt.match( /\(/g ); // 開きカッコの数 var cBrc = txt.match (/\)/g ); // 閉じカッコの数 return ( ! cBrc || oBrc.length > cBrc.length ) ? 0 : 1; } /* 関数 SettingsMenu() */ // ポップアップメニューに設定変更用のサブメニューを表示する function SettingsMenu() { var subMenu = CreatePopupMenu(); var grayOut1 = setting.autoLineModeEnable ? meMenuGrayed : 0; var logicalFlag = setting.logical ? meMenuChecked : 0; var viewFlag = setting.logical ? 0 : meMenuChecked; var grayOut2 = setting.historyDisable ? meMenuGrayed : 0; var highlightFlag = ( setting.highlightEnable && ! setting.historyDisable ) ? meMenuChecked : 0; var timerFlag = setting.timerEnable ? meMenuChecked : 0; var autoLineModeFlag = setting.autoLineModeEnable ? meMenuChecked : 0; var historyFlag = setting.historyDisable ? meMenuChecked : 0; var caseFlag = setting.caseEnable ? meMenuChecked : 0; var wholeWordFlag = setting.wholeWordEnable ? meMenuChecked : 0; var blankFlag = setting.blankEnable ? meMenuChecked : 0; var countFlag = setting.countEnable ? meMenuChecked : 0; var maxWidthFlag = setting.menuWidth > 100 ? meMenuGrayed : 0; var minWidthFlag = setting.menuWidth < 30 ? meMenuGrayed : 0; m.Add( "", 0, meMenuSeparator ); m.AddPopup( " 設定を変更する (&S)", subMenu ); m.Add( "", 0, meMenuSeparator ); subMenu.Add( "「大文字/小文字」 を区別する (&C)", 100007, caseFlag ); subMenu.Add( "「英単語のみ」 検索する (&W)", 100008, wholeWordFlag ); subMenu.Add( "「空行/空白行」 を検索対象にする (&B)", 100009, blankFlag ); subMenu.Add( "", 0, meMenuSeparator ); subMenu.Add( "「検索履歴」 に残さない (&H)", 100006, historyFlag ); subMenu.Add( "「検索文字列の強調表示」 を残す (&F)", 100003, highlightFlag + grayOut2 ); subMenu.Add( "", 0, meMenuSeparator ); subMenu.Add( "「行の表示方法」 を自動設定する (&A))", 100005, autoLineModeFlag ); subMenu.Add( " 行数を 「論理行」 で表示する (&L)", 100001, logicalFlag + grayOut1 ); subMenu.Add( " 行数を 「表示行」 で表示する (&V)", 100002, viewFlag1 ); subMenu.Add( "", 0, meMenuSeparator ); subMenu.Add( "「検索処理の所要時間」 を表示する (&T)", 100004, timerFlag ); subMenu.Add( "「ヒット件数」(出現総数)を表示する (&G)", 100010, countFlag ); subMenu.Add( "", 0, meMenuSeparator ); subMenu.Add( " メニューの表示幅を 10文字 増やす (&P) \t" + setting.menuWidth + ( setting.menuWidth > 100 ? "" : " → " + ( setting.menuWidth + 10 ) ), 100011, maxWidthFlag ); subMenu.Add( " メニューの表示幅を 10文字 減らす (&M) \t" + setting.menuWidth + ( setting.menuWidth < 30 ? "" : " → " + ( setting.menuWidth - 10 ) ), 100012, minWidthFlag ); subMenu.Add( "", 0, meMenuSeparator ); subMenu.Add( "", 0, meMenuSeparator ); subMenu.Add( " このマクロの JS ファイルを開く (&O)", 100013 ); subMenu.Add( " このマクロの JSON ファイルを開く (&J)", 100014 ); subMenu.Add( "", 0, meMenuSeparator ); subMenu.Add( " 設定内容を初期化する (&I)", 100015 ); } /* 関数 SettingsChange( num ) */ // ポップアップメニューで選択した項目の設定状態を変更する function SettingsChange( num ) { var setting = IO.Deserialize( setting, json ); var isChanged = true; switch ( num ) { case 100001: case 100002: setting.logical = ! setting.logical; break; case 100003: setting.highlightEnable = ! setting.highlightEnable; break; case 100004: setting.timerEnable = ! setting.timerEnable; break; case 100005: setting.autoLineModeEnable = ! setting.autoLineModeEnable; break; case 100006: setting.historyDisable = ! setting.historyDisable; break; case 100007: setting.caseEnable = ! setting.caseEnable; break; case 100008: setting.wholeWordEnable = ! setting.wholeWordEnable; break; case 100009: setting.blankEnable = ! setting.blankEnable; break; case 100010: setting.countEnable = ! setting.countEnable; break; case 100011: setting.menuWidth += 10; break; case 100012: setting.menuWidth -= 10; break; case 100013: isChanged = false; OpenJumpJS(); break; case 100014: isChanged = false; OpenJumpJson(); break; case 100015: isChanged = false; CheckJsonFile(); break; default: isChanged = false; break; } if ( isChanged ) IO.Serialize( setting, json ); } /* 関数 OpenJumpJS() */ // このマクロを開いて設定項目の行にジャンプする function OpenJumpJS() { var docusCount = editor.documents.Count; var isOpen = false, c; for ( var i = 0; i <= docusCount; i ++ ) { if ( ! editor.documents.Item( i ) ) continue; if ( editor.documents.Item( i ).FullName == ScriptFullName ) { isOpen = true; c = i; break; } } if ( isOpen ) editor.documents.Item( c ).Activate(); else { editor.NewFile(); editor.OpenFile( ScriptFullName ); } var js = editor.ActiveDocument.Text.split( "\n" ); var settingsSection = "var setting = {}"; var yy = 21; for ( var i = 1, len = js.length; i < len; i ++ ) { if ( js[i].indexOf( settingsSection ) >= 0 ) { yy = i + 3; break; } } editor.ActiveDocument.selection.SetActivePoint( mePosLogical, 1, yy ) } /* 関数 OpenJumpJson() */ // JSON ファイルを開く function OpenJumpJson() { var jsonPath = IO.Path.Add( MeryInfo.GetMacroFolderPath(), "MacroSettings", json + ".json" ); IO.Serialize( setting, json ); Sleep( 500 ); if ( IO.Path.IsExist( jsonPath ) ) { if ( Confirm( "設定ファイルは正常です\n" + jsonPath + "\n\n" + IO.LoadFromFile( jsonPath ).replace( /^\{|\}$/g , " " ) .replace( /,/g , ",\n " ) + "\n\n設定ファイルを開きますか?" ) ) new ActiveXObject( "WScript.Shell" ).Run( '"' + editor.FullName + '" "' + jsonPath + '"' ); } else Alert( "設定ファイルがありません\n" + IO.Path.Add( MeryInfo.GetMacroFolderPath(), "MacroSettings" ) ); } /* 関数 CheckJsonFile() */ // JSON ファイルの初期化/実在確認 function CheckJsonFile() { if ( Confirm( "設定ファイルを初期化しますか?" ) ) { var jsonPath = IO.Path.Add( MeryInfo.GetMacroFolderPath(), "MacroSettings", json + ".json" ); IO.Serialize( initialSettings, json ); Sleep( 500 ); Alert( IO.Path.IsExist( jsonPath ) ? "設定ファイルは正常です\n" + jsonPath + "\n\n" + IO.LoadFromFile( jsonPath ).replace( /^\{|\}$/g , " " ) .replace( /,/g , ",\n " ) : "設定ファイルがありません\n" + IO.Path.Add( MeryInfo.GetMacroFolderPath(), "MacroSettings" ) ); Quit(); } } </source> == メモ == * 2018/12/16 : 新規アップロード * 2018/12/17 : ソースコードのミスを修正
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク