[590]
コメントマクロ改変
phodra
折り返しが有効でもやってくれるものが欲しかったので作りました。
何番煎じか分かりませんが、せっかくなので一応投稿します。
-----------------------------------
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);
})();