/* [概要] 切り取り(Ctrl+X、クリップボードにコピーして削除)と同じですが、 非選択状態の場合に、折り返しがあっても改行単位でカーソル行を 切り取ります。(通常の切り取り S_Cut() は折り返し単位。) 注意: 非選択状態の場合、 共通設定『編集』プロパティ-[折り返し行に改行を付けてコピー] はチェックオンでも動作しません。(範囲選択すれば動作します。) [変更履歴] 2015/04/18 共通設定『編集』プロパティ-[選択なしでコピーを可能にする]、 [ラインモード貼り付けを可能にする] の挙動に合わせた。 切り取り後のカーソル位置を、通常の切り取りに合わせた。 2015/03/20 新規 (要sakura:2.1.0.0以降) */ // 改行単位のカーソル行切り取り(非選択時)にするか。 // false(=折り返し単位)だと意味が無くなるが、Ctrl+X や F7、ツールバーなどの // 割り当てを本マクロに置き換えた後で、元の動作に戻したい場合に使う…かも。 // true=する / false=しない(元の動作のまま) var bBY_NEWLINE = true; // 切り取り後のカーソル位置は、切り取り前の場所(桁位置)を維持するか。 // 非選択状態の場合にのみ影響する。 // trueの場合、通常の切り取り同様、切り取り前の場所を維持する。 // (レイアウト単位の桁位置のまま。桁が行末を超える場合は行末に移動。) // falseの場合、常にカーソル行の先頭になる。 // ※フリーカーソルには非対応。(改行より右側だと維持できず。) // true=維持する(通常の切り取り同様) / false=しない(常に行頭) var bKEEP_CURSOR_POSITION = true; Main(); function Main() { var sCF_LOCAL = "#X-Macro_CopyCutEx#"; // クリップボードフォーマット("X-"はシャレ) var nInsMode; var nOpt; var s; var x, y, x2; if( (!bBY_NEWLINE) || (Editor.GetSelectedString(0) != "") ){ Editor.Cut(); // 通常の切り取り。(折り返し単位) return; } // 編集可能でなければ終了。 //if( Editor.ExpandParameter("${R?0$:1$:2}")-0 < 2 ) return; switch( Editor.ExpandParameter("${R?0$:1$:2}")-0 ){ case 0: // ビューモード return; case 1: // 上書き禁止 // 上書き禁止時の編集可・不可は // 共通設定『ファイル』プロパティ-[上書き禁止検出時は編集禁止にする]に依存。 // 編集可能かどうかを S_ChgmodINS() S_IsInsMode() で判断してみる。 nInsMode = Editor.IsInsMode(); Editor.ChgmodINS(); if( nInsMode == Editor.IsInsMode() ) return; // 編集禁止。 Editor.ChgmodINS(); break; case 2: // それ以外(編集可能) default: break; } // SetClipboardByFormat()で適当なクリップボードフォーマット名を設定して、[コピー]。 // それが消えたらコピーが効いたので [選択なしでコピーを可能にする] はオン、 // 消えなかったらオフ、と判断する。 // オンのとき、更にラインモードのクリップボードフォーマットが消えていたら // [ラインモード貼り付けを可能にする] はオフ、消えなかったらオン、と判断する。 Editor.SetClipboardByFormat( "test", sCF_LOCAL, 0, -1 ); //(1=成功、0=失敗) Editor.Copy(); // 通常のコピー。(折り返し単位) if( Editor.IsIncludeClipboardFormat( sCF_LOCAL ) ) return; // 選択なしコピー不可。 // 改行単位でカーソル行切り取り。 nOpt = (Editor.IsIncludeClipboardFormat( "MSDEVLineSelect" )) ? 0x02 : 0x00; // ラインモード可? s = Editor.GetLineStr( 0 ); if( s == "" ) return; // EOFのみの行。 Editor.SetClipboard( nOpt, s ); // 0x00=通常コピー、0x02=ラインモード x = Editor.ExpandParameter("$x") -0; //(-0:数値化) y = Editor.ExpandParameter("$y") -0; Editor.SetDrawSwitch( 0 ); Editor.AddRefUndoBuffer(); // --- Undoバッファ纏め開始。 --- Editor.AppendUndoBufferCursor(); if( bKEEP_CURSOR_POSITION ){ // 行切り取り後の桁位置。(次行(折り返しありは最初の行)の、レイアウト桁維持。) // TABや全角文字で桁位置が非連続・離散的にも対応。 if( y < Editor.GetLineCount(0) ){ while( (Editor.ExpandParameter("$y") -0) == y ) Editor.Down(); x2 = Editor.ExpandParameter("$x") -0; }else{ x2 = 1; // 最終行では行切り取り後の桁=1になる。 } Editor.MoveCursor( y, x, 0 ); } Editor.SelectLine(0); @if( 0 ) // sakura:2.2.0.1ではDelete()前後にAppendUndoBufferCursor()すると、Undo/Redo時の // カーソル表示位置が更新されず。どちらか一方のみだとOK。(2.1.1.4ではOK。) Editor.Delete(); @else // 安定動作(?)。 Editor.InsText(""); //(正当な用法ではないが) @end if( bKEEP_CURSOR_POSITION ){ Editor.MoveCursor( y, x2, 0 ); Editor.AppendUndoBufferCursor(); } Editor.SetUndoBuffer(); // --- Undoバッファ纏め終了。 --- Editor.SetDrawSwitch( 1 ); Editor.ReDraw(); }