コメントマーク付け外し

提供: MeryWiki
ナビゲーションに移動 検索に移動

手石 版 (2014/03)[編集]

コメントマークの付け外しをするマクロです。
js 以外の拡張子に対応させる時は、最後の関数に追加してください。

更新履歴[編集]

  • 2013/03/28
    • 無題のときに対応しました。
  • 2014/03/22
    • できるだけ短くしてみました。

ソースコード[編集]

// コメントマーク.js
// 行頭コメントマークを付けたり外したり。
// 空白文字の後ろにあっても外す。つけるときは行頭に。

var sel = Editor.ActiveDocument.Selection;
var ty = sel.GetTopPointY( mePosLogical );
var bx = sel.GetBottomPointX( mePosLogical );
var by = sel.GetBottomPointY( mePosLogical );
if ( bx == 1 && ty != by ){ by--; };
sel.SetActivePoint( mePosLogical, 1, ty, false );
sel.SetActivePoint( mePosLogical, 1, by+1, true );

var mark = commentMark();
var reg = new RegExp( "^([ \t]*" + mark + "\\s?)?(?=.)", "mg" );
mark += " ";

sel.Text = sel.Text.replace( reg, function( s0, s1 ){ return ( s1 == undefined )? mark : "" } );

function commentMark(){
	switch( Document.Mode.toLowerCase() ){
	case "text" : return "//";
	case "javascript" : return "//";
	case "tex" : return "%";
	case "ruby" : return "#";
	default : return Prompt( "コメントマーク?", "//");
	};
};

masme 版[編集]

マクロ「テキスト整形」の「行頭 // を挿入/削除」を独立・改造したものです。
論理行頭にコメント文字が有れば削除(アンコメント)し、無ければ挿入(コメントアウト)します。

  • 空白行(改行/半角空白/水平タブのみの行)はコメントアウトしないようにしました。
  • 初期設定では、インデントされたコメント文字には対応していません。
    「indent」変数を「false」から「true」に書き換えると、手石 版のように行頭空白後のコメント文字も削除するようになります。
    インデントへの対応は、手石 版と同様に削除限定です。挿入するときは論理行頭になります。
  • 編集モードによる定義切替は、マクロ「Eclipse風コメントアウト」を参考にしました。

更新履歴[編集]

2019/06/01
  • コメント文字を付け外しした次の行に変更行の印がつかないようにした。
    末尾の改行(次の行頭)を範囲に含めず書き換えるように変更。
2016/02/28
  • 編集モードによる定義切替が正常に機能していないミスを修正。
2015/02/14
  • 特殊文字があると誤動作する不具合を再修正。
2015/02/14
  • 「行コメント文字の定義」に正規表現の特殊文字があると誤動作する不具合を修正。
  • 矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正。
  • テキストの処理方法を変更。
2014/02/22
  • 初版公開。

ソースコード[編集]

//■行コメントのアン・アウト
// 2014/02/11-2019/06/01
//・行頭にコメント文字が有れば削除し、無ければ挿入する。空白行には挿入しない。

//■行コメント文字の定義 ●初期値="//"
var comment = "//";
//■インデントされたコメント文字も削除(true:する/false:しない) ●初期値=false
var indent = false ? "[ \t]*" : "";

//▼編集モードによる定義切替
comment = (function(){
  switch (Document.Mode.toLowerCase()) {
  case "bat":
    return "::";
  case "c#":
  case "c++":
  case "javascript":
    return "//";
  case "ini":
  case "python":
  case "ruby":
    return "#";
  case "visualbasic":
  case "vbscript":
    return "'";
  default:
    return comment;
  }
}());

var Sel = Document.Selection;
var ty = Sel.GetTopPointY(mePosLogical);
var by = Sel.GetBottomPointY(mePosLogical);
var bx = Sel.GetBottomPointX(mePosLogical);
var nn =(Sel.Text.match(/\n/g)||[]).length;
if (bx===1 && nn<=by-ty && nn) by--; //末尾改行対策
Sel.SetActivePoint(mePosLogical, 1, by);
Sel.EndOfLine(false, mePosLogical);
Sel.SetAnchorPoint(mePosLogical, 1, ty);
Sel.Text = Sel.Text.replace(new RegExp(
  "^("+indent+")"+comment.replace(/[$()*+.?[\\\]^{|}]/g,"\\$&"); //コメント行
 +"|^(?![ \t]*$)" ,"gm") //空白行でない行頭
 ,function($0,$indent){return $0 ? $indent : comment}
);
Sel.SetActivePoint(mePosLogical,1,by+1);
Sel.SetAnchorPoint(mePosLogical,1,ty);
スポンサーリンク