1 #title = "routine"
  2 #tooltip = "キャレット位置のルーチンを部分編集 for VB"
  3 #include "lib\sgc4jsee.jsee"
  4 
  5 /**
  6  * @fileOverview
  7  * キャレット位置にあるVBのルーチン(関数または手続き)の範囲を部分編集モードに切り替えます。<br />
  8  * 長くて読みにくいVBのソースに困ったときに使ってください。<br />
  9  * <br />
 10  * 既存の[部分編集の設定/解除]をAlt+F12に、このマクロをAlt+Shift+F12に割り当てるのがお勧めです。
 11  * 
 12  * @author gecca from 雪月花 (http://setsugecca.org/)
 13  * @version 1.00 for EmEditor v10.0
 14  */
 15 
 16 (function() {
 17 	var startMatcher = JseeUtil.getVBRoutineStartMatcher();
 18 	var endMatcher = JseeUtil.getVBRoutineEndMatcher();
 19 	var commentLineMatcher = /^\s*'/;
 20 	
 21 	Redraw = false;
 22 	
 23 	// 現在位置
 24 	var activeY = document.selection.GetActivePointY(eePosLogical);
 25 	// 選択範囲の保存
 26 	var activeX = document.selection.GetActivePointX(eePosLogicalA);
 27 	var anchorX = document.selection.GetAnchorPointX(eePosLogicalA);
 28 	var anchorY = document.selection.GetAnchorPointY(eePosLogical);
 29 	
 30 	// 現在行が終了部分であればactiveYを-1ズラして、仮想activeYとする
 31 	
 32 	// 現在行が終了部分であれば-1、現在行がコメントであればコメントの底部 - 1の位置までactiveYをズラして、仮想activeYとする
 33 	var virtualActiveY = (function() {
 34 		var virtualActiveY = activeY;
 35 		if(endMatcher.test(document.GetLine(virtualActiveY))) {
 36 			virtualActiveY -= 1;
 37 		}
 38 		// キャレット位置から下に向かって検索
 39 		for(var i=virtualActiveY;i<document.getLines();i++) {
 40 			// コメント行にマッチしなければreturn
 41 			if(!commentLineMatcher.test(document.GetLine(i))) {
 42 				return i;
 43 			}
 44 		}
 45 	})();
 46 	
 47 	// 開始位置
 48 	var startPos = (function() {
 49 		var found;
 50 		// キャレット位置から上に向かって検索
 51 		for(var i=virtualActiveY;i>0;i--) {
 52 			// 開始部分より先に終了部分が見つかればエラー
 53 			if(!found && i - 1 > 0 && endMatcher.test(document.GetLine(i))) {
 54 				alert("キャレットがルーチンの範囲内にありませんでした。");
 55 				return null;
 56 			}
 57 			
 58 			// 開始部分が見つかった後でもコメント行であればさらに上へ
 59 			if(found) {
 60 				if(commentLineMatcher.test(document.GetLine(i))) {
 61 					found = i;
 62 				// コメント行でなくなれば上限として返却
 63 				} else {
 64 					return found;
 65 				}
 66 			
 67 			// 開始部分を見つける
 68 			} else if(startMatcher.test(document.GetLine(i))) {
 69 				found = i;
 70 			}
 71 		}
 72 	})();
 73 	if(startPos === null) return;
 74 	if(!startPos) {
 75 		alert("ルーチンの開始部を見つけられませんでした");
 76 		return;
 77 	}
 78 	
 79 	// 終了位置
 80 	var endPos = (function() {
 81 		// キャレット位置から下に向かって検索
 82 		for(var i=virtualActiveY;i<document.getLines();i++) {
 83 			if(endMatcher.test(document.GetLine(i))) {
 84 				return i;
 85 			}
 86 		}
 87 	})();
 88 	if(!endPos) {
 89 		alert("ルーチンの終了部を見つけられませんでした");
 90 		return;
 91 	}
 92 	
 93 	// 開始位置から終了位置を選択
 94 	document.selection.SetActivePoint(eePosLogicalA, 1, startPos);
 95 	document.selection.SetAnchorPoint(eePosLogicalA, 2, endPos); // 終了位置なので、必ず1桁以上の文字がある
 96 	
 97 	// 部分編集
 98 	editor.ExecuteCommandByID(4457);
 99 	
100 	// 選択範囲の復元
101 	document.selection.SetActivePoint(eePosLogicalA, activeX, activeY);
102 	document.selection.SetAnchorPoint(eePosLogicalA, anchorX, anchorY);
103 })();
104