行末を半角スペースで揃えるマクロ〜その2
SQLファイルの整形とかで行末を揃える事が多く、スペースキーを叩くのも疲れてきたので、マクロ(JScript)を組んでみた。
※サクラエディッタ専用(かな?)
http://d.hatena.ne.jp/crays/20081031/1225438472
上記エントリーでマルチバイト文字とか、タブ文字の対応ができてなかったので対応してみました。
使い方や注意事項は以前と一緒です。
function end_of_indent(str){ var out = ''; //タブ文字のバイト数 var tab_cnt = 4; //改行文字で分割 var str_array = str.split('\r\n'); //最大文字バイト数の取得 var max_length = 0; for(var i = 0; i < str_array.length; i++){ //マルチバイト文字に対応する為、一文字づつ判定しバイト加算 var _tmp_mlen = 0; for(var ch_cnt = 0; ch_cnt < str_array[i].length; ch_cnt++) { if('\t' == str_array[i].charAt(ch_cnt)){ //タブ文字の場合(設定バイト数加算) _tmp_mlen = _tmp_mlen + tab_cnt; }else{ if(128 <= str_array[i].charCodeAt(ch_cnt)){ //マルチバイト文字の場合(1バイト加算) _tmp_mlen++; } _tmp_mlen++; } } //当該行が最大バイト数であれば、退避変数に代入 if(max_length < _tmp_mlen){ max_length = _tmp_mlen; } } //スペーサーを定義 var spacer = ''; for(var i = 0; i < max_length; i++){ spacer = spacer + ' '; } //各行にスペーサーを連結し、最大バイト数まで返却変数に結合 for(var i = 0; i < str_array.length; i++){ str_array[i] = str_array[i] + spacer; //マルチバイト文字に対応する為、一文字づつ判定しバイト加算 var _line_mlen = 0; for(var ch_cnt = 0; _line_mlen <= max_length; ch_cnt++) { if('\t' == str_array[i].charAt(ch_cnt)){ //タブ文字の場合(設定バイト数加算) _line_mlen = _line_mlen + tab_cnt; }else{ if(128 <= str_array[i].charCodeAt(ch_cnt)){ //マルチバイト文字の場合(1バイト加算) _line_mlen++; } _line_mlen++; } //返却変数に一文字づつ結合 out = out + str_array[i].charAt(ch_cnt); } //次行が存在すれば改行コードを結合 if(i + 1 < str_array.length){ out = out + '\r\n'; } } return out; } Editor.InsText( end_of_indent(Editor.GetSelectedString()) );