添付ファイルの情報



[添付ファイル一覧] [全ページの添付ファイル一覧]

fileJustOneSpace.js
格納ファイル名:attach/4D6163726F2FC5EAB9C62F313939_4A7573744F6E6553706163652E6A73
ページ:Macro/投稿/199
格納ファイル名:attach/4D6163726F2FC5EAB9C62F313939_4A7573744F6E6553706163652E6A73
MD5ハッシュ値:e4a7a2898d0e7598fd55c4b6b1d59eb4
サイズ:4.0KB (4090 bytes)
Content-type:application/octet-stream
登録日時:2012/08/06 02:29:38
アクセス数:367
MD5ハッシュ値:e4a7a2898d0e7598fd55c4b6b1d59eb4
fileJustOneSpace.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
/* (Tab=4)
 [概要]
	カーソル上の連続するスペース・タブを、スペース1個に置換します。
	カーソル上(及びカーソルの直前)にスペースが1つも無い場合は、
	スペースを1個挿入します。
	既にスペースが1個の場合、何もしません。
	(emacsの just-one-space (M-SPC, ESC SPC)の様な機能です。)
 [変更履歴]
	2012/07/28	新規 (Unicode版にも対応)
*/
 
// メッセージボックスを出すのにWshShell.Popup()を使用する。
//	書式(MSDNのWSHより): intButton = WshShell.Popup(strText,[nSecondsToWait],[strTitle],[nType])
//var WshShell	= new ActiveXObject("WScript.Shell");
// メッセージボックスのタイトル (本マクロ名)
//var CAPTION		= Editor.ExpandParameter("$M").replace( /^.*\\/, "" );
 
// 置換されるスペース・タブ (正規表現)
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 re;                // 正規表現
    var s;
    var sOrg, sNew;
    
    Editor.CancelMode();                        // 範囲選択中なら取り消し。
    
    // カーソル位置以降の、スペース・タブ以外の文字の出現位置に移動。
    re = new RegExp( "^" + sSPACE );            // re = /^[     ]/
    while(true){
        s = Editor.ExpandParameter("$C");        // カーソル位置の単語
        if( s.search( re ) == -1 ) break;
        Editor.WordRight();
    }
    
    // 行頭からカーソル位置までを選択。
    Editor.MoveHistSet();
    Editor.GoLineTop( (1<<3)|(1<<0) );
        // bit0:1=行頭のスペースを無視する
        // bit2:0=非選択状態で移動 / 1=選択状態で移動
        // bit3:0=折り返し単位で移動 / 1=改行単位で移動
    Editor.BeginSelect();
    Editor.MoveHistPrev();
    
    // 後ろの連続したスペース・タブを、スペース1個に置換。
    re = new RegExp( sSPACE + "*$" );            // re = /[     ]*$/
    sOrg = Editor.GetSelectedString(0);
    sNew = sOrg.replace( re, " " );
    if( sOrg != sNew ){
        // 選択文字列を置き換える。
        Editor.InsText( sNew );
    }else{
        // 既にスペース1個だった。何もしない。
    }
    Editor.CancelMode();                        // 範囲選択中なら取り消し。
    Editor.ReDraw();
}
 
// sakura:2.0.4.0以降(Unicode版)。MoveCursor() が使える。
function Sub2()
{
    var x, y;                    // 桁、行位置(1開始)
    var pos, nSta, nEnd;        // 文字列内の位置(0開始)
    var sLineStr;                // カーソル行の文字列
    var i;
    
    Editor.CancelMode();                        // 範囲選択中なら取り消し。
    
    // Unicode版なので、ExpandParameter("$x") はバイト単位ではなく文字単位。
    x = Editor.ExpandParameter("$x") -0;        // -0:文字列→数値化
    y = Editor.ExpandParameter("$y") -0;
    pos = x - 1;
    sLineStr = Editor.GetLineStr( 0 );
    
    // カーソル位置前後の、連続したスペース・タブの開始位置・終了位置を得る。
    for(i = pos - 1;  i >= 0;  i--){
        if( sLineStr.charAt( i ).search( sSPACE ) == -1 ) break;
    }
    nSta = i + 1;
    for(i = pos;  i < sLineStr.length;  i++){
        if( sLineStr.charAt( i ).search( sSPACE ) == -1 ) break;
    }
    nEnd = i;
    
    if( (nSta + 1 == nEnd) && (sLineStr.charAt( nSta ) == " ") ){
        // 既にスペース1個だった。何もしない。
        if( pos < nEnd ){
            Editor.Right();                        // スペースの後ろに移動。
        }
    }else{
        // 範囲選択してスペース1個に置き換える。
        
        // (Undo時、カーソルは連続したスペース・タブの右端)
        //	Editor.MoveCursor( y, nSta + 1, 0 );	// オプション 0=未選択
        //	Editor.MoveCursor( y, nEnd + 1, 1 );	// オプション 1=通常選択
        
        // (Undo時、カーソルは連続したスペース・タブの左端)
        Editor.MoveCursor( y, nEnd + 1, 0 );    // オプション 0=未選択
        Editor.MoveCursor( y, nSta + 1, 1 );    // オプション 1=通常選択
        
        Editor.InsText(" ");
    }
    Editor.CancelMode();                        // (編集禁止時、選択状態を解除。)
    Editor.ReDraw();
}




    


    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS