2015/8/10 (月) 02:17:02 返信 削除
[593] コメントアウトマクロ

コードの後ろのコメントを解除しない,
処理を一度で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;
}
sakana
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0; Sleipnir/2.9.19) like Gecko

[▼次のスレッド]
INCM/CMT
Cyclamen v3.81