Macro/投稿/235

http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F235


Top > Macro > 投稿 > 235

非選択時に改行単位で行をコピー/切り取り/貼り付け、改行単位で行削除

  • ページ: Macro/投稿
  • 作者: jj?
  • カテゴリー: js
  • 投稿日: 2015-03-31 (火) 23:13:39

メッセージ

クリップボードにコピー(Ctrl+C) や 切り取り(Ctrl+X) と同じですが、
非選択状態の場合に、折り返しがあっても改行単位でカーソル行全体を
コピー/切り取り する点が異なります。
貼り付け(Ctrl+V) も同じですが、非選択状態の場合に、折り返しがあっても
改行単位の行頭から貼り付け する点が異なります。
行削除(Shift+Ctrl+E) は、折り返しがあっても改行単位で行全体を削除
する点が異なります。更に、範囲選択状態でも動作し、複数行が選択されていれば
選択行すべてを削除します。
(要sakura:2.1.0.0以降)

(2015/04/28)
・共通設定『編集』プロパティ-[選択なしでコピーを可能にする]、[ラインモード貼り付けを可能にする] の挙動に合わせた。
・切り取り後のカーソル位置を、通常の切り取りに合わせた。
・貼り付け(PasteEx.js)追加。
・行削除(DeleteLineEx.js)追加。

個人的には改行単位の方が便利なので、Ctrl+C と F8、Ctrl+X と F7 に割り当てて
使ってます。(…でもこういうのは機能追加の要望を出せばよかったかも。)

fileCopyEx.js
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
/*
 [概要]
	クリップボードにコピー(Ctrl+C)と同じですが、
	非選択状態の場合に、折り返しがあっても改行単位でカーソル行を
	コピーします。(通常のコピー S_Copy() は折り返し単位。)
	
	注意:
		非選択状態の場合、
		共通設定『編集』プロパティ-[折り返し行に改行を付けてコピー]
		はチェックオンでも動作しません。(範囲選択すれば動作します。)
	
 [変更履歴]
	2015/04/18	共通設定『編集』プロパティ-[選択なしでコピーを可能にする]、
				[ラインモード貼り付けを可能にする] の挙動に合わせた。
	2015/03/20	新規 (要sakura:2.1.0.0以降)
*/
 
// 改行単位のカーソル行コピー(非選択時)にするか。
//	false(=折り返し単位)だと意味が無くなるが、Ctrl+C や F8、ツールバーなどの
//	割り当てを本マクロに置き換えた後で、元の動作に戻したい場合に使う…かも。
//		true=する / false=しない(元の動作のまま)
var bBY_NEWLINE        = true;
 
 
 
Main();
 
function Main()
{
    var sCF_LOCAL    = "#X-Macro_CopyCutEx#";        // クリップボードフォーマット("X-"はシャレ)
    var nOpt;
    var s;
    
    if( (!bBY_NEWLINE) || (Editor.GetSelectedString(0) != "") ){
        Editor.Copy();        // 通常のコピー。(折り返し単位)
        return;
    }
    
    // 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=ラインモード
}
fileCutEx.js
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
 [概要]
	切り取り(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();
}

コードは概ね同様なのでZIP。
filePasteEx.zip fileDeleteLineEx.zip

旧版:
fileCopyCutEx.old20150331.zip



URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル: fileCutEx.js 171件 [詳細] fileCopyEx.js 161件 [詳細] fileCopyCutEx.old20150331.zip 150件 [詳細] fileDeleteLineEx.zip 154件 [詳細] filePasteEx.zip 173件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2015-11-24 (火) 22:57:06 (1059d)