Macro/投稿/197

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


Top > Macro > 投稿 > 197

カーソル上の連続するスペース・タブを削除

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

メッセージ

カーソル上の連続するスペースやタブを、削除します。
(あまり使わないかも。)
キー割り当てはEmacsに合わせ Alt+\ とか。


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

  • Unicode版対応。(ANSI版1.6.6.0/Unicode版2.0.5.0にて動作確認。)
  • [共通設定] - [全般] タブ - [単語単位で移動するときに単語の両端に止まる] がオンだと
    誤動作するのを修正。
  • 20行目
    //	sSPACE = "[ \t ]";		// 半角スペース、タブ、全角スペース
    のコメントを外すと、全角スペースも削除の対象となります。
fileDeleteHorizontalSpace.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
/* (Tab=4)
 [概要]
	カーソル上の連続するスペース・タブを、削除します。
	カーソル上(またはカーソルの直前)にスペースが1つも無い場合は
	何もしません。
	(emacsの delete-horizontal-space (M-\, ESC \)の様な機能です。)
 [変更履歴]
	2012/07/29	新規 (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();
    
    // 後ろの連続したスペース・タブを削除。
    re = new RegExp( sSPACE + "*$" );            // re = /[     ]*$/
    sOrg = Editor.GetSelectedString(0);
    sNew = sOrg.replace( re, "" );
    if( sOrg != sNew ){
        // 選択文字列を置き換える。
        Editor.InsText( sNew );
    }else{
        // スペース・タブは無かった。何もしない。
    }
    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 == nEnd ){
        // スペース・タブは無かった。何もしない。
    }else{
        // 範囲選択して削除。
        
        // (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.Delete();
    }
    Editor.CancelMode();                        // (編集禁止時、選択状態を解除。)
    Editor.ReDraw();
}

旧PPA版: fileDeleteHorizontalSpace.zip



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

添付ファイル: fileDeleteHorizontalSpace.js 249件 [詳細] fileDeleteHorizontalSpace.zip 196件 [詳細]

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