/* 文字列の位置合わせMacro。ソースの整頓に使えると思います。 文字列の入力インターフェイスにExcelを使っています。(@function : InputBox) C, C++コメントには対応していません。 実行例: int nMoge = 256; string strMogeMoge = "もげもげ"; float fHoge = 0.001; ↓ (区切り文字に、= を利用) int nMoge = 256; string strMogeMoge = "もげもげ"; float fHoge = 0.001; */ /// 設定 var tabLen = 4; // tab の文字幅。設定取得が出来ないのでハードコーディング。 var useSpace = false; // 位置詰めの文字にspaceを使うかどうか(falseの場合は、出来るだけ tab を使う。 /// メインルーチン var segmentStr = InputBox("区切りの文字を入力して下さい。"); if (segmentStr == "") { }else { // 文字列取得 var str = Editor.GetSelectedString(); var lines = str.split("\r\n"); // 整頓 AlignLines(lines, segmentStr, useSpace); // 文字列設定 Editor.InsText(lines.join("\r\n")); } /// 関数群 function InputBox(message, titleCaption, input) { var objXL = new ActiveXObject("Excel.Application"); if (input == null) { input = ""; } var strRet = objXL.InputBox(message, titleCaption, input); return strRet; } function MsgBox(message, title, nType) { if (title == null) title = ""; if (nType == null) nType = 0; var Shell = new ActiveXObject("WScript.Shell"); return Shell.Popup( message, 0, // nSecToWait, title, nType ); } // 何文字目という位置を、\t を考慮した見た目の位置の数値に変換する。 function CalcStringLookPosition(str, letterPos) { var lookPosCnt = 0; var str = str.substring(0, letterPos); var code; var letter; for (var i=0; i= 0x20 && code <= 0xdf) { // ascii ++lookPosCnt; }else if (code == 0x09) { // \t lookPosCnt = GetNextTabPosition(lookPosCnt, tabLen); }else { // 2byte文字 lookPosCnt += 2; } } return lookPosCnt; } function RepeatString(str, nRepeat) { var ret = ""; for (var i=0; i 0) { return idx - mod + tabSize; }else { return idx + tabSize; } } // 何文字目の位置を、\t を考慮した見た目の位置()に設定する。 function GetLookPositionSettedString(line, letterPos, setLookPos, useSpace) { var lookPos = CalcStringLookPosition(line, letterPos); if (setLookPos <= lookPos) { return line; } var front = line.substring(0, letterPos); var tail = line.substring(letterPos); var diff = setLookPos - lookPos; if (useSpace) { return front + RepeatString(" ", diff) + tail; }else { // useTab var nextTabPos = GetNextTabPosition(lookPos, tabLen); // tabも出来ない位置までの場合はspaceを置いて終わる。 if (setLookPos < nextTabPos) { return front + RepeatString(" ", diff) + tail; }else { // tab出来る位置までtabを置く。残りがあったらspaceを置く。 var tabCnt = 1; var spaceCnt = 0; while (nextTabPos < setLookPos) { nextTabPos = GetNextTabPosition(nextTabPos, tabLen); if (nextTabPos > setLookPos) { spaceCnt = setLookPos - (nextTabPos - tabLen); }else { ++tabCnt; } } return front + RepeatString("\t", tabCnt) + RepeatString(" ", spaceCnt) + tail; } } } function AlignLines(lines, segmentStr, useSpace) { // 最大右位置探索 var maxPos = 0; var pos; var line; for (var i=0; i maxPos) { maxPos = pos; } } // 文字列編集 for (var i=0; i