Macro/投稿/200

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


Top > Macro > 投稿 > 200

カーソル行と、上の行を行入れ替え

  • ページ: Macro/投稿
  • 作者: sai, jj
  • カテゴリー: js
  • 投稿日: 2014-02-11 (火) 06:40:00

メッセージ

カーソルのある行と、上の行を入れ替えます。
キー割り当てはVC++に合わせ Alt+Shift+T とか。

ところで、行入れ替え後のカーソル位置はどこがよいでしょう?
Meadow(Emacs)の transpose-lines (C-x C-t)ではカーソル行の下の行。
VC++6.0ではカーソル行。
このマクロはカーソル行の上の行だったりします。

fileTransposeLine.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
// [概要]
//  カーソルのある行と、上の行を入れ替えます。
//  行入れ替え後のカーソル位置は、上の行の先頭に移動します。
//  (emacsの transpose-lines (C-x C-t)、
//   VCの LineTranspose (Alt+Shift+T)の様な機能です。)
// [変更履歴]
//  2014/02/11 JScript に変更してEOF行でも入れ替えできるように修正
//  2009/04/17 範囲選択中なら取り消し。
//  2004/08/24 新規
 
 
(function(){
    var s = Editor.ExpandParameter("${R?r$:$:$}");      // "${R?読み取り専用$:上書き禁止$:いずれでもない$}"
    if (s == "r") return;               // 読み取り専用
 
    var y = parseInt( Editor.ExpandParameter("$y") );   // カーソル行(改行単位)
    if (y <= 1) return;                // カーソル行が、1行目
    if (y >= Editor.GetLineCount(0)) {
        s = Editor.GetLineStr(y);
    }
    Editor.CancelMode();                 // 範囲選択中なら取り消し。
 
    // 入れ替え文字列の作成
    var cnt = 0;
    if (s.match(/[^\r\n]$/)) { // カーソル行に、改行が無い。(EOF行)
        var newLine = "\r\n";
        var lineCode = Editor.GetLineCode();
        if (lineCode == 0) {
            newLine = "\r\n";
        } else if (lineCode == 1) {
            newLine = "\r";
        } else if (lineCode == 2) {
            newLine = "\n";
        }
        s = Editor.GetLineStr( y ) + newLine + Editor.GetLineStr( y - 1 ).replace(/[\r\n]/g, "");
        cnt--;
        // 上の行(改行単位)へ
        Editor.GoLineTop(9);
        Editor.Up();
        Editor.GoLineTop(9);
        // 上の行から、2行選択
        Editor.BeginSelect();
        while ( parseInt( Editor.ExpandParameter("$y") ) <= y ) {
            cnt++;
            Editor.GoLineEnd();
            Editor.Down();
            if ( parseInt( Editor.ExpandParameter("$y") ) == y ) {
                cnt++;
                Editor.GoLineEnd();
                break;
            }
        }
    } else {
        s = Editor.GetLineStr( y ) + Editor.GetLineStr( y - 1 );
        // 上の行(改行単位)へ
        Editor.GoLineTop(9);
        Editor.Up();
        Editor.GoLineTop(9);
        // 上の行から、2行選択
        Editor.BeginSelect();
        while ( parseInt( Editor.ExpandParameter("$y") ) <= y ) {
            cnt++;
            Editor.Down();
        }
    }
 
 
    // 入れ替え文字列を挿入
    Editor.InsText( s );
 
    // 上の行(改行単位)へ
    for (var i = 0; i < cnt; i++) {
        Editor.Up();
        Editor.GoLineTop(9);
    }
 
    // Editor.InsText() の後は、
    // 再描画しないと更新状態にならない。([ファイル名(更新)] のようにならない。)
    // カーソル位置も更新されない。
    Editor.ReDraw();
})();
fileTransposeLine.ppa
  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
// (Tab=8)
// [概要]
//    カーソルのある行と、上の行を入れ替えます。
//    行入れ替え後のカーソル位置は、上の行の先頭に移動します。
//    (emacsの transpose-lines (C-x C-t)、
//     VCの LineTranspose (Alt+Shift+T)の様な機能です。)
// [変更履歴]
//    2009/04/17    範囲選択中なら取り消し。
//    2004/08/24    新規
 
 
var
    y    : Integer;
    s    : String;
 
begin
    s := S_ExpandParameter('${R?r$:$:$}');        // '${R?読み取り専用$:上書き禁止$:いずれでもない$}'
    if s = 'r' then Exit;                // 読み取り専用
 
    //y := S_ExpandParameter('$y');            // (これでもOKだったが)
    y := StrToInt( S_ExpandParameter('$y') );    // カーソル行(改行単位)
    if y <= 1 then Exit;                // カーソル行が、1行目
    if y >= S_GetLineCount(0) then begin
        s := S_GetLineStr(y);
        if (Pos(#13, s) = 0) and (Pos(#10, s) = 0) then Exit;
                            // カーソル行に、改行が無い。(EOF行)
    end;
    S_CancelMode();                    // 範囲選択中なら取り消し。
 
    // 入れ替えた文字列
    s := S_GetLineStr( y ) + S_GetLineStr( y - 1 );
 
    // 上の行(改行単位)へ
    S_GoLineTop(9);
    S_Up();
    S_GoLineTop(9);
 
    // 上の行から、2行選択
    S_BeginSelect();
    while( StrToInt(S_ExpandParameter('$y')) <= y ) do begin
        S_Down();
    end;
 
    // 入れ替えた文字列を挿入
    S_InsText( s );
 
    // 上の行(改行単位)へ
    S_Up();
    S_GoLineTop(9);
    S_Up();
    S_GoLineTop(9);
 
    // S_InsText() の後は、
    // 再描画しないと更新状態にならない。([ファイル名(更新)] のようにならない。)
    // カーソル位置も更新されない。
    S_ReDraw();
end;


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

添付ファイル: fileTransposeLine.js 366件 [詳細] fileTransposeLine.ppa 469件 [詳細]

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