「
ポップアップメニューで検索先にジャンプ
」を編集中
2018年11月12日 (月) 21:34時点における
Sukemaru
(
トーク
|
投稿記録
)
による版
(sukemaru版を追加)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
= 概要 = ポップアップメニューで検索にヒットした箇所へジャンプできます。 = 手石 版 = == 機能 == * 選択した文字列(選択していないときはカーソルのある語)を検索します。 * ヒットした行をポップアップメニューに表示し、選択するとその行へジャンプします。 * 同一行にヒットする箇所が複数あったときは最初のヒット箇所にジャンプします。 * 検索文字列の強調解除は、変更していなければ「Alt+F3」です。 == コード (手石 版) == <source lang="javascript"> // pooupJump.js // 2014/04/04 var sel = document.selection if ( sel.isEmpty ){ sel.SelectWord(); }; var s = sel.Text; var ty = sel.GetTopPointY( mePosView ); var p = sel.GetActivePos(); sel.Find( s, meFindNext + meFindAround ); sel.SetActivePos( p ); // ポップアップメニューでジャンプ先リスト var menu_width = 66; if ( "\t .,;:(){}[]+-=\"\\".indexOf( s ) < 0 && s.length > 0 ){ var menu = CreatePopupMenu(); var ary = []; for( var i = 0, n = document.GetLines( meGetLineView ); i < n ; i++ ){ ary.push( document.GetLine( i+1, meGetLineView )); }; var p = 0; for( var i = 0, n = ary.length; i < n ; i++ ){ if ( ary[i].toLowerCase().indexOf( s.toLowerCase() ) >= 0 ){ var item = ary[i].replace( /^\s*|\t/g, "" ) item = ( item.length > menu_width + 1 )? item.slice( 0, menu_width ) + "..." : item ; var flags = ( (i+1) == ty )? meMenuChecked : 0 ; // meMenuGrayed menu.Add( ( " " + (i + 1) ).slice( -4 ) + " : " + item, i + 1, flags ); p++; }; }; if ( p > 1 ){ // ポップアップメニューを表示するのは、検索ヒット行が複数のとき。 var r = menu.Track( mePosMouse ); // mePosMouse if ( r > 0 ){ var line = document.GetLine( r, meGetLineView ); sel.SetActivePoint( mePosView, line.indexOf( s ) + s.length + 1, r, false ); sel.CharLeft( true, s.length ); ScrollY = r-10; }; }; }; </source> == 履歴 == * 2014/04/04 初版 == その他 == * 不具合があったら教えていただけると幸いです。 = sukemaru 版 = 手石版のソースコードをベースにして、自分好みに少しだけカスタマイズしました。 <br> [[#機能|機能]]にあげられている部分はそのまま流用・踏襲しています。 == 変更点 == 手石版からの変更点 * エディタ設定の「行の表示方法」にあわせられるように、ポップアップメニューに表示する行番号は表示行/論理行を選択できるようにしました。 * 検索文字列がほかの行でヒット場合や、ポップアップメニューからジャンプしなかった(キャンセル)場合に、検索履歴に残さないようにしました。 <br> その場合、マクロ実行前に選択範囲なしだったときは範囲選択(単語選択)を残さないようにしてあります。 * 検索文字列の強調表示を解除できるようにしました。 * 流用した部分のコードをすこしだけ圧縮し、変数名を変更しました。 == ダウンロード (sukemaru 版) == ダウンロード: 「[[ファイル:ジャンプ.zip]] (アイコン入り)」 (2018/11/12) : 以下のマクロと、それぞれの専用の「マテリアルデザインっぽいアイコン」を同梱してあります。 <br> 「ジャンプ」の下の3点は[[マテリアルデザインっぽいアイコンと『小マクロ集』#メニュー項目をアイコン化する小マクロ|『小マクロ集』]]にソースコードを置いてあります。 :* ジャンプ(ポップアップメニューで検索先にジャンプ) :* [[マテリアルデザインっぽいアイコンと『小マクロ集』#次の文字列を検索|次の文字列を検索]] (強調なし) :* [[マテリアルデザインっぽいアイコンと『小マクロ集』#前の文字列を検索|前の文字列を検索]] (強調なし) :* [[マテリアルデザインっぽいアイコンと『小マクロ集』#検索文字列の強調を解除|検索強調を解除]] == コード (sukemaru 版) == <source lang="javascript"> #title = "ジャンプ" #tooltip = "ポップアップメニューで検索先にジャンプ" // #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",229 /** * ------------------------------------------------------------ * "ポップアップメニューで検索先にジャンプ" * pooupJump.js * Original Copyright: 手石 (2014/04/04) * ------------------------------------------------------------ * Modified by: sukemaru (2018/11/12) * ------------------------------------------------------------ */ // 行の表示方法 (論理座標なら 0; /表示座標なら 1; ) var lineUnit = 0; // 検索文字列の強調表示を残すか? (残すなら true /残さないなら false ) var highlightEnable = true; // ポップアップメニューに表示する文字数 var menuWidth = 66; var s = document.selection if ( s.IsEmpty ) { // 選択範囲なしならキャレット位置の単語を選択 var p = s.GetActivePos(); s.SelectWord(); } var st = s.Text; // 検索ワード var ty = ( lineUnit ) ? s.GetTopPointY( mePosView ) : s.GetTopPointY( mePosLogical ); var lines = ( lineUnit ) ? document.GetLines( meGetLineView ) : document.GetLines( 0 ); // ポップアップメニューでジャンプ先リスト if ( "\n\t \\.,;:(){}[]+-=\"".indexOf( st ) < 0 && st.length > 0 ) { // 文書全体を行単位で分割 if ( lineUnit ) { var a = []; for( var i = 0; i < lines ; i ++ ) a.push( document.GetLine( i, meGetLineView ) ); } else { var a = document.Text.split( "\n" ); a.unshift( "" ); // i = 論理行番号 になるように空要素を追加 } // 検索文字列がヒットした行をポップアップメニューのアイテムとして取得する var m = CreatePopupMenu(); var h = 0; // ヒットした行数 for( var i = 1; i < a.length; i ++ ) { if ( a[i].toLowerCase().indexOf( st.toLowerCase() ) >= 0 ) { var label = a[i].replace( /^\s+/, "" ).replace( /\s+/g, " " ); label = ( label.length > menuWidth + 1 ) ? label.slice( 0, menuWidth ) + "..." : label ; var flags = ( i == ty ) ? meMenuChecked : 0 ; // meMenuGrayed m.Add( ( " " + i ).slice( -4 ) + " : " + label, i, flags ); h ++; } } // ポップアップメニューを表示するのは、検索ヒット行が複数のとき if ( h > 1 ) { var y = m.Track( mePosMouse ); // Track( 0 ) ならキャレット位置にポップアップ // 選択したアイテムの行番号にジャンプして検索文字列を選択 if ( y > 0 ) { if ( lineUnit ) s.SetActivePoint( mePosView, 1, y ); else s.SetActivePoint( mePosLogical, 1, y ); s.Find( st, meFindNext ); p = ""; document.HighlightFind = highlightEnable; // 検索文字列の強調を解除 } } // ほかの行でヒットしなかったとき else Status = "ほかの行に " + st + " は見つかりませんでした ( " + lines.toLocaleString().replace( /\.00$/, "" ) + " 行 )"; } var pos = ( lineUnit ) ? s.GetActivePointY( mePosView ) : s.GetActivePointY( mePosLogical ); if ( p && pos == ty ) s.SetActivePos( p ); </source> == メモ == * Get/SetActivePoint() や GetLines() のオプションパラメータ( mePosView や meGetLineView )を変数にすると機能しなくなるようで条件文 if ( lineUnit ) や ( lineUnit ) ? : をひとつひとつ書かかざるをえず、余計に長くなってしまいました。(2018/11/12 sukemaru)
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク