1 #title = "//"
  2 #tooltip = "行コメント挿入・削除"
  3 #include "lib\sgc4jsee.jsee"
  4 
  5 /**
  6  * @fileOverview
  7  * 行コメントがなければ行コメント挿入、既にあれば削除します。
  8  * <p>
  9  * Eclipseを参考にしました。
 10  * </p>
 11  * 
 12  * @author gecca from 雪月花 (http://setsugecca.org/)
 13  * @version 1.00 for EmEditor v10.0
 14  */
 15 
 16 (function() {
 17 	var logger = JseeUtil.getLogger(false, "行コメント挿入.jsee");
 18 	
 19 	var redraw = Redraw;
 20 	Redraw = false;
 21 	
 22 	// 選択状態を保存
 23 	var topX = document.selection.GetTopPointX(eePosLogical);
 24 	var topY = document.selection.GetTopPointY(eePosLogical);
 25 	var bottomX = document.selection.GetBottomPointX(eePosLogical);
 26 	var bottomY = document.selection.GetBottomPointY(eePosLogical);
 27 	
 28 	// 行選択
 29 	JseeUtil.selectLines();
 30 	
 31 	var LineComment1 = document.Config.Highlight.LineComment1;
 32 	
 33 	// 通常行数
 34 	var m1 = document.selection.Text.match(/(([^\r\n]*)(\r\n|\r|\n)|([^\r\n]+)$)/g);
 35 	// コメント行数
 36 	var m2 = document.selection.Text.match(new RegExp("(^|\r\n|\r|\n)[^\\r\\n\\S]*" + JseeUtil.quote(LineComment1), "g"));
 37 	
 38 	logger.log("m1:" + m1);
 39 	logger.log("m2:" + m2);
 40 	if(m1 && m1.length) logger.log("m1.length:" + m1.length);
 41 	if(m2 && m2.length) logger.log("m2.length:" + m2.length);
 42 	
 43 	// 通常行数とコメント行数が同じ場合
 44 	if(m1 && m2 && m1.length == m2.length) {
 45 		logger.log("通常行数とコメント行数が同じ場合");
 46 		// コメント削除
 47 		editor.ExecuteCommandByID(4372);
 48 		// 選択状態を復元
 49 		if(topX != 1 && topX - LineComment1.length > 0) {
 50 			document.selection.SetActivePoint(eePosLogical, topX - LineComment1.length, topY);
 51 		} else {
 52 			document.selection.SetActivePoint(eePosLogical, 1, topY);
 53 		}
 54 		if(bottomX - LineComment1.length > 0) {
 55 			document.selection.SetActivePoint(eePosLogical, bottomX - LineComment1.length, bottomY, true);
 56 		} else {
 57 			document.selection.SetActivePoint(eePosLogical, 1, bottomY, true);
 58 		}
 59 	
 60 	// 違いがあったりコメントがなかったりする場合
 61 	} else {
 62 		// 選択文字列内で最も少ないインデント (空白とタブの混在に対応せず、設定されているインデントのみを認識)
 63 		var minimumIndent = JseeUtil.getMinimumIndentStrict(document.selection.Text);
 64 		logger.log("minimumIndent:" + minimumIndent);
 65 		
 66 		// 「最小インデント」を「最小インデント+行コメント」に置換
 67 		var indentReplacer = new RegExp("(^|\r\n|\r|\n)(?![\r\n]?$)(" + minimumIndent + ")", "g");
 68 		if(logger.available()) {
 69 			logger.log("indentReplacer:" + JseeUtil.toString(indentReplacer));
 70 		}
 71 		document.selection.Text = document.selection.Text.replace(indentReplacer, "$1$2" + LineComment1);
 72 		
 73 		// 選択状態を復元
 74 		if(topX != 1) {
 75 			document.selection.SetActivePoint(eePosLogical, topX + LineComment1.length, topY);
 76 		} else {
 77 			document.selection.SetActivePoint(eePosLogical, 1, topY);
 78 		}
 79 		if(bottomX != 1) {
 80 			document.selection.SetActivePoint(eePosLogical, bottomX + LineComment1.length, bottomY, true);
 81 		} else {
 82 			document.selection.SetActivePoint(eePosLogical, 1, bottomY, true);
 83 		}
 84 	}
 85 	
 86 	// コメント挿入・削除は元々再描画されないため、最後まで再描画を有効にはしない
 87 	Redraw = redraw;
 88 })();
 89