|
|
| (2人の利用者による、間の19版が非表示) |
| 1行目: |
1行目: |
| | == 概要 == |
| ポップアップメニューでジャンプ先を選択。範囲指定中はジャンプ先まで選択範囲を拡大します。 | | ポップアップメニューでジャンプ先を選択。範囲指定中はジャンプ先まで選択範囲を拡大します。 |
|
| |
| = goat版 =
| |
|
| |
| Mery Ver.1.1.2.2840 および Ver.2.0.9.3936 での動作を確認しています。
| |
| (2012.09.24)
| |
|
| |
| <source lang="javascript">
| |
| #title="ブックマーク一覧"
| |
| /*
| |
| * ブックマーク一覧をポップアップメニューにして選択ジャンプ
| |
| * Mery標準のブックマークが対象
| |
| * 範囲選択中の場合は選択範囲を拡大
| |
| */
| |
| (function(){
| |
| // 描画停止
| |
| Redraw = false;
| |
| with(document.selection){
| |
| var flgBlock = !isEmpty;
| |
| //カーソル位置の保存
| |
| var activePos = GetActivePos();
| |
| var anchorPos = GetAnchorPos();
| |
| var sX = ScrollX;
| |
| var sY = ScrollY;
| |
|
| |
| var bookmarks = new Array();
| |
| StartOfDocument(false);
| |
| // 先頭行がブックマークされてないか
| |
| var isTopMarked = false;
| |
| CharRight(false);
| |
| if(PreviousBookmark()){
| |
| isTopMarked = true;
| |
| SelectLine();
| |
| menuKey = Text.slice(0,24).replace(/\t/g, "\\t");
| |
| Collapse();
| |
| bookmarks.push("Line " + GetActivePointY(mePosLogical) + ":\t" + menuKey);
| |
| } else {
| |
| StartOfDocument(false);
| |
| }
| |
| while(NextBookmark()){
| |
| SelectLine();
| |
| menuKey = Text.slice(0, 24).replace(/\t/g, "\\t");
| |
| Collapse();
| |
| bookmarks.push("Line " + GetActivePointY(mePosLogical) + ":\t" + menuKey);
| |
| }
| |
| var bmcount = bookmarks.length;
| |
| if(bmcount == 0){
| |
| //カーソル位置の復帰
| |
| SetActivePos(activePos);
| |
| SetAnchorPos(anchorPos);
| |
| ScrollX = sX;
| |
| ScrollY = sY;
| |
| } else {
| |
| var BookmarkMenu = CreatePopupMenu();
| |
| for(var i = 0; i < bmcount; i++){
| |
| //メニューのアクセスキーも1から始まるほうが便利
| |
| BookmarkMenu.Add("&" + (i+1) + " " + bookmarks[i], i+1)
| |
| }
| |
| var ret = BookmarkMenu.Track(0);
| |
| if(ret == 0){
| |
| //カーソル位置の復帰
| |
| SetActivePos(activePos);
| |
| SetAnchorPos(anchorPos);
| |
| ScrollX = sX;
| |
| ScrollY = sY;
| |
| } else {
| |
| StartOfDocument(false);
| |
| if(isTopMarked)ret--;
| |
| for(i = 0; i < ret; i++){ NextBookmark(); }
| |
| }
| |
| }
| |
| if(flgBlock){
| |
| //ジャンプ前の選択開始位置からジャンプ後のカーソル位置まで範囲選択
| |
| SetAnchorPos(anchorPos);
| |
| }
| |
| }
| |
| // 描画再開
| |
| Redraw = true;
| |
| })()
| |
| </source>
| |
|
| |
|
| |
| = sukemaru版 =
| |
|
| |
| goat さんのソースコードを元にして、ポップアップメニューを表示するまでの速度をすこしだけ改善しました。
| |
|
| |
|
| |
| ■ goat 版からの変更点
| |
| * ソースコード内の設定項目から "表示行" / "論理行" の選択可(初期値は "論理行")
| |
| * 設定項目で "ジャンプ先までの範囲選択" はしない状態を初期値にした
| |
| * ブックマーク行の文字列取得 ~ メニューに表示するラベルの生成 の速度を改善
| |
| * ポップアップメニューの体裁を変更(「[[ポップアップメニューで検索先にジャンプ#sukemaru_版|検索ジャンプ]]」マクロにあわせた)
| |
| * ステータスバーにブックマーク件数などの情報を表示
| |
|
| |
|
| == ソースコード == | | == ソースコード == |
| | <syntaxhighlight lang="javascript" copy> |
| | #title="ブックマーク一覧" |
| | /* |
| | * ブックマーク一覧をポップアップメニューにして選択ジャンプ |
| | * Mery標準のブックマークが対象 |
| | * 範囲選択中の場合は選択範囲を拡大 |
| | */ |
| | (function(){ |
| | // 描画停止 |
| | Redraw = false; |
| | var sel = document.selection; |
| | var flgBlock = !sel.IsEmpty; |
| | //カーソル位置の保存 |
| | var activePos = sel.GetActivePos(); |
| | var anchorPos = sel.GetAnchorPos(); |
| | var sX = ScrollX; |
| | var sY = ScrollY; |
|
| |
|
| '''ダウンロード:''' 「[[ファイル:ブックマーク一覧ジャンプ.zip]]」(アイコン入り)
| | var bookmarks = []; |
| <br> 投稿日: 2019/03/29(2019/04/07 Quit メソッドを削除)
| | var menuKey = ""; |
| | | // 先頭行がブックマークされてないか |
| * このマクロではポップアップメニューの表示に EN SPACE「 」(U+2002) を使用します。ファイルに保存するさいは、文字コードを Shift JIS にしないでください('''UTF-8''' などの Unicode )。
| | var isTopMarked = false; |
| <source lang="javascript" style="height:60em; overflow:auto;">
| | sel.SetActivePoint(mePosLogical, 1, 2); |
| #title = "ブックマーク一覧ジャンプ"
| | if(sel.PreviousBookmark()){ |
| #tooltip = "ポップアップメニューでブックマーク行にジャンプ"
| | isTopMarked = true; |
| // #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",243 | | sel.SelectLine(); |
| // または 244
| | menuKey = sel.Text.slice(0,24).replace(/\t/g, "\\t"); |
| | | sel.Collapse(); |
| /**
| | bookmarks.push("Line " + sel.GetActivePointY(mePosLogical) + ":\t" + menuKey); |
| * ---------------------------------------------------------
| | } else { |
| * 「ブックマーク一覧ジャンプ」
| | sel.StartOfDocument(false); |
| * Orginal created by: goat (Last update: 2012/09/24)
| | } |
| * Modified by: sukemaru (2018/08/08 - 2019/03/29)
| | while(sel.NextBookmark()){ |
| * ---------------------------------------------------------
| | sel.SelectLine(); |
| */
| | menuKey = sel.Text.slice(0, 24).replace(/\t/g, "\\t"); |
| | | sel.Collapse(); |
| var start = new Date(); // 所要時間計測(開始)
| | bookmarks.push("Line " + sel.GetActivePointY(mePosLogical) + ":\t" + menuKey); |
| | | } |
| | | var bmcount = bookmarks.length; |
| // ---------- ▼ 設定項目 ▼ ----------
| | if(bmcount == 0){ |
| | | //カーソル位置の復帰 |
| // ■ ジャンプする前に選択範囲があったときはジャンプ先の行まで範囲選択する?
| | sel.SetActivePos(activePos); |
| var flgBlockEnable = false; // (true; 範囲選択する/false; 範囲選択しない) | | sel.SetAnchorPos(anchorPos); |
| | | ScrollX = sX; |
| // ■ 行の表示方法を Mery.ini から「自動」で読み込むか?
| | ScrollY = sY; |
| var autoLineModeEnable = false; // (true; 読み込む /false; 読み込まない)
| | } else { |
| | | var BookmarkMenu = CreatePopupMenu(); |
| // ■ 行の表示方法(手動設定)
| | for(var i = 0; i < bmcount; i++){ |
| var $LineColumnView = 0; // ( 0: 論理行 / 1: 表示行 )
| | //メニューのアクセスキーも1から始まるほうが便利 |
| | | BookmarkMenu.Add("&" + (i+1) + " " + bookmarks[i], i+1); |
| // ---------- ▲ 設定項目 ▲ ----------
| | } |
| | | var ret = BookmarkMenu.Track(0); |
| | | if(ret == 0){ |
| // Mery.ini から「行の表示方法」を取得する( 表示行 = 1 / 論理行 = 0 )
| | //カーソル位置の復帰 |
| if ( autoLineModeEnable ) {
| | sel.SetActivePos(activePos); |
| $LineColumnView = GetIniOptionNum( "LineColumnView" );
| | sel.SetAnchorPos(anchorPos); |
| }
| | ScrollX = sX; |
| // 表示行/論理行 の定数
| | ScrollY = sY; |
| var posMode = $LineColumnView ? mePosView : mePosLogical;
| | } else { |
| var lineMode = $LineColumnView ? meGetLineView : 0;
| | sel.StartOfDocument(false); |
| | | if(isTopMarked){ |
| | | ret--; |
| var d = document, s = document.selection;
| | } |
| var lines = d.GetLines( lineMode ).toString();
| | for(i = 0; i < ret; i++){ |
| var linesWidth = lines.length;
| | sel.NextBookmark(); |
| | | } |
| var ay = s.GetActivePointY( posMode );
| | } |
| var regY = new RegExp( "&" + ay + ": ", "" );
| | } |
| var lineStr = "";
| | if(flgBlock){ |
| var bmArray = new Array();
| | //ジャンプ前の選択開始位置からジャンプ後のカーソル位置まで範囲選択 |
| var flgBlock = ! s.isEmpty;
| | sel.SetAnchorPos(anchorPos); |
| var isTopMarked = false;
| | } |
| | | // 描画再開 |
| //カーソル位置の保存
| | Redraw = true; |
| var act = s.GetActivePos();
| | })(); |
| var anc = s.GetAnchorPos();
| | </syntaxhighlight> |
| var sx = ScrollX, sy = ScrollY;
| |
| | |
| Redraw = false;
| |
| | |
| // 先頭行がブックマークされてないか | |
| s.SetActivePos( 1 );
| |
| if ( s.PreviousBookmark() ) {
| |
| isTopMarked = true;
| |
| // ブックマーク行の文字列を取得する
| |
| lineStr = d.GetLine( s.GetActivePointY( posMode ), lineMode );
| |
| // 関数でメニュー用ラベルを生成して配列に収容する
| |
| bmArray.push( MenuKey( lineStr, s.GetActivePointY( posMode ) ) );
| |
| } | |
| else { | |
| s.StartOfDocument();
| |
| } | |
| | |
| // 2行目以降のブックマークを探す
| |
| while ( s.NextBookmark() ) { | |
| // ブックマーク行の文字列を取得する
| |
| lineStr = d.GetLine( s.GetActivePointY( posMode ), lineMode );
| |
| // 関数でメニュー用ラベルを生成して配列に収容する
| |
| bmArray.push( MenuKey( lineStr, s.GetActivePointY( posMode ) ) );
| |
| } | |
| | |
| // ブックマークの件数
| |
| var bmCount = bmArray.length; | |
| | |
| // ブックマークがなければカーソル位置を復帰して終了
| |
| if ( ! bmCount ) { | |
| s.SetActivePos( act );
| |
| s.SetAnchorPos( anc );
| |
| ScrollX = sx, ScrollY = sy;
| |
| | |
| // ステータスバーにキャンセルメッセージ
| |
| Status = " ブックマークがありません。/ 全体の行数: "
| |
| + lines.replace( /(\d)(?=(?:\d{3})+$)/g , "$1," )
| |
| + ( $LineColumnView ? " 行 (表示行)" : " 行 (論理行)" )
| |
| + TimerElapsed( new Date(), start );
| |
| } | |
| | |
| // ブックマークがあればポップアップメニューを表示
| |
| else { | |
| var BookmarkMenu = CreatePopupMenu();
| |
| // メニューの上部に「キャンセル」行をピン止め
| |
| BookmarkMenu.Add( ( " " ).slice( - linesWidth - 1 ) + " キャンセル& ", 0 );
| |
| | |
| for ( var i = 0, flags; i < bmCount; i ++ ) {
| |
| // 10行ごとにセパレータ
| |
| if ( i % 10 == 0 ) {
| |
| BookmarkMenu.Add( "", 0, meMenuSeparator );
| |
| }
| |
| // アクティブ行にはチェックマークフラグ
| |
| flags = regY.test( bmArray[i] ) ? meMenuChecked : 0;
| |
| | |
| BookmarkMenu.Add( bmArray[i], i + 1, flags )
| |
| }
| |
| | |
| // ステータスバーにヒット件数を表示
| |
| Status = " " + bmCount
| |
| + " 件 / 全体の行数: "
| |
| + lines.replace( /(\d)(?=(?:\d{3})+$)/g , "$1," )
| |
| + ( $LineColumnView ? " 行 (表示行)" : " 行 (論理行)" )
| |
| + TimerElapsed( new Date(), start );
| |
| | |
| // ポップアップメニューを表示
| |
| // Track(0);ならキャレット位置にサブメニューがポップアップ
| |
| // Track(1);ならカーソル位置にサブメニューがポップアップ
| |
| var r = BookmarkMenu.Track( 1 );
| |
| | |
| // キャンセル → カーソル位置の復帰
| |
| if ( r == 0 ) {
| |
| s.SetActivePos( act );
| |
| s.SetAnchorPos( anc );
| |
| ScrollX = sx, ScrollY = sy;
| |
| }
| |
| | |
| // ジャンプ
| |
| else {
| |
| s.StartOfDocument();
| |
| if( isTopMarked ) {
| |
| r --;
| |
| }
| |
| for( i = 0; i < r; i ++ ) {
| |
| s.NextBookmark();
| |
| }
| |
| // ジャンプ前の選択開始位置からジャンプ後のカーソル位置まで範囲選択
| |
| if ( flgBlockEnable && flgBlock ) {
| |
| s.SetAnchorPos( anc );
| |
| if ( ay < s.GetActivePointY( posMode ) ) {
| |
| s.EndOfLine( true, mePosLogical );
| |
| }
| |
| }
| |
| ScrollY = s.GetActivePointY( mePosView );
| |
| }
| |
| }
| |
| | |
| Redraw = true;
| |
| | |
| | |
| // ---------------------------------------------------------
| |
| | |
| /* 関数 MenuKey( str, num ) */
| |
| // ポップアップメニューに表示するラベルを生成する
| |
| function MenuKey( str, num ) {
| |
| // 行頭空白を除去/空白文字を圧縮/削られてしまう "&" を補完/判別しづらいメタ文字を全角に
| |
| var menuKey = str.replace( /^[\t ]+/ , "" )
| |
| .replace( /(?:\t|[ ]{3,}|[ ]{2,})+/g , " › " )
| |
| .replace( /&/g , "&&" )
| |
| .replace( /[.,:;(){}|!%']/g ,
| |
| function( $0 ) {
| |
| return String.fromCharCode( $0.charCodeAt( 0 ) + 0xFEE0 )
| |
| } )
| |
| .slice( 0, 50 ); // 文字数を圧縮
| |
| | |
| return ( " \&" + num ).slice( - linesWidth - 1 ) + ": " + menuKey;
| |
| }
| |
| | |
| | |
| /* 関数 TimerElapsed( end, start ) */
| |
| // start からの経過時間を [ s.sss 秒 ] で返す
| |
| function TimerElapsed( end, start ) {
| |
| var elapsed = end - start;
| |
| return " [ "
| |
| + ( ( elapsed / 1000 ) + "000" ).replace( /(\.)(\d{3})(0*)/, "$1 $2" )
| |
| + " 秒 ]";
| |
| }
| |
| | |
| | |
| /* 関数 GetIniOptionNum( key ) */
| |
| // 引数で指定された設定項目の「値」を返す(※数値1ケタ)
| |
| function GetIniOptionNum( key ) {
| |
| var regIniKey = new RegExp( "^" + key + "=\\d$", "m" );
| |
| var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
| |
| // Mery.ini を探す
| |
| var iniPath = editor.FullName.replace( /\.exe$/i , ".ini" );
| |
| if ( ! Fso.FileExists( iniPath ) ) {
| |
| var WshShell = new ActiveXObject( "WScript.Shell" );
| |
| iniPath = WshShell.ExpandEnvironmentStrings( "%APPDATA%\\Mery\\Mery.ini" );
| |
| }
| |
| // Mery.ini を読み込む
| |
| var iniFile = Fso.OpenTextFile( iniPath, 1 );
| |
| var iniText = iniFile.ReadAll();
| |
| // 項目の値を取得する
| |
| var dist = + iniText.match( regIniKey ).shift().slice( - 1 );
| |
| iniFile.Close();
| |
| | |
| return dist;
| |
| } | |
| </source>
| |
| | |
| | |
| == バックスラッシュ化 ==
| |
| | |
| Mery でプログラミング用のフォントを使っている人だと、ポップアップメニュー内で半角 '''¥''' 記号 (U+005C) が'''バックスラッシュ''' (U+005C) にならないのは気落ち悪いかも? ということで。
| |
| | |
| : MenuKey() 関数の replace() 重ねがけ部分に以下のようなコードをはさむと "擬似的に" '''バックスラッシュ'''化できます。 <br> ※「∖」(U+2216) に置換して表示します。
| |
| | |
| <source lang="javascript">
| |
| // ※追加コードを replace() の重ねがけ部分に挟みこむ | |
| | |
| /* 関数 MenuKey( str, num ) */
| |
| // ポップアップメニューに表示するラベルを生成する
| |
| function MenuKey( str, num ) {
| |
| | |
| var menuKey = str.replace( /^[\t ]+/ , "" )
| |
| .replace( /(?:\t|[ ]{3,}|[ ]{2,})+/g , " › " )
| |
| .replace( /&/g , "&&" )
| |
| | |
| // ※追加コード ここから ----------
| |
| // 半角の「¥」を「∖」(U+2216) に置換
| |
| // ※または ╲(U+2572), ﹨(U+FE68)
| |
| .replace( /[\\]/g , "∖" )
| |
| | |
| // 見づらいようなら前後に空白を追加
| |
| // .replace( /([^∖:])([∖]+)([^∖])?/g , "$1 $2 $3" )
| |
| // ※追加コード ここまで ----------
| |
| | |
| .replace( /[.,:;(){}|!%']/g ,
| |
| function( $0 ) {
| |
| return String.fromCharCode( $0.charCodeAt( 0 ) + 0xFEE0 )
| |
| } )
| |
| .slice( 0, 50 );
| |
| | |
| return ( " \&" + num ).slice( - linesWidth - 1 ) + ": " + menuKey;
| |
| }
| |
| </source> | |