/* (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 = "[ \t ]"; // 半角スペース、タブ、全角スペース //-------------- // メイン 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 = /^[ \t]/ 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 = /[ \t]*$/ 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(); }