行の先頭に貼り付け
「引用の追加」マクロを翻案して、クリップボードのデータ(文字列)を複数行の先頭に貼り付ける(挿入する)マクロにしました。 箇条書きのバレットや行コメントのプリフィックスのような短い文字列の挿入や、CSVで先頭に列を追加する用途に。
選択範囲がないばあいはカーソル位置の論理行、選択範囲があるばあいは選択範囲をふくむ論理行全体(複数行可)の先頭に挿入します。
行の途中からべつの行の途中までのような大ざっぱな範囲選択状態から「行の先頭に貼り付け」を実行することを想定しています。 ルーラーの行番号のドラッグでの複数行選択やトリプルクリックでの行選択で末尾改行が含まれているばあい、さいごの改行を無視します。
#title = "行の先頭に貼り付け"
#tooltip = "各行の先頭に貼り付ける (挿入)"
/**
* 選択範囲をふくむ各行の先頭にクリップボードのデータを貼り付ける (挿入)
*
* 文書終端の空行 ( ^[EOF] ) を選択範囲の末尾にぶら下げての "挿入" はできるが、可否について条件アリ
* 選択範囲の確定時点でのキャレットの位置が "選択範囲の先頭にあるか" / "末尾 ( [EOF] マークの直前) にあるか" で判別する
* 文字列または行番号をドラッグ(または"クリック & Shift+クリック")して選択範囲を確定するさいに
* ・上(左)から下(右)にむけて選択範囲をつくった場合 → 終端の空行 ( ^[EOF] ) を含める
* ・下(右)から上(左)にむけて選択範囲をつくった場合 → 終端の空行 ( ^[EOF] ) を含めない
*/
var sx = ScrollX, sy = ScrollY; // スクロール位置を保存
var s = document.selection;
// 選択範囲の各座標を取得
var ay = s.GetTopPointY( mePosLogical );
var by = s.GetBottomPointY( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
// 選択範囲の末尾が終端の空行 ( ^[EOF] ) にあるときの調整
var e = 0;
if ( ! document.Text.charAt( s.GetActivePos() ) ) // カーソル位置に文字がないばあいを ^[EOF] と判定する
e = 1;
// 選択範囲の末尾が行頭 x = 1 にあるときの調整
if ( ay != by && bx == 1 && e == 0 )
var by = by - 1;
// 選択範囲の拡張
s.SetActivePoint( mePosLogical, 1, by );
s.EndOfLine( false, mePosLogical );
s.SetAnchorPoint( mePosLogical, 1, ay );
// ここから、「引用の追加」マクロのコードを流用
var cb = ClipboardData.GetData(); // クリップボードのテキストデータを取得
s.Text = insertCb( s.Text, cb ); // "各行の先頭に貼り付け”
function insertCb( arg1, arg2 ) {
var a = arg1.split( "\n" );
for ( var i = 0; i < a.length; i++ )
a[i] = arg2 + a[i];
return a.join( "\n" );
}
// 選択範囲を復旧 (末尾改行を含める)
s.SetAnchorPos( s.GetActivePos() + 1 );
s.SetActivePoint( mePosLogical, 1, ay, true );
ScrollX = sx; ScrollY = sy; // スクロール位置を復元
スポンサーリンク