◀マクロトップへ
  • 593 コメントアウトマクロ
  • [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;
    }