「行頭か行末 または 選択範囲の始点か終点」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
細編集の要約なし
Sukemaru (トーク | 投稿記録)
更新
1行目: 1行目:
__toc__
== ダウンロード ==
「[[ファイル:行頭か行末 または 選択範囲の始点か終点.zip]]」
* 通常版
* GetKeyState.exe による機能拡張版
* マテリアルデザインっぽいアイコン
== 通常版 ==


ショートカットキーやツールバーアイコンを削減するために、自分がよく使う機能をひとまとめにしてみました
ショートカットキーやツールバーアイコンを削減するために、自分がよく使う機能をひとまとめにしてみました
<br>(ショートカットの割りあては「End」キーひとつで済み、ツールバーアイコンやマウスボタンへの割りあてもこれひとつで)。
<br>(ショートカットの割りあては <kbd>Home</kbd> または <kbd>End</kbd> キーひとつで済み、ツールバーアイコンやマウスボタンへの割りあてもこれひとつで)。


* 行頭/行末のトグル移動のパターンは '''2in1''' モードと '''4in1''' モードを選択可
* 行頭/行末のトグル移動のパターンは '''2in1''' モードと '''4in1''' モードを選択可




<source lang="javascript">
<source lang="javascript" style="height:80em; overflow:auto;">
#title = "行頭か行末 または 選択範囲の始点か終点"
#title = "行頭か行末 または 選択範囲の始点か終点"
#tooltip = "行の先頭か末尾 または 選択範囲の始点か終点 にカーソルを移動する"
#tooltip = "行の先頭か末尾 または 選択範囲の始点か終点 にカーソルを移動する"
// #icon = "invert_caret_pos[2].ico"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",129
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",129


/**
/**
  * つぎのとおりにカーソルの位置を移動します(実行するごとにトグル移動)
  * ---------------------------------------------------------
  *  
  * 「行頭か行末 または 選択範囲の始点か終点」マクロ
  * 選択範囲がない場合
  * sukemaru, 2018/07/20 - 2020/06/26
  *
  * ---------------------------------------------------------
  * 2in1モードの場合: ① ⇔ ② のトグル移動
  * (2020/06/26: マルチカーソル対応)
*  ① 論理行の先頭
*  ③ 論理行の末尾
*
* 4in1モードの場合: ① → ② → ③ → ④ → ① ... のトグル移動
*  ① 行頭
*  ② 行頭の空白文字のうしろの位置(空白文字以外の "文字列" の開始位置)
*  ③ 行末の空白文字のまえの位置(空白文字以外の "文字列" の終了位置)
*  ④ 行末
*  ※ 行頭空白・行末空白のない行では ②・③ をスキップする
*
*
* 選択範囲がある場合
*
*  選択範囲の開始位置と終了位置を入れ替え
*  ※ 開始位置:キャレットのない側
*  ※ 終了位置:キャレットのある側
  */
  */


// ■トグルパターン設定: 2in1モード or 4in1モード
// ---------- ▼ 設定項目 ▼ ---------- //
 
// ■ トグルパターン設定: 2in1モード or 4in1モード
var toggleMode2 = false;
var toggleMode2 = false;
// true のとき 2in1トグルモード(行頭 ⇔ 行末)
// false のとき 4in1トグルモード(行頭 → 行頭空白の後ろ → 行末空白の前 → 行末)


// true のとき  ⇒ 2in1トグルモード(行頭 ⇔ 行末)
// false のとき ⇒ 4in1トグルモード(行頭 → 行頭空白の後ろ → 行末空白の前 → 行末)
// ---------- ▲ 設定項目 ▲ ---------- //


var d = document, s = document.selection;


if ( s.Text ) {
editor.ExecuteCommandByID( 2189 ); // アクティブなペイン
  // 「選択範囲の始点終点を交替」マクロ
var sx = ScrollX,  sy = ScrollY;
  var act = s.GetActivePos();
var s = editor.ActiveDocument.selection;
  var anc = s.GetAnchorPos();
var st = s.Text;
  var tp = ( anc < act ) ? anc : act; // 選択範囲の先頭位置
  var bp = ( anc < act ) ? act : anc; // 選択範囲の末尾位置


  s.SetActivePos( act );
// マルチカーソル対応
   s.SetActivePos( anc, true );
var arg = [ toggleMode2 ];
// 選択範囲が1つで矩形選択ではないとき
if ( ! s.Mode || s.Mode === 1 ) {
  TopEndOfLine( arg );
}
// 矩形選択または複数選択のとき
else {
   BeginUndoGroup();
  AddUndo();
  MultiFunction( TopEndOfLine, arg );
  EndUndoGroup();
}
}


// ScrollX = sx;
ScrollY = sy;
/**
* TopEndOfLine( toggleMode2 )
* 「行頭か行末 または 選択範囲の始点か終点」
*/
function TopEndOfLine( arg ) {
  var toggleMode2 = arg[0];
  var d = editor.ActiveDocument;
  var s = editor.ActiveDocument.selection;
  var act = s.GetActivePos();
  // 選択範囲あり
  if ( s.Text ) {
    var anc = s.GetAnchorPos();
    // 「選択範囲の始点終点を交替」
    s.SetAnchorPos( act );
    s.SetActivePos( anc, true );
  }


// 2in1 トグルモード
  // 2in1 トグルモード 「行頭か行末」
else if ( toggleMode2 ) {
  else if ( toggleMode2 ) {
  // 「行頭か行末」マクロ
    if ( s.GetActivePointX( mePosLogical ) != 1 ) {
  if ( s.GetActivePointX( mePosLogical ) == 1 ) {
      // ➀ 行頭に移動
     // ②キャレット位置が行頭なら 行末に移動
      s.StartOfLine( false, mePosLogical );
    s.EndOfLine( false, mePosLogical );
    }
     else {
      // ➁ 行末に移動
      s.EndOfLine( false, mePosLogical );
    }
   }
   }
  // 4in1 トグルモード
   else {
   else {
     // ①行頭に移動
     var ax = s.GetActivePointX( mePosLogical );
     s.StartOfLine( false, mePosLogical );
    var ay = s.GetActivePointY( mePosLogical );
    var str = d.GetLine( ay, 0 );
    var top = act + 1 - ax;            // 行頭位置
    var sId = str.search( /[^  \s]/ );  // 行頭の空白文字数
    var eId = str.replace( /[  \s]*$/, "" ).length; // 行末の空白を除いた文字数
    var ind = top + sId;                // インデントの後ろ位置
    var end = top + eId;                // 行末空白の前の位置
 
    if ( act == top && sId > 0 ) {
      // ➁ 文字列開始位置に移動(インデントの後ろ)
      s.SetActivePos( ind );
    }
     else if ( act != end && ( act == ind || act == top ) ) {
      // ➂ 文字列終了位置に移動(行末空白の前)
      s.SetActivePos( end );
    }
    else if ( act != top + str.length && ( act == end || act == ind || act == top ) ) {
      // ➃ 行末に移動
      s.EndOfLine( false, mePosLogical );
    }
    else {
      // ➀ 行頭に移動
      s.StartOfLine( false, mePosLogical );
    }
   }
   }
}
}


// 4in1 トグルモード
else {
  Redraw = false;
  var x = s.GetActivePointX( mePosLogical );
  var y = s.GetActivePointY( mePosLogical );
  var pos = s.GetActivePos(); // 現在位置
  var top = pos + 1 - x; // 行頭位置
  var st = d.GetLine( y, 0 );
  var sId = st.search( /[^  \s]/ ); // 行頭の空白文字数
  var eId = st.replace( /[ \s]*$/, "" ).length; // 行末空白を除いた文字数
  var ind = top + sId; // インデントの後ろ位置
  var end = top + eId; // 行末空白の前の位置


   if ( pos == top && sId > 0 ) {
/**
     // ②文字列開始位置に移動(インデントの後ろ)
* 関数 MultiFunction( Fn, arg )
    s.SetActivePos( ind );
* マルチカーソル(複数選択範囲)に対応させる
* 第1引数: Function; 選択範囲ごとに適用する処理の関数
* 第2引数: Function に渡す引数をまとめた配列
*/
function MultiFunction( Fn, arg ) {
  var d = editor.ActiveDocument;
   var s = d.selection;
 
  // 矩形選択範囲は行に分ける
  s.Mode = meModeMulti;
 
  // 選択範囲の座標を取得
  var sCount = s.Count;
  var Sel = [];
  for ( var i = 0; i < sCount; i ++ ) {
     Sel[i] = {
      act: s.GetActivePos( i ),
      anc: s.GetAnchorPos( i )
    };
   }
   }
   else if ( pos != end && ( pos == top || pos == ind ) ) {
 
     // ③文字列終了位置に移動(行末空白の前)
   // 各選択範囲を処理;
     s.SetActivePos( end );
  for ( var i = 0, diff = 0, dl; i < sCount; i ++ ) {
    dl = d.TextLength;
    s.SetActivePos( Sel[i].act + diff );
    s.SetAnchorPos( Sel[i].anc + diff );
 
    Fn( arg ); // TopEndOfLine() 関数「行頭か行末 または 選択範囲の始点か終点」
 
     // Fn() の残した選択範囲(またはキャレット位置)を回収
    Sel[i].act = s.GetActivePos();
     Sel[i].anc = s.GetAnchorPos();
    diff += d.TextLength - dl; // 文字数の増減量(累積)
   }
   }
   else if ( pos != top + st.length && ( pos == top || pos == end || pos == ind ) ) {
 
    // ④文末に移動
  // マルチカーソル(複数選択範囲)を復帰
     s.EndOfLine( false, mePosLogical );
   for ( var i = 0; i < sCount; i ++ ) {
  }
     s.AddPos( Sel[i].anc, Sel[i].act );
  else {
    // ①文頭に移動
    s.StartOfLine( false, mePosLogical );
   }
   }
  Redraw = true;
}
}
</source>
</source>
== メモ ==
* 2019/03/19 (sukemaru)
: 4in1 トグルモードを追加

2020年6月26日 (金) 18:59時点における版

ダウンロード

「ファイル:行頭か行末 または 選択範囲の始点か終点.zip」

  • 通常版
  • GetKeyState.exe による機能拡張版
  • マテリアルデザインっぽいアイコン


通常版

ショートカットキーやツールバーアイコンを削減するために、自分がよく使う機能をひとまとめにしてみました
(ショートカットの割りあては Home または End キーひとつで済み、ツールバーアイコンやマウスボタンへの割りあてもこれひとつで)。

  • 行頭/行末のトグル移動のパターンは 2in1 モードと 4in1 モードを選択可


#title = "行頭か行末 または 選択範囲の始点か終点"
#tooltip = "行の先頭か末尾 または 選択範囲の始点か終点 にカーソルを移動する"
// #icon = "invert_caret_pos[2].ico"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",129

/**
 * ---------------------------------------------------------
 * 「行頭か行末 または 選択範囲の始点か終点」マクロ
 * sukemaru, 2018/07/20 - 2020/06/26
 * ---------------------------------------------------------
 * (2020/06/26: マルチカーソル対応)
 */

// ---------- ▼ 設定項目 ▼ ---------- //

// ■ トグルパターン設定: 2in1モード or 4in1モード
var toggleMode2 = false;

// true のとき  ⇒ 2in1トグルモード(行頭 ⇔ 行末)
// false のとき ⇒ 4in1トグルモード(行頭 → 行頭空白の後ろ → 行末空白の前 → 行末)

// ---------- ▲ 設定項目 ▲ ---------- //


editor.ExecuteCommandByID( 2189 );	// アクティブなペイン
var sx = ScrollX,  sy = ScrollY;
var s = editor.ActiveDocument.selection;
var st = s.Text;

// マルチカーソル対応
var arg = [ toggleMode2 ];
// 選択範囲が1つで矩形選択ではないとき
if ( ! s.Mode || s.Mode === 1 ) {
  TopEndOfLine( arg );
}
// 矩形選択または複数選択のとき
else {
  BeginUndoGroup();
  AddUndo();
  MultiFunction( TopEndOfLine, arg );
  EndUndoGroup();
}

// ScrollX = sx;
ScrollY = sy;


/**
 * TopEndOfLine( toggleMode2 )
 * 「行頭か行末 または 選択範囲の始点か終点」
 */
function TopEndOfLine( arg ) {
  var toggleMode2 = arg[0];

  var d = editor.ActiveDocument;
  var s = editor.ActiveDocument.selection;
  var act = s.GetActivePos();

  // 選択範囲あり
  if ( s.Text ) {
    var anc = s.GetAnchorPos();
    // 「選択範囲の始点終点を交替」
    s.SetAnchorPos( act );
    s.SetActivePos( anc, true );
  }

  // 2in1 トグルモード 「行頭か行末」
  else if ( toggleMode2 ) {
    if ( s.GetActivePointX( mePosLogical ) != 1 ) {
      // ➀ 行頭に移動
      s.StartOfLine( false, mePosLogical );
    }
    else {
      // ➁ 行末に移動
      s.EndOfLine( false, mePosLogical );
    }
  }

  // 4in1 トグルモード
  else {
    var ax = s.GetActivePointX( mePosLogical );
    var ay = s.GetActivePointY( mePosLogical );
    var str = d.GetLine( ay, 0 );
    var top = act + 1 - ax;             // 行頭位置
    var sId = str.search( /[^  \s]/ );  // 行頭の空白文字数
    var eId = str.replace( /[  \s]*$/, "" ).length; // 行末の空白を除いた文字数
    var ind = top + sId;                // インデントの後ろ位置
    var end = top + eId;                // 行末空白の前の位置

    if ( act == top && sId > 0 ) {
      // ➁ 文字列開始位置に移動(インデントの後ろ)
      s.SetActivePos( ind );
    }
    else if ( act != end && ( act == ind || act == top ) ) {
      // ➂ 文字列終了位置に移動(行末空白の前)
      s.SetActivePos( end );
    }
    else if ( act != top + str.length && ( act == end || act == ind || act == top ) ) {
      // ➃ 行末に移動
      s.EndOfLine( false, mePosLogical );
    }
    else {
      // ➀ 行頭に移動
      s.StartOfLine( false, mePosLogical );
    }
  }
}


/**
 * 関数 MultiFunction( Fn, arg )
 * マルチカーソル(複数選択範囲)に対応させる
 * 第1引数: Function; 選択範囲ごとに適用する処理の関数
 * 第2引数: Function に渡す引数をまとめた配列
 */
function MultiFunction( Fn, arg ) {
  var d = editor.ActiveDocument;
  var s = d.selection;

  // 矩形選択範囲は行に分ける
  s.Mode = meModeMulti;

  // 選択範囲の座標を取得
  var sCount = s.Count;
  var Sel = [];
  for ( var i = 0; i < sCount; i ++ ) {
    Sel[i] = {
      act: s.GetActivePos( i ),
      anc: s.GetAnchorPos( i )
    };
  }

  // 各選択範囲を処理;
  for ( var i = 0, diff = 0, dl; i < sCount; i ++ ) {
    dl = d.TextLength;
    s.SetActivePos( Sel[i].act + diff );
    s.SetAnchorPos( Sel[i].anc + diff );

    Fn( arg );	// TopEndOfLine() 関数「行頭か行末 または 選択範囲の始点か終点」

    // Fn() の残した選択範囲(またはキャレット位置)を回収
    Sel[i].act = s.GetActivePos();
    Sel[i].anc = s.GetAnchorPos();
    diff += d.TextLength - dl;	// 文字数の増減量(累積)
  }

  // マルチカーソル(複数選択範囲)を復帰
  for ( var i = 0; i < sCount; i ++ ) {
    s.AddPos( Sel[i].anc, Sel[i].act );
  }
}
スポンサーリンク