2015/1/1 (木) 22:28:54 返信 削除
[590] コメントマクロ改変

折り返しが有効でもやってくれるものが欲しかったので作りました。
何番煎じか分かりませんが、せっかくなので一応投稿します。

-----------------------------------
CommentAdd.js
-----------------------------------
/*
 * @file   CommentAdd.js
 * @brief  選択範囲、もしくはカーソル行をコメントアウトするサクラエディタマクロ
 * @author phodra
 * 
 * maru氏作成の同様のマクロを改変したもの。
 *  http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F64
 * 
 * ・各折り返しモード対応。
 * ・検索マークがちらつかない。
 * ・終了時に選択範囲を復元する。
 * 
 */
(function(){

    // エディタがビューモード(読み取り専用)なら終了。
    if( Editor.ExpandParameter("${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"] = " ";

    // 拡張子を切り出し
    var fname = Editor.ExpandParameter("$f");
    var ext = fname.substring( fname.lastIndexOf(".") + 1);
    ext = ext==fname? "noext": ext.toLowerCase();
    // 登録されていない拡張子であれば終了。
    if( comment[ext] == null ) return;

    // ちらつき防止
    Editor.SetDrawSwitch(0);

    // 選択モード(この変数は復元する際にも使用する)
    var selmode = Editor.IsTextSelected();
    if( selmode ){ // 選択状態
        // レイアウト座標を取得
        var lay_fl = Editor.GetSelectLineFrom();
        var lay_tl = Editor.GetSelectLineTo();
        // レイアウト座標をロジック座標に変換
        //  ExpandParameterではカーソル位置しか分からないので……
        var fl = Editor.LayoutToLogicLineNum( lay_fl );
        var tl = Editor.LayoutToLogicLineNum( lay_tl );
        var fc = Editor.LineColumnToIndex( lay_fl, Editor.GetSelectColmFrom() );
        var tc = Editor.LineColumnToIndex( lay_tl, Editor.GetSelectColmTo() );

        // 必要な範囲を選択
        Editor.MoveCursor( fl, 1, 0);
        //  行選択でマクロに入った場合、一つ上の行までにする
        Editor.MoveCursor( tc==1? tl-1: tl, 1, 1);
        // よく分からんけど必要、別にロジック指定でなくて良いっぽい
        Editor.GoLineEnd_Sel();

        // 行頭部分にコメントステートメントを挿入
        // 1001 0100
        Editor.ReplaceAll("^", comment[ext], 0x94);

        // マークを消す
        Editor.CancelMode();
        Editor.SearchClearMark();

        // 選択範囲を復元
        Editor.MoveCursor( fl, fc+comment[ext].length, 0);
        Editor.MoveCursor( tl, tc==1? tc: tc+comment[ext].length, selmode);
    }else{ // 選択していない
        // ロジック座標を取得
        //  選択範囲がないのでレイアウトから変換する必要はない
        var l = parseInt(Editor.ExpandParameter("$y"));
        var c = parseInt(Editor.ExpandParameter("$x"));
 
        // 行頭に移動
        Editor.MoveCursor( l, 1, 0);
        // コメントステートメントを挿入
        //  どうせ一回だけなのでReplaceはおおげさだ
        Editor.InsText(comment[ext]);
 
        // マークを消す
        Editor.SearchClearMark();
        // 位置を復元
        Editor.MoveCursor( l, c+comment[ext], selmode);
    }

    // 描画フラグを戻してから再描画
    Editor.SetDrawSwitch(1);
    Editor.ReDraw(0);

})();

-----------------------------------
CommentRemove.js
-----------------------------------
/*
 * @file   CommentRemove.js
 * @brief  選択範囲、もしくはカーソル行のコメントを外すサクラエディタマクロ
 * @author phodra
 * 
 * maru氏作成の同様のマクロを改変したもの。
 *  http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F64
 * 
 * ・各折り返しモード対応。
 * ・検索マークがちらつかない。
 * ・終了時に選択範囲を復元する。
 * 
 */
(function(){

    // エディタがビューモード(読み取り専用)なら終了。
    if( Editor.ExpandParameter("${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 ) return;

    // 置換対象にする部分の正規表現
    //  なぜかエスケープしないといけない
    var target = "\(\^\\s\*\?\)" + comment[ext];
    // 選択モード(この変数は復元する際にも使用する)
    var selmode = Editor.IsTextSelected();
 
    if( selmode ){ // 選択状態
        // レイアウト座標を取得
        var lay_fl = Editor.GetSelectLineFrom();
        var lay_tl = Editor.GetSelectLineTo();
        // レイアウト座標をロジック座標に変換
        //  ExpandParameterではカーソル位置しか分からないので……
        var fl = Editor.LayoutToLogicLineNum( lay_fl );
        var tl = Editor.LayoutToLogicLineNum( lay_tl );
        var fc = Editor.LineColumnToIndex( lay_fl, Editor.GetSelectColmFrom() );
        var tc = Editor.LineColumnToIndex( lay_tl, Editor.GetSelectColmTo() );

        // 範囲復元時にずらす数
        //  対象の行であればコメントの字数分
        //  行頭にコメントがなければゼロ
        var gap_f = Editor.GetLineStr(fl).match(target)? comment[ext].length: 0;
        //  終了位置は、行選択でマクロに入った場合もゼロ
        var gap_t = Editor.GetLineStr(tl).match(target) || tc>0? comment[ext].length: 0;

        // 必要な範囲を行選択
        Editor.MoveCursor( fl, 1, 0);
        //  行選択でマクロに入った場合、一つ上の行までにする
        Editor.MoveCursor( tc==1? tl-1: tl, 1, 1);
        // よく分からんけど必要、別にロジック指定でなくて良いっぽい
        Editor.GoLineEnd_Sel();

        // 行頭のコメントステートメントを削除
        //  bit flag:1001 0100
        Editor.ReplaceAll(target, "$1", 0x94);

        // マークを消す
        Editor.CancelMode();
        Editor.SearchClearMark();

        // 選択範囲を復元
        Editor.MoveCursor( fl, fc-gap_f, 0);
        Editor.MoveCursor( tl, tc-gap_t, selmode);
    }else{ // 選択していない
        // ロジック座標を取得
        //  選択範囲がないのでレイアウトから変換する必要はない
        var l = parseInt(Editor.ExpandParameter("$y"));
        var c = parseInt(Editor.ExpandParameter("$x"));
        // 範囲復元時にずらす数
        var gap = Editor.GetLineStr(0).match(target)? comment[ext].length: 0;

        // 行選択
        //  bit flag:1001
        Editor.GoLineTop(0x9);
        Editor.GoLineEnd_Sel();
 
        // 行頭のコメントステートメントを削除
        //  bit flag:1001 0100
        Editor.ReplaceAll(target, "$1", 0x94);
 
        // マークを消す
        Editor.CancelMode();
        Editor.SearchClearMark();

        // 位置を復元
        Editor.MoveCursor( l, c-gap, selmode);
    }

    // 描画フラグを戻してから再描画
    Editor.SetDrawSwitch(1);
    Editor.ReDraw(0);

})();
phodra
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0


2015/1/3 (土) 17:32:34 返信 削除
[591] Re:コメントマクロ改変

ちょっと修正。
Editor.ReplaceAll() を使わない仕様になりました。
これにより置換中のプログレスがなくなり、ハイライトも消えません。

-----------------------------------
CommentAdd.js
-----------------------------------
/*
 * @file   CommentAdd.js
 * @brief  選択範囲、もしくはカーソル行をコメントアウトするサクラエディタマクロ
 * @author phodra
 *
 * maru氏作成の同様のマクロを改変したもの。
 *  http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F64
 *
 * ・各折り返しモード対応。
 * ・検索マークがちらつかない。
 * ・終了時に選択範囲を復元する。
 *
 *** 2015/01/03 0.2  Editor.ReplaceAll() を使用しない
 *** 2015/01/01 0.1  Editor.ReplaceAll() を使用するバージョン
 *
 */

(function(){

    // エディタがビューモード(読み取り専用)なら終了。
    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"] = " ";

    // 拡張子を切り出し
    var fname = Editor.ExpandParameter("$f");
    var ext = fname.substring( fname.lastIndexOf(".") + 1);
    ext = ext==fname? "noext": ext.toLowerCase();
    // 登録されていない拡張子であれば終了。
    if( comment[ext] == null ) return;

    // ちらつき防止
    Editor.SetDrawSwitch(0);

    // 選択モード(この変数は復元する際にも使用する)
    var selmode = Editor.IsTextSelected();
    if( selmode ){ // 選択状態
        // レイアウト座標を取得
        var lay_fl = Editor.GetSelectLineFrom();
        var lay_tl = Editor.GetSelectLineTo();
        // レイアウト座標をロジック座標に変換
        //  選択位置のロジック座標を取得する関数はない?
        var fl = Editor.LayoutToLogicLineNum( lay_fl );
        var tl = Editor.LayoutToLogicLineNum( lay_tl );
        var fc = Editor.LineColumnToIndex( lay_fl, Editor.GetSelectColmFrom() );
        var tc = Editor.LineColumnToIndex( lay_tl, Editor.GetSelectColmTo() );
        //  行選択でマクロに入った場合、一つ上の行までにする
        var endl = tc==1? tl-1: tl;
 
        // 範囲内の行を配列としてとる
        var lines = new Array();
        var str = "";
        for( var i=fl; i<=endl; i++ ){
            str = Editor.GetLineStr(i)
            lines.push( comment[ext] + str );
        }
 
        // 必要な範囲を行選択
        Editor.MoveCursor( fl, 1, 0);
        Editor.MoveCursor( endl, str.length+1, 1);

        // 選択範囲を上書き
        Editor.InsText( lines.join("") );

        // 選択範囲を復元
        Editor.MoveCursor( fl, fc+comment[ext].length, 0);
        Editor.MoveCursor( tl, tc==1? tc: tc+comment[ext].length, selmode);
    }else{ // 選択していない
        // ロジック座標を取得
        //  選択範囲がないのでレイアウトから変換する必要はない
        var l = parseInt(Editor.ExpandParameter("$y"));
        var c = parseInt(Editor.ExpandParameter("$x"));

        // 行頭に移動
        Editor.MoveCursor( l, 1, 0);
        // コメントステートメントを挿入
        Editor.InsText(comment[ext]);

        // 位置を復元
        Editor.MoveCursor( l, c+comment[ext], selmode);
    }

    // 描画フラグを戻してから再描画
    Editor.SetDrawSwitch(1);
    Editor.ReDraw(0);

})();

-----------------------------------
CommentRemove.js
-----------------------------------
/*
 * @file   CommentRemove.js
 * @brief  選択範囲、もしくはカーソル行のコメントを外すサクラエディタマクロ
 * @author phodra
 * 
 * maru氏作成の同様のマクロを改変したもの。
 *  http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F64
 * 
 * ・各折り返しモード対応。
 * ・検索マークがちらつかない。
 * ・終了時に選択範囲を復元する。
 * 
 *** 2015/01/03 0.2  Editor.ReplaceAll() を使用しない
 *** 2015/01/01 0.1  Editor.ReplaceAll() を使用するバージョン
 * 
 */
(function(){

    // エディタがビューモード(読み取り専用)なら終了。
    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 ) return;

    // 置換対象にする部分の正規表現
    //  なぜかエスケープしないといけない
    var uncmt = new RegExp("\(\^\\s\*\?\)" + comment[ext]);
    // 選択モード(この変数は復元する際にも使用する)
    var selmode = Editor.IsTextSelected();
 
    if( selmode ){ // 選択状態
        // レイアウト座標を取得
        var lay_fl = Editor.GetSelectLineFrom();
        var lay_tl = Editor.GetSelectLineTo();
        // レイアウト座標をロジック座標に変換
        //  選択位置のロジック座標を取得する関数はない?
        var fl = Editor.LayoutToLogicLineNum( lay_fl );
        var tl = Editor.LayoutToLogicLineNum( lay_tl );
        var fc = Editor.LineColumnToIndex( lay_fl, Editor.GetSelectColmFrom() );
        var tc = Editor.LineColumnToIndex( lay_tl, Editor.GetSelectColmTo() );
        //  行選択でマクロに入った場合、一つ上の行までにする
        var endl = tc==1? tl-1: tl;

        // 範囲内の行を配列としてとる
        var lines = new Array();
        var reped = new Array();
        var str = "";
        var cnt = 0;
        for( var i=fl; i<=endl; i++ ){
            str = Editor.GetLineStr(i);
            var rep = str.replace( uncmt, "$1" );
            lines.push( str );
            reped.push( rep );
            if( str == rep ) cnt++;
        }

        // 処理していない行が全体の行数に等しいときは何もしない
        if( cnt < reped.length ){
            // 必要な範囲を行選択
            Editor.MoveCursor( fl, 1, 0);
            Editor.MoveCursor( endl, str.length+1, 1);
 
            // 選択範囲を上書き
            Editor.InsText( reped.join("") );

            // 範囲復元時のX位置
            //  コメントステートメントより後ならコメントステートメントの字数分ずらす
            //  コメントステートメントの中ならコメントステートメントが現れた位置
            //  コメントステートメントより前ならそのままの位置
            var idx = lines[0].indexOf( comment[ext] );
            var gap_f =
                fc>idx+comment[ext].length? fc-comment[ext].length:
                fc>idx+1? idx+1:
                fc;
            idx = lines[lines.length-1].indexOf( comment[ext] );
            var gap_t =
                tc>idx+comment[ext].length? tc-comment[ext].length:
                tc>idx+1? idx+1:
                tc;
            // 選択範囲を復元
            Editor.MoveCursor( fl, gap_f, 0);
            Editor.MoveCursor( tl, gap_t, selmode);
        }
    }else{ // 選択していない
        // ロジック座標を取得
        //  選択範囲がないのでレイアウトから変換する必要はない
        var l = parseInt(Editor.ExpandParameter("$y"));
        var c = parseInt(Editor.ExpandParameter("$x"));
        // 対象行の文字列を取得
        var str = Editor.GetLineStr(l);
        // コメントステートメントを除去した文字列
        var rep = str.replace( uncmt, "$1" );

        if( str != rep ){
            // 行選択
            Editor.MoveCursor( l, 1, 0);
            Editor.MoveCursor( l, str.length+1, 1);

            // 置換した文字列で上書き
            Editor.InsText( rep );

            // 復元時のカーソルX位置
            //  コメントステートメントより後ならコメントステートメントの字数分ずらす
            //  コメントステートメントの中ならコメントステートメントが現れた位置
            //  コメントステートメントより前ならそのままの位置
            var idx = str.indexOf( comment[ext] );
            var gap =
                c>idx+comment[ext].length? c-comment[ext].length:
                c>idx+1? idx+1:
                c;
            // カーソル位置を復元
            Editor.MoveCursor( l, gap, selmode);
        }
    }

    // 描画フラグを戻してから再描画
    Editor.SetDrawSwitch(1);
    Editor.ReDraw(0);

})();
phodra
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0

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