「
ポップアップメニューで検索先にジャンプ
」を編集中
2018年11月14日 (水) 05:36時点における
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/14) : 以下のマクロと、それぞれの専用の「マテリアルデザインっぽいアイコン」を同梱してあります。 <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 - 2018/11/14) * ------------------------------------------------------------ */ // ■行の表示方法 (論理座標なら 0; /表示座標なら 1; ) var lineUnit = 0; // ■検索文字列の強調表示を残すか? (残すなら true; /残さないなら false; ) var highlightEnable = true; // ■ポップアップメニューに表示する文字数 var menuWidth = 66; var d = document 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 ) ? d.GetLines( meGetLineView ) : d.GetLines( 0 ); // ポップアップメニューでジャンプ先リスト if ( "\n\t .,;:(){}[]+-=\"\\".indexOf( st ) < 0 && st.length > 0 ) { // 文書全体を行単位で分割 if ( lineUnit ) { var a = []; for( var i = 0; i <= lines ; i ++ ) a.push( d.GetLine( i, meGetLineView ) ); } else { var a = d.Text.split( "\n" ); a.unshift( "" ); } // 検索文字列がヒットした行をポップアップメニューのアイテムとして取得する var m = CreatePopupMenu(); var h = 0; // ヒットした行数 for( var i = 0; i < a.length; i ++ ) { // a[0] = 空要素、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 = 0; d.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> == メモ == * (2018/11/12 sukemaru) : Get/SetActivePoint() や GetLines() のオプションパラメータ( mePosView や meGetLineView )を変数にすると機能しなくなるようで条件文 if ( lineUnit ) や ( lineUnit ) ? : をひとつひとつ書かかざるをえず、余計に長くなってしまいました。 * (2018/11/14 sukemaru) : ・ZIP の「ジャンプ.js」がソースコードのものより古い版だったので差し替えました。 : ・11/12 のソースコードでは表示行だと最終行を取得しなかったので修正しました。
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク