[593]
コメントアウトマクロ
sakana
2015年08月10日 02:17
コードの後ろのコメントを解除しない, 処理を一度でUndoできるマクロです。 [591]phodra氏のコメントマクロを参考にさせていただきました。 ----------------------------------- CommentAdd.js ----------------------------------- var CmtLen; var CmtStr; main(); function main(){ // エディタがビューモード(読み取り専用)なら終了。 //if ( Editor.ExpandParameter("${R?r$:$:$}") == "r") return; // 拡張子別にコメントステートメントを定義 var comment = new Array(); comment["cpp"] = "//"; comment["c"] = "//"; comment["h"] = "//"; comment["js"] = "//"; comment["java"] = "//"; comment["php"] = "//"; comment["uws"] = "//"; comment["mac"] = "//"; comment["ppa"] = "//"; comment["vbs"] = "'"; comment["bas"] = "'"; comment["frm"] = "'"; comment["cls"] = "'"; comment["vb"] = "'"; comment["cgi"] = "#"; comment["pl"] = "#"; comment["pm"] = "#"; comment["asm"] = ";"; comment["ini"] = ";"; comment["inf"] = ";"; comment["cnf"] = ";"; comment["conf"] = ";"; comment["tex"] = "%"; comment["cmd"] = "REM "; comment["bat"] = "REM "; comment["txt"] = " "; comment["noext"] = " "; // ちらつき防止 Editor.SetDrawSwitch(0); //拡張子を切り出し var fname = Editor.ExpandParameter("$f"); var ext = fname.substring( fname.lastIndexOf(".") + 1); ext = ext==fname? "noext": ext.toLowerCase(); // 登録されていない拡張子であれば終了。 if( comment[ext] == null ){ Editor.InfoMsg("マクロ未登録拡張子です。"); return; } CmtStr = comment[ext]; CmtLen = CmtStr.length; Editor.AddRefUndoBuffer(); // これ以降、Undoバッファをまとめる switch(Editor.IsTextSelected()) { // 非選択状態 case 0: // ロジック座標を取得 // 選択範囲がないのでレイアウトから変換する必要はない var l = parseInt(Editor.ExpandParameter("$y")); var c = parseInt(Editor.ExpandParameter("$x")); Editor.MoveCursor( l, 1, 0); Editor.InsText(CmtStr); Editor.MoveCursor( l, (c+CmtLen), 0); break; // 選択状態 case 1: //選択論理行の取得 var lay_fl = Editor.GetSelectLineFrom(); var lay_tl = Editor.GetSelectLineTo(); var fl = Editor.LayoutToLogicLineNum( lay_fl ); var tl = Editor.LayoutToLogicLineNum( lay_tl ); for(var i = fl; i <= tl; i++){ Editor.Jump(i,1); Editor.InsText(CmtStr); } // 選択範囲を復元(行だけ) Editor.GoLineEnd(); Editor.MoveCursor( fl, 1, 1); break; // ブロック選択状態 case 2: break; default: /* ignore */ break; } Editor.SetUndoBuffer(); // ここでまとめてUndoバッファのリストに登録される // 描画フラグを戻してから再描画 Editor.SetDrawSwitch(1); Editor.ReDraw(0); } ----------------------------------- CommentRemove.js ----------------------------------- var S_Buf = "dummy"; var CmtLen; var CmtStr; //Editor.InfoMsg(S_Buf); main(); function main(){ var i; // エディタがビューモード(読み取り専用)なら終了。 //if ( Editor.ExpandParameter("${R?r$:$:$}") == "r") return; // 拡張子別にコメントステートメントを定義 var comment = new Array(); comment["cpp"] = "//"; comment["c"] = "//"; comment["h"] = "//"; comment["js"] = "//"; comment["java"] = "//"; comment["php"] = "//"; comment["uws"] = "//"; comment["mac"] = "//"; comment["ppa"] = "//"; comment["vbs"] = "'"; comment["bas"] = "'"; comment["frm"] = "'"; comment["cls"] = "'"; comment["vb"] = "'"; comment["cgi"] = "#"; comment["pl"] = "#"; comment["pm"] = "#"; comment["asm"] = ";"; comment["ini"] = ";"; comment["inf"] = ";"; comment["cnf"] = ";"; comment["conf"] = ";"; comment["tex"] = "%"; comment["cmd"] = "REM "; comment["bat"] = "REM "; // このマクロはスペースはコメントと見做せない comment["txt"] = " "; comment["noext"] = " "; // ちらつき防止 Editor.SetDrawSwitch(0); //拡張子を切り出し var fname = Editor.ExpandParameter("$f"); var ext = fname.substring( fname.lastIndexOf(".") + 1); ext = ext==fname? "noext": ext.toLowerCase(); // 登録されていない拡張子であれば終了。 if( comment[ext] == null ){ Editor.InfoMsg("マクロ未登録拡張子です。"); return; } CmtStr = comment[ext]; CmtLen = CmtStr.length; Editor.AddRefUndoBuffer(); // これ以降、Undoバッファをまとめる switch(Editor.IsTextSelected()) { // 非選択状態 case 0: // ロジック座標を取得 // 選択範囲がないのでレイアウトから変換する必要はない var l = parseInt(Editor.ExpandParameter("$y")); var c = parseInt(Editor.ExpandParameter("$x")); var cmtPos = LineCmtDel(l); if((c>cmtPos)&&(cmtPos==0)){ if(c>(cmtPos + CmtLen)){ c = c - CmtLen; }else{ c = cmtPos; } } Editor.MoveCursor( l, c, 0); break; // 選択状態 case 1: var lay_fl = Editor.GetSelectLineFrom(); var lay_tl = Editor.GetSelectLineTo(); // レイアウト座標をロジック座標に変換 // 選択位置のロジック座標を取得する関数はない? var fl = Editor.LayoutToLogicLineNum( lay_fl ); var tl = Editor.LayoutToLogicLineNum( lay_tl ); for(i = fl; i <= tl; i++){ LineCmtDel(i); } // 選択範囲を復元(行だけ) Editor.GoLineEnd(); Editor.MoveCursor( fl, 1, 1); break; // ブロック選択状態 case 2: break; default: /* ignore */ break; } Editor.SetUndoBuffer(); // ここでまとめてUndoバッファのリストに登録される // 描画フラグを戻してから再描画 Editor.SetDrawSwitch(1); Editor.ReDraw(0); } function LineCmtDel(l_no){ var nUnSpace; Editor.Jump(l_no,1); S_Buf = Editor.GetLineStr(l_no); nUnSpace = S_Buf.search(/[^\s]/); if(nUnSpace >= 0){ S_Buf = S_Buf.substr(nUnSpace,CmtLen); // nUnSpaceからコメント文字数分取得 } if(S_Buf == CmtStr){ Editor.MoveCursor(l_no,nUnSpace+1,0); for(var i=0;i<CmtLen;i++){ Editor.Delete(); } return nUnSpace; } return 0; }