ファイルへ移動(物理座標ジャンプ)

提供: MeryWiki
ナビゲーションに移動 検索に移動

ショートカット F10 キーの機能「ファイルへ移動」を表示座標ベースっぽく動作するようにマクロ化してみましたが…

  • アウトプットバーの文字列からは表示行ジャンプできない
  • (y,x) の判定基準は本来の「ファイルへ移動」に似せたつもりだけど、不完全かも?( x がないときは行頭にした)
  • 折り返しの多いファイルではうまく機能しない(とくに「指定文字数で折り返し」のとき)
  • C:\Hoge.txt(3)\Hoge.txt(5,5): のように上位階層の「フォルダ名」が「ファイル名」と同じ文字列とカッコつきの数字をふくむ場合、このマクロでは F10 ジャンプのあとの座標補正が正しくできない。


ソースコード
#title = "ファイルへ移動(物理座標)"
#tooltip = "「ファイルへ移動」もどき"
// ショートカット F10 キーの機能「ファイルへ移動」を表示座標ベースにしてみたが…
// ※アウトプットバーの文字列からは表示行ジャンプできない
// ※カッコの中に (y,x) 以外の文字列がある場合は表示行にジャンプしないかも
// ※折り返しの多いファイルではうまく機能しない(とくに「指定文字数で折り返し」のとき)

var d = document, s = d.selection;
var ay = s.GetActivePointY( mePosLogical );
var line = d.GetLine( ay, 0 ).toLowerCase();

/* 「ファイルへ移動」コマンド */
editor.ExecuteCommandByID( MEID_EDIT_GO_TO_FILE = 2108 );

/**
 * ジャンプ元の論理行の文字列から「ファイル名」と「x,y 座標値」の部分を取得する
 * ※「ファイルへ移動」コマンドは作業フォルダからの相対パスでもジャンプできるので
 *   フルパスではなく「ファイル名」だけ
 */
var dd = editor.ActiveDocument, ss = dd.selection;
var docuName = dd.Name.toLowerCase();
var len = docuName.length;
var id1 = line.indexOf( docuName );	// ヒットなしなら -1

if ( id1 >= 0 ) {
/* または if ( dd != d || ss.GetActivePointY( mePosLogical ) != ay ) */ 
  var docuStr = line.substr( id1, len );
  /* 「ファイル名」のうしろの (y,x) をさがす */ 
  var id2 = id1 + len;
  var y, x;
  try {
    y = /\([^\d]*(\d+)/.exec( line.substr( id2 ) )[1];
    x = /\(\d+,(\d+)/.exec( line.substr( id2 ) )[1];
  } catch ( e ) { ; }		// 正規表現がマッチしなくても続行 ))

  	/**
  	 * 文字列に「ファイル名」がない(F10 ジャンプなし)ときはアウトプットなし
  	 *  (y,x) がないときは "undefined" 
  	 */
  	// OutputBar.Writeln( "\n「ファイルへ移動」もどき\n"
  	//                  + "ファイル名:\t" + docuStr + "\n"
  	//                  + "y,x 座標:\t" + y + ", " + x );

  /**
   * アクティブタブが「ファイル名」と一致し
   * かつ「y 座標」が数値として評価できるなら
   * 物理座標にジャンプする( x が省略されているときは行頭 )
   */
  if ( Number( y ) > 0 ) {
    y = Number( y );
    x = Number( x ) || 1;	// undefined → 1
    ss.SetActivePoint( mePosView, x, y );
    ScrollY = y;

  	// OutputBar.Writeln( "表示座標:\t"
  	//                  + ss.GetActivePointY( mePosView ) + ", "
  	//                  + ss.GetActivePointX( mePosView ) + "\n"
  	//                  + "論理座標:\t"
  	//                  + ss.GetActivePointY( mePosLogical ) + ", "
  	//                  + ss.GetActivePointX( mePosLogical ) );
  }
}
スポンサーリンク