「ポップアップメニューで検索先にジャンプ」の版間の差分
ナビゲーションに移動
検索に移動
ページの作成:「= 概要 = ポップアップメニューで検索にヒットした箇所へジャンプできます。 = 機能 = * 選択した文字列(選択していないと...」 |
sukemaru版を追加 |
||
| 2行目: | 2行目: | ||
ポップアップメニューで検索にヒットした箇所へジャンプできます。 | ポップアップメニューで検索にヒットした箇所へジャンプできます。 | ||
= 機能 = | = 手石 版 = | ||
== 機能 == | |||
* 選択した文字列(選択していないときはカーソルのある語)を検索します。 | * 選択した文字列(選択していないときはカーソルのある語)を検索します。 | ||
* ヒットした行をポップアップメニューに表示し、選択するとその行へジャンプします。 | * ヒットした行をポップアップメニューに表示し、選択するとその行へジャンプします。 | ||
| 8行目: | 9行目: | ||
* 検索文字列の強調解除は、変更していなければ「Alt+F3」です。 | * 検索文字列の強調解除は、変更していなければ「Alt+F3」です。 | ||
= コード = | == コード (手石 版) == | ||
<source lang="javascript"> | <source lang="javascript"> | ||
// pooupJump.js | // pooupJump.js | ||
| 51行目: | 52行目: | ||
</source> | </source> | ||
= 履歴 = | == 履歴 == | ||
* 2014/04/04 初版 | * 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) | |||
2018年11月12日 (月) 21:34時点における版
概要
ポップアップメニューで検索にヒットした箇所へジャンプできます。
手石 版
機能
- 選択した文字列(選択していないときはカーソルのある語)を検索します。
- ヒットした行をポップアップメニューに表示し、選択するとその行へジャンプします。
- 同一行にヒットする箇所が複数あったときは最初のヒット箇所にジャンプします。
- 検索文字列の強調解除は、変更していなければ「Alt+F3」です。
コード (手石 版)
// 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;
};
};
};
履歴
- 2014/04/04 初版
その他
- 不具合があったら教えていただけると幸いです。
sukemaru 版
手石版のソースコードをベースにして、自分好みに少しだけカスタマイズしました。
機能にあげられている部分はそのまま流用・踏襲しています。
変更点
手石版からの変更点
- エディタ設定の「行の表示方法」にあわせられるように、ポップアップメニューに表示する行番号は表示行/論理行を選択できるようにしました。
- 検索文字列がほかの行でヒット場合や、ポップアップメニューからジャンプしなかった(キャンセル)場合に、検索履歴に残さないようにしました。
その場合、マクロ実行前に選択範囲なしだったときは範囲選択(単語選択)を残さないようにしてあります。 - 検索文字列の強調表示を解除できるようにしました。
- 流用した部分のコードをすこしだけ圧縮し、変数名を変更しました。
ダウンロード (sukemaru 版)
ダウンロード: 「ファイル:ジャンプ.zip (アイコン入り)」 (2018/11/12)
- 以下のマクロと、それぞれの専用の「マテリアルデザインっぽいアイコン」を同梱してあります。
「ジャンプ」の下の3点は『小マクロ集』にソースコードを置いてあります。
コード (sukemaru 版)
#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 );
メモ
- Get/SetActivePoint() や GetLines() のオプションパラメータ( mePosView や meGetLineView )を変数にすると機能しなくなるようで条件文 if ( lineUnit ) や ( lineUnit ) ? : をひとつひとつ書かかざるをえず、余計に長くなってしまいました。(2018/11/12 sukemaru)
スポンサーリンク