「
ポップアップメニューで検索先にジャンプ
」を編集中
2018年11月21日 (水) 23:35時点における
Sukemaru
(
トーク
|
投稿記録
)
による版
(
→
sukemaru 版
:
2018/11/21 の更新)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの 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> ※ ポップアップメニューは Esc キーでキャンセルできます。 == 変更点 == 手石版からの変更点 * エディタ設定の「行の表示方法」にあわせられるように、ポップアップメニューに表示する行番号は表示行/論理行を選択できます(ソースコード内の変数で設定)。 * 検索文字列がほかの行でヒットしなかった場合や、ポップアップメニューからジャンプしなかった(キャンセル)場合に、検索履歴に残さないようにしました。 <br> そのさい、マクロの実行前に選択範囲なしだったときは単語選択もキャンセルします。 * 検索文字列の強調表示を解除できます(ソースコード内の変数で設定)。 * ヒットした行数や文書全体の行数をステータスバーに表示します。 * 重複行のチェックをしやすくなるよう、論理行全体を範囲選択しているときは末尾改行を除外するようにしました。 * ポップアップメニューをキャンセルすればムダな検索履歴も残らないので、検索文字列のダメ文字条件をなくしました。 <br> ※ 正規表現を使わずに行単位で検索するので、改行は末尾の "\n" ×1 以外ダメ(空行も不可)。 == ダウンロード (sukemaru 版) == ダウンロード: 「[[ファイル:ジャンプ.zip]] (アイコン入り)」 (2018/11/21) : 以下のマクロと、それぞれの専用の「マテリアルデザインっぽいアイコン」を同梱してあります。 <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/21) * ------------------------------------------------------------ */ // ■行の表示方法 (true; 論理座標 /false; 表示座標) var logical = true; // ■検索文字列の強調表示を残すか? (true; 残す /false; 残さない) var highlightEnable = true; // ■選択範囲なしの状態から実行したときに自動マーカーを表示するか? (true; 表示する / false; 表示しない) // ※ [表示]メニュー >> [マーカー] >> [自動マーカー] が ON でなければ効果なし var markerEnable = true; // ■ポップアップメニューに表示する文字数 var menuWidth = 66; Redraw = markerEnable; var sx = ScrollX, sy = ScrollY; var d = document, s = document.selection; if ( s.IsEmpty ) { // 選択範囲なしならカーソル位置の単語を選択 var p = s.GetActivePos(); s.SelectWord(); } var st = s.Text; // 検索文字列 // 選択範囲の末尾が改行 "\n" なら検索文字列から除外する if ( st.length > 1 && st.charAt( st.length - 1 ) == "\n" ) { st = st.slice( 0, st.length - 1 ); var adjust = true; var anc = s.GetAnchorPos(); var act = s.GetActivePos(); if ( anc < act ) s.SetActivePos( act - 1, true ); if ( act < anc ) s.SetAnchorPos( anc - 1 ), s.SetActivePos( act, true ); } // 選択範囲の先頭と文書全体の行数(論理行/表示行) var ty = ( logical ) ? s.GetTopPointY( mePosLogical ) : s.GetTopPointY( mePosView ); var lines = ( logical ) ? d.GetLines( 0 ) : d.GetLines( meGetLineView ); var cancel = 5; if ( ! st ) cancel = 1; // 検索文字列がない(空行) else if ( st.match( /\n/g ) ) cancel = 2; // 検索条件エラー(改行) // ポップアップメニューでジャンプ先リスト else { // 文書全体を行単位で分割して配列にする if ( logical ) { // 論理行 var a = d.Text.split( "\n" ); a.unshift( "" ); } else { // 表示行 for( var i = 0, a = []; i <= lines ; i ++ ) a.push( d.GetLine( i, meGetLineView ) ); } // 検索文字列がヒットした行をポップアップメニューのアイテムとして取得する var m = CreatePopupMenu(); var h = 0; // ヒットした行数 for( var i = 0; i < a.length; i ++ ) { // a[0] = 空要素、i = 行番号 = y if ( a[i].toLowerCase().indexOf( st.toLowerCase() ) >= 0 ) { // 行頭空白は除去、空白文字は半角スペースに置換、文字数を圧縮して取得 var label = a[i].replace( /^\s+/, "" ).replace( /\t+|[ ]{3,}/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 ) { Status = " ヒットした行数: " + SeparateNum( h ) + " 行" + " / 全体の行数: " + SeparateNum( lines ) + ( logical ? " 行 (論理行)" : " 行 (表示行)" ); var y = m.Track( mePosMouse ); // Track(0) ならキャレット位置にポップアップ if ( y > 0 ) { // 選択した行番号にジャンプして検索文字列を選択 if ( logical ) s.SetActivePoint( mePosLogical, 1, y ); else s.SetActivePoint( mePosView, 1, y ); s.Find( st, meFindNext ); // ジャンプしたら検索履歴に残す d.HighlightFind = highlightEnable; cancel = 0; } else cancel = 3; // ポップアップメニューをキャンセル } else cancel = 4; // ほかの行でヒットなし } // ジャンプしなかったとき if ( cancel ) { if ( p ) s.SetActivePos( p ); else if ( adjust && anc < act ) s.SetActivePos( act, true ); else if ( adjust && act < anc ) s.SetAnchorPos( anc ), s.SetActivePos( act, true ); Status = ( ( cancel == 1 ) ? " 検索文字列がありません(空行)。" : ( cancel == 2 ) ? " 検索文字列に【 改行 】を含めることはできません。" : ( cancel == 3 ) ? " 検索ジャンプをキャンセルしました。 ヒット: " + SeparateNum( h ) + " 行" : ( cancel == 4 ) ? " ほかの行には見つかりませんでした。" : /* cancel == 5 */ " 無効な検索文字列(ダメ文字)。" ) + " / 全体の行数: " + SeparateNum( lines ) + ( logical ? " 行 (論理行)" : " 行 (表示行)" ); ScrollX = sx; ScrollY = sy; } Redraw = true; // 数値を3ケタ区切りにする function SeparateNum( num ) { return num.toString().replace( /(\d)(?=(?:\d{3})+$)/g, "$1," ) } </source> == メモ == * (2018/11/12 sukemaru) : Get/SetActivePoint() や GetLines() のオプションパラメータ( mePosView や meGetLineView )を変数にすると機能しなくなるようで条件文 if ( lineUnit ) や ( lineUnit ) ? : をひとつひとつ書かかざるをえず、余計に長くなってしまいました。 * (2018/11/14 sukemaru) : ・ZIP の「ジャンプ.js」がソースコードのものより古い版だったので差し替えました。 : ・11/12 のソースコードでは表示行だと最終行を取得しなかったので修正しました。 * (2018/11/19 sukemaru) : ヒット数や行数を表示する機能をつけてから、ムダに利用頻度があがった気がします。 * (2018/11/21 sukemaru) : むしろジャンプしないほうが便利な? 検索ポップアップメニューになりました。
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク