行を複製 (複数行可)
選択範囲がないばあいはカーソル位置の論理行を、選択範囲があるばあいは選択範囲をふくむ論理行全体(複数行可)を、下に複製します。
行の途中からべつの行の途中までのような大ざっぱな範囲選択状態から「行の複製」を実行することを想定しています。 ルーラーの行番号のドラッグでの複数行選択やトリプルクリックでの行選択で末尾改行が含まれているばあい、さいごの改行を無視します。
#title = "行を複製 (複数行可)"
#tooltip = "選択範囲(複数行可)の論理行を複製する"
/**
* 選択範囲を拡張してカーソル行(論理行)を "複製" する (複数行可)
*
* 文書終端の空行 ( ^[EOF] ) を選択範囲の末尾にぶら下げての "複製" はできるが、可否について条件アリ
* 選択範囲の確定時点でのキャレットの位置が "選択範囲の先頭にあるか" / "末尾 ( [EOF] マークの直前) にあるか" で判別する
* 文字列または行番号をドラッグ(または"クリック & Shift+クリック")して選択範囲を確定するさいに
* ・上(左)から下(右)にむけて選択範囲をつくった場合 → 終端の空行 ( ^[EOF] ) を含める
* ・下(右)から上(左)にむけて選択範囲をつくった場合 → 終端の空行 ( ^[EOF] ) を含めない
*
* 1行だけの複製なら
* document.selection.DuplicateLine();
*/
var s = document.selection
// 選択範囲の各座標を取得
var ty = s.GetTopPointY( mePosLogical );
var by = s.GetBottomPointY( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
// 選択範囲の末尾が終端の空行 ( ^[EOF] ) にあるときの調整
var e = "";
if ( bx == 1 && ! document.Text.charAt( s.GetActivePos() ) ) // カーソル位置に文字がないばあいを ^[EOF] と判定する
e = "\n";
// 選択範囲の末尾が行頭 x = 1 にあるときの調整
if ( ty != by && bx == 1 )
var by = by - 1;
// 選択範囲の拡張
s.SetActivePoint( mePosLogical, 1, by );
s.EndOfLine( false, mePosLogical );
s.SetAnchorPoint( mePosLogical, 1, ty );
// 選択範囲に改行を追加して複製
var t = s.Text;
s.Text = t + e + "\n" + t;
// (下に)複製された行全体を範囲選択
if ( e.length ) { // 終端の空行をふくめて複製したばあい
s.SetActivePoint( mePosLogical, 1, by + 2 );
s.EndOfDocument( true ); // カーソル位置は選択範囲の末尾
}
else { // 通常の行の複製のばあい
s.SetAnchorPos( s.GetActivePos() + 1 );
s.SetActivePoint( mePosLogical, 1, by + 1, true ); // カーソル位置は選択範囲の先頭
}
文書終端の空行を含めているかいないかで「行の複製」マクロ実行後のキャレット(入力カーソル)の位置をかえているのは、連続で「行の複製」を実行するさいに同じ範囲を選択状態にして複製させるための仕様です。
スポンサーリンク