Macro/投稿/198

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


Top > Macro > 投稿 > 198

カーソル行を、上の行と行連結

  • ページ: Macro/投稿
  • 作者: jj?
  • カテゴリー: js
  • 投稿日: 2009-04-20 (月) 04:28:35

メッセージ

カーソルのある行を、上の行と行連結します。
キー割り当てはEmacsに合わせ Alt+^ とか。


(2012/08/05) PPAからJSに作り直し。

  • Unicode版対応。(ANSI版1.6.6.0/Unicode版2.0.5.0にて動作確認。)
  • [共通設定] - [全般] タブ - [単語単位で移動するときに単語の両端に止まる] がオンだと
    誤動作するのを修正。
  • 23行目
    //	sSPACE = "[ \t ]";		// 半角スペース、タブ、全角スペース
    のコメントを外すと、全角スペースも削除(スペース1文字に置換)の対象となります。
fileDeleteIndentation.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/* (Tab=4)
[概要]
	カーソルのある行を、スペース(1文字)を空けて、前の行(上の行)と
	連結します。
	前の行が空行(空白類が0文字以上のみの行)の場合、
	スペース(1文字)は挿入しません。
	(emacsの delete-indentation (M-^, ESC ^)の様な機能です。)
 [変更履歴]
	2012/08/05	新規 (Unicode版にも対応)
*/
 
// メッセージボックスを出すのにWshShell.Popup()を使用する。
//	書式(MSDNのWSHより): intButton = WshShell.Popup(strText,[nSecondsToWait],[strTitle],[nType])
//var WshShell	= new ActiveXObject("WScript.Shell");
// メッセージボックスのタイトル (本マクロ名)
//var CAPTION		= Editor.ExpandParameter("$M").replace( /^.*\\/, "" );
 
// 削除(置換)されるスペース・タブ (正規表現)
//	前の行(上の行)の行末のスペース・タブと、カーソル行の行頭のスペース・タブは、
//	スペース(1文字)に置換されます。
var sSPACE;
    sSPACE = "[ \t]";        // 半角スペース、タブ
//	sSPACE = "[      ]";		// 半角スペース、タブ、全角スペース
 
 
 
//--------------
// メイン
Main();
 
 
 
function Main()
{
    var sSakuraVer;
    
    // サクラエディタのバージョン (例:ANSI版="1.6.6.0" / Unicode版="2.0.5.0")
    sSakuraVer = Editor.ExpandParameter("$V");
    
    // とりあえず4桁にして比較 (例:"1.23.456.7890" → "0001.0023.0456.7890")
    sSakuraVer = sSakuraVer.replace( /\d+/g, function($0){return ("000"+$0).slice(-4);} );
    if( sSakuraVer >= "0002.0000.0004.0000" ){
        Sub2();        // sakura:2.0.4.0以降(Unicode版)。MoveCursor() が使える。
    }else{
        Sub1();        // ANSI版/Unicode版 両対応。動作がぎこちない。
    }
}
 
// ANSI版/Unicode版 両対応。動作がぎこちない。
function Sub1()
{
    var y;                        // カーソル行の行位置
    var sLinePrev;                // 前の行(上の行)の文字列
    var sLineCur;                // カーソル行の文字列
    var re;                        // 正規表現
    var bPrevIsBlankLine;        // 前の行は空行か
    var sLineNew;                // 前の行の行末(行末のスペース・タブを除く)と、
                                // カーソル行全体(行頭のスペース・タブを除く)とを、
                                // スペース(1文字)を空けて連結した文字列
    
    Editor.CancelMode();                        // 範囲選択中なら取り消し。
    
    y = Editor.ExpandParameter("$y") -0;        // -0:文字列→数値化
    if( y == 1 ){
        // 先頭行なら何もせず終了。
        Editor.GoFileTop();        // 行頭(=ファイルの先頭)へ
        return;
    }
    
    // 前の行(上の行)と、カーソル行を取得。
    sLinePrev = Editor.GetLineStr( y - 1 );
    sLineCur  = Editor.GetLineStr( 0 );
    
    // 前の行は空行か。
    // 空行でなければ、連結した文字列にスペース(1文字)を入れる。
    re = new RegExp( "^" + sSPACE + "*[\r\n]+" );        // re = /^[     ]*[\r\n]+/
    bPrevIsBlankLine = (sLinePrev.search( re ) != -1);
    sLineNew = (bPrevIsBlankLine) ? "" : " ";
    
    // カーソル行の、先頭の連続したスペース・タブを削除した文字列。
    re = new RegExp( "^" + sSPACE + "*" );        // re = /^[     ]*/
    sLineNew += sLineCur.replace( re, "" );
    
    // 前の行の、行末の連続したスペース・タブの開始位置(無ければ行末)に移動。
    // (マクロ実行後のカーソル位置でもある。)
    Editor.GoLineTop( (1<<3)|(1<<0) );            // 行頭へ(改行単位)
    Editor.Left();                                // 前の行の行末へ
    if( bPrevIsBlankLine ){
        // 前の行が空行なら行頭に移動、となる。
        Editor.GoLineTop( (1<<3)|(1<<0) );        // 行頭へ(改行単位)
    }else{
        // 行末から前方へ、スペース・タブ以外の文字の出現位置を探す。
        re = new RegExp( "^" + sSPACE );        // re = /^[     ]/
        while(true){
            Editor.WordLeft();
            if( Editor.ExpandParameter("$C").search( re ) == -1 ) break;
                // "$C":カーソル位置の単語
        }
        Editor.SelectWord();                    // 単語を選択して、
        Editor.Right();                            // 右へ
    }
    Editor.MoveHistSet();                        // 位置を記憶
    
    // カーソル行の次の行の先頭から、現カーソル位置までを選択し、置き換える。
    // (Undo時、カーソルは前の行の行末の連続したスペース・タブの左端)
    Editor.SelectLine(0);                        // 前の行→カーソル行へ移動し、
    Editor.SelectLine(0);                        // カーソル行→次の行へ移動
    Editor.BeginSelect();
    Editor.MoveHistPrev();
    Editor.MoveHistSet();                        // 再び(同じ位置を)記憶
    Editor.InsText( sLineNew );
    
    // マクロ実行後のカーソル位置へ移動。(連結したスペース(1文字)の位置。)
    Editor.GoLineTop( (1<<3)|(1<<0) );            // 行頭へ(改行単位)
        // ↑無くてもよいが、折り返しが右側画面外のときに左スクロールするので。
    Editor.MoveHistPrev();
    
    Editor.CancelMode();                        // 範囲選択中なら取り消し。(編集禁止時用)
    Editor.ReDraw();
}
 
// sakura:2.0.4.0以降(Unicode版)。MoveCursor() が使える。
function Sub2()
{
    var y;                        // 行位置(1開始)
    var sLinePrev;                // 前の行(上の行)の文字列
    var sLineCur;                // カーソル行の文字列
    var i;
    var c;
    var nSta, nEnd;                // 文字列内の位置(0開始)
    
    Editor.CancelMode();                        // 範囲選択中なら取り消し。
    
    y = Editor.ExpandParameter("$y") -0;        // -0:文字列→数値化
    if( y == 1 ){
        // 先頭行なら何もせず終了。
        Editor.GoFileTop();        // 行頭(=ファイルの先頭)へ
        return;
    }
    
    // 前の行(上の行)と、カーソル行を取得。
    sLinePrev = Editor.GetLineStr( y - 1 );
    sLineCur  = Editor.GetLineStr( 0 );
    
    // 前の行の、行末の連続したスペース・タブの開始位置(無ければ行末)を得る。
    for(i = sLinePrev.length - 1;  i >= 0;  i--){
        c = sLinePrev.charAt( i );
        if( c.search( /[\r\n]/ ) != -1 ) continue;
        if( c.search( sSPACE ) == -1 ) break;
    }
    nSta = i + 1;        // (nSta=0なら空行)
    
    // カーソル行の、行頭の連続したスペース・タブの終了位置(無ければ行頭)を得る。
    for(i = 0;  i < sLineCur.length;  i++){
        if( sLineCur.charAt( i ).search( sSPACE ) == -1 ) break;
    }
    nEnd = i;
    
    // 範囲選択して、スペース(1文字)に置き換える。
    
    // (Undo時、カーソルは前の行の行末の連続したスペース・タブの左端)
    //	Editor.MoveCursor( y,     nEnd + 1, 0 );	// オプション 0=未選択
    //	Editor.MoveCursor( y - 1, nSta + 1, 1 );	// オプション 1=通常選択
    
    // (Undo時、カーソルはカーソル行の行頭の連続したスペース・タブの右端)
    Editor.MoveCursor( y - 1, nSta + 1, 0 );    // オプション 0=未選択
    Editor.MoveCursor( y,     nEnd + 1, 1 );    // オプション 1=通常選択
    
    if( nSta == 0 ){
        // 前の行は空行だった。スペース(1文字)は入れない。
        Editor.Delete();
    }else{
        // 前の行は空行ではない。スペース(1文字)を入れる。
        Editor.InsText( " " );
        // マクロ実行後のカーソル位置へ移動。(連結したスペース(1文字)の位置。)
        Editor.Left();
    }
    
    Editor.CancelMode();                        // 範囲選択中なら取り消し。(編集禁止時用)
    Editor.ReDraw();
}

旧PPA版: fileDeleteIndentationPPA.zip



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

添付ファイル: fileDeleteIndentation.js 262件 [詳細] fileDeleteIndentationPPA.zip 221件 [詳細]

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