Macro/投稿/199

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


Top > Macro > 投稿 > 199

カーソル上の連続するスペース・タブをスペース1個にする

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

メッセージ

カーソル上の連続するスペースやタブを、スペース1個に置換します。
キー割り当てはEmacsに合わせ…られないですよね。
(Alt+Space はシステムメニュー)


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

  • Unicode版対応。(ANSI版1.6.6.0/Unicode版2.0.5.0にて動作確認。)
  • [共通設定] - [全般] タブ - [単語単位で移動するときに単語の両端に止まる] がオンだと
    誤動作するのを修正。
  • 21行目
    //	sSPACE = "[ \t ]";		// 半角スペース、タブ、全角スペース
    のコメントを外すと、全角スペースも(スペース1個に置換の)対象となります。
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();
}

旧PPA版: fileJustOneSpacePPA.zip



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

添付ファイル: fileJustOneSpace.js 249件 [詳細] fileJustOneSpacePPA.zip 221件 [詳細]

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