行頭か行末 または 選択範囲の始点か終点
ダウンロード
「ファイル:行頭か行末 または 選択範囲の始点か終点.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 );
}
}
スポンサーリンク