改行単位で複数行もまとめて複製するマクロです。
なぜか本体機能には折り返し単位しかないので……
**マクロコード** (duplicateLines.js)
duplicateLines.js
/**********************************************************
# 行の二重化+ マクロ
通常のは折り返し単位且つ1行のみなので、改行単位&複数行選択に対応。
**********************************************************/
var KEEP_SELECT = 1; //行選択状態の維持 => 複数行の連続複製用
//function put(msg){if(typeof(outp)=='undefined'){TraceOut('\r\n▼-- $t @['+ExpandParameter('$M').replace(/^.*?([^\\\/]+)$/m,'$1')+'] > $f --',1),outp=1} TraceOut((''+msg).replace(/^([\S])/gm,'\t$1'),0)}
//== メイン処理 ===========================================
function duplicateLines(){
var txt=GetSelectedString(0), f=txt!='', row=ExpandParameter('$y')-0, len=1;
if(f){row=LayoutToLogicLineNum(GetSelectLineFrom());//複数行選択?
len=LayoutToLogicLineNum(GetSelectLineTo())-LayoutToLogicLineNum(GetSelectLineFrom())+1;
if(LineColumnToIndex(GetSelectLineTo(),GetSelectColmTo())<2){len--}
}
if(row>GetLineCount(0)){return false} txt='';
for(var i=0; i<len; i++){txt+=GetLineStr(row+i)}
CommitUndoBuffer(); AddRefUndoBuffer(); AppendUndoBufferCursor(); SetDrawSwitch(0);
MoveCursor(row+len,1,0); InsText(txt);
var pos=ExpandParameter('$y')-0; MoveCursor(row+len,1,0);
if(KEEP_SELECT){if(f && KEEP_SELECT){MoveCursor(pos,1,1)}}
SetUndoBuffer(); SetDrawSwitch(1); ReDraw();
return true;
}
if(Editor){duplicateLines()}
- 折返し表示中でも改行単位で行を複製します。
- 複数行選択時は選択範囲単位で複製します。1
- デフォルトでは複製した行は選択状態になります。2
KEEP_SELECT = 0
にすると選択状態にならなくなります。
- デフォルトでは複製した行は選択状態になります。2
ぶっちゃけ、行選択&コピペでも良いようなマクロですが、選択範囲が適当で良い・クリップボードを汚さないので使い道はあるかも知れません。