コメントマーク付け外し

提供: 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風コメントアウト」を参考にしました。

更新履歴[編集]

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

ソースコード[編集]

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

//■行コメント文字の定義 ●初期値="//"
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 br =(Sel.Text.match(/\n/g)||[]).length;
if (bx===1 && by-ty===br && br) by--; //下端行頭を含めないよう対策
Sel.SetActivePoint(mePosLogical,1,by+1);
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);

sukemaru 版[編集]

行頭のコメントマーク付けはずし

  • masme 版の設定用変数 indent = true の状態(インデントされたコメントマークを削除できる)を下地として、選択範囲内のもっとも字下げの少ない位置にあわせてコメントマークを付けられます。

※コードブロックのコメントアウトのさいに、各行の先頭位置が少しだけ分かりやすくなります。

  • 空白行(タブ文字/半角スペースのみの行と、完全な空行)は無視します。
  • 編集モードによる定義切替は、「コメントマーク付け外し」(masme版 2016/02/28)まま。
  • 変数 comment の定義に "> " などの引用マークを指定すると、引用マークの付けはずしにも利用できます。


注意事項 (仕様上の制限) ▼

※字下げルールが「半角スペースのみ または タブ文字のみである」か、混在する場合には「半角スペースとタブ文字の出現順序が同じである」という前提になっています。タブ文字ひとつを半角スペースひとつと同じように数え、表示上の幅で評価しません。

半角スペースとタブ文字が不規則に混在しているなら、変数 indent = 0 or 1 にして使ってください。従来版と同様に行の先頭でコメントアウトします。

※行コメント文字の変数 comment = "hoge"; の 先頭が空白文字 だとアンコメントできません。


使用例

例1. 5行まとめて選択すると…

※変数 indent = 1; のばあい (従来版とおなじ動作)
//comment 1       =>    |comment 1           =>    |//comment 1    
  //comment 2     =>    |  comment 2         =>    |//  comment 2  
      hoge        =>    |//      hoge        =>    |      hoge     
        fuga      =>    |//        fuga      =>    |        fuga   
          piyo    =>    |//          piyo    =>    |          piyo

例2. 下3行だけを選択すれば…

※変数 indent = 2 or 3; (sukemaru版 独自拡張)
//comment 1       =>    |//comment 1         =>    |//comment 1    
  //comment 2     =>    |  //comment 2       =>    |  //comment 2  
      hoge        =>    |      //hoge        =>    |      hoge     
        fuga      =>    |      //  fuga      =>    |        fuga   
          piyo    =>    |      //    piyo    =>    |          piyo

例3. 5行まとめて選択しても、コメントアウトとアンコメントで別々の先頭位置を使うことができる

※変数 indent = 3; (sukemaru版 独自拡張)
//comment 1       =>    |comment 1           =>    |//comment 1    
  //comment 2     =>    |  comment 2         =>    |//  comment 2  
      hoge        =>    |      //hoge        =>    |      hoge     
        fuga      =>    |      //  fuga      =>    |        fuga   
          piyo    =>    |      //    piyo    =>    |          piyo

例4. 例4. 一応、こういうこともできる

※変数 indent = 4; (sukemaru版 独自拡張)
//comment 1       =>    |comment 1           =>    |//comment 1    
  //comment 2     =>    |  comment 2         =>    |  //comment 2  
      hoge        =>    |      //hoge        =>    |      hoge     
        fuga      =>    |        //fuga      =>    |        fuga   
          piyo    =>    |          //piyo    =>    |          piyo

例5. コードブロックをまとめてコメントアウトするなら「引用符/コメント引用の追加)」マクロか「行の先頭に貼り付け」マクロのほうがよい...

※変数 indent = 0; にしても行頭にあるコメントマーク(e.g. 1行め)だけは削除されるので不適当
※以下の例は「引用符/コメント」マクロの 「// JS・C コメント」と「1つ削除」
//comment 1       =>    |// //comment 1       =>    |//comment 1    
  //comment 2     =>    |//   //comment 2     =>    |  //comment 2  
      hoge        =>    |//       hoge        =>    |      hoge     
        fuga      =>    |//         fuga      =>    |        fuga   
          piyo    =>    |//           piyo    =>    |          piyo

ソースコード[編集]


ダウンロード: 「行コメント.zip(アイコン入り)」(2018/11/02)

#title = "行コメント"
#tooltip = "コメントマーク付けはずし"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",215
// 行コメント(sukemaru版)2018/10/25 - 2018/11/01


// ●字下げされたコメントマークも削除するか? (0: しない / 1 - 4: する)
var indent = 3;
  // indent = 0 なら 追加/削除 する位置は「常に行頭」のみ
  //  ※ 1 ~ 4 なら行の先頭以外のコメントマークも削除する。追加する位置は以下のとおり。
  // indent = 1 なら「常に先頭」にコメントマークを追加する(例1.の使い方 ※従来版とおなじ挿入パターン)
  // indent = 2 なら追加と削除で同じ判定基準の先頭位置検出をする(例2.の使い方ができる)
  // indent = 3 なら追加と削除で別々の判定基準の先頭位置検出をする(例3.の使い方)
  // indent = 4 なら「常に各行の字下げ位置」にあわせてコメントマークを追加する(例4.の使い方)


/* ここから「コメントマーク付け外し」(masme版 2016/02/28)より流用 */ 
// ◆行コメント文字の定義  ●初期値="//"
var comment = "// ";
  // ※「var comment = "> ";」にするか、下の定義切替ブロックに「case "text": return "> ";」 を追加すると「> 引用マーク」の付けはずしにもなる (sukemaru)

// ▼編集モードによる定義切替
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 "'";
    //case "text":
    //  return "> ";
    default:
      return comment;
  }
} )();
/* ここまで「コメントマーク付け外し」(masme版 2016/02/28)より流用 */ 

var s = document.selection;
// 選択範囲を取得
var tx = s.GetTopPointX( mePosLogical );
var ty = s.GetTopPointY( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
var by = s.GetBottomPointY( mePosLogical );
var anc = s.GetAnchorPos();	// 選択範囲の開始位置
var act = s.GetActivePos();	// 選択範囲の終了位置
// 選択範囲の末尾が行頭にあるときの調整
if ( ty != by && bx == 1 )
  by --;
// 選択範囲を拡張
s.SetActivePoint( mePosLogical, 1, by );
s.EndOfLine( false, mePosLogical );
s.SetAnchorPoint( mePosLogical, 1, ty );

// コメントアウト/アンコメント処理
var st = s.Text;
var ad =  AddDeleteComment( st );	
if ( ad != st )		// (処理の前後で変化なしなら undo 履歴に残さない)
  s.Text = ad;
		
// 選択範囲が空白行1行だけなら範囲選択を残さない
if ( s.Text == st && ty == by ) {
  s.SetActivePos( act );
  s.SetAnchorPos( anc );
}
// 拡張した選択範囲に復帰する
else {	// ( ty < by )
  s.SetActivePoint( mePosLogical, 1, by + 1 );
  s.SetAnchorPoint( mePosLogical, 1, ty );
}

function AddDeleteComment( arg1 ) {
  // 選択範囲の各行の字下げ量をチェックして、最小の字下げ位置にあわせてコメントアウトする
  // コメントマークのチェックには正規表現を使っていないので、誤爆はほぼないはず
  // (※変数 comment の先頭が空白文字だとアンコメントできない)

  var id, _id;	// 字下げ量(空白以外の文字の最初の出現位置)
  var a = arg1.split( "\n" );	// 選択範囲を行単位に分解して配列 a に
  var b = [];	// 空の配列(各行の字下げ量 id を格納する)	=> 削除の基準 b[i]
  var c = [];	// 空の配列(最小の字下げ量を調べる)		=> 追加の基準 c[0]
  var d = [];	// 空の配列(非コメント行の字下げ量)		=> 追加の基準 d[0]

  // 選択範囲内の各行の字下げ量を取得	=> 配列 b c d に
  for ( var i = 0; i < a.length; i ++ ) {
    id = a[i].indexOf( a[i].match( /[^ \t]/ ) );

    // 空白行では -1 (sort のジャマ)が返されるはずなのでデタラメな数値にしておく
    // ※ 空白行はコメントアウトしないから数値は大きく
    if ( id < 0 )  id += 1000000;	// 最小値を 0 以上に
    b.push( id );  c.push( id );	// id を配列 b c に格納
    // コメント行の数値もデタラメに	=>  配列 d に格納
    _id = ( a[i].substr( b[i], comment.length ) == comment ) ? 1000000 : id;
    d.push( _id );		// 非コメント行の字下げ量を選り分けて取得
  }
  c.sort( CompareForSort );	// 配列 c を昇順で並びかえ(最小値 c[0] だけ使う)
  d.sort( CompareForSort );	// 配列 d を昇順で並びかえ(最小値 d[0] だけ使う)

  // 各行をコメントアウト/アンコメント処理
  for ( var i = 0; i < a.length; i ++ ) {
    // 空白行(id にデタラメな数値を入れた行)はスキップ
    if ( a[i].match( /^[ \t]*$/ ) )
      continue;

    // 行頭の空白 b[i] の直後がコメントマークかチェック
    if ( a[i].substr( b[i], comment.length ) == comment ) {

      // コメント行なら...
      // (indent>0) またはコメントマークが行頭なら削除する
      // (indent=0) でコメントマークが行頭以外なら行頭にコメントマークを追加する
      var uncomment = a[i].substr( 0, b[i] ) + a[i].substr( b[i] + comment.length );
      a[i] = ( indent != 0 || b[i] == 0 ) ? uncomment :
            /* indent == 0 && b[i] > 0 */   comment + a[i];
    }

    else {	//  非コメント行ならコメントマークを追加する
      // 最少の字下げ量 c[0] にあわせた空白文字の部分
      var blank = ( indent == 4 ) ? a[i].slice( 0, b[i] ) :
                  ( indent == 3 ) ? a[i].slice( 0, d[0] ) :
                  ( indent == 2 ) ? a[i].slice( 0, c[0] ) :
                  /*   else    */   "" ;

      // 空白文字の後ろの文字列部分
                // 各行ごとの字下げ位置にあわせる
      var str = ( indent == 4 ) ? a[i].slice( b[i] ) :
                // 非コメント行の最少の字下げ量にあわせる
                ( indent == 3 ) ? a[i].slice( d[0] ) :
                // 選択範囲内の最少の字下げ量にあわせる
                ( indent == 2 ) ? a[i].slice( c[0] ) :
                /*   else    */   a[i] ;	// 行頭
      // コメントマークを追加
      a[i] = blank + comment + str;
    }
  }
  return a.join( "\n" );
}

 /* 以下の関数は『sort メソッド (Array) (JavaScript) | MSDN』より
  https://msdn.microsoft.com/ja-jp/library/4b4fbfhk%28v=vs.94%29.aspx */ 
function CompareForSort( first, second ) {
// 文字コード昇順 (1, 10, 2, 20) ではなく、数値の大きさ (1, 2, 10, 20) でソート
  if ( first == second )  return 0;
  if ( first < second )  return -1;
  else  return 1;	// ( first > second ) 
}

おまけ[編集]


"/* " と " */" と " * " で複数行のコメントブロックをつくるなら、
カッコで囲う(ポップアップメニューあり)」マクロか「引用符/コメント」マクロで。


  • hoge, fuga, piyo の3行をコメントアウトする
      hoge
        fuga
          piyo
  • カッコで囲う(ポップアップメニューあり)」マクロの「JS コメントアウト2」
つねに行の先頭へコメントマークを挿入します。
/*
 *        hoge
 *          fuga
 *            piyo
 */
  • 引用符/コメント」マクロの「JS コメントアウト2」
字下げされたブロックの先頭位置へコメントマークを挿入します。
      /* 
       * hoge
       *   fuga
       *     piyo
       */

※どちらのマクロもアンコメント機能がありますが、「カッコで囲う」マクロは「引用符/コメント」マクロによって字下げ位置に挿入されたコメントマークを正しく削除できません。


※どちらのマクロも "/* " と " */" だけでコメントアウトすることができます。

また、"<!-- " と " -->" でのコメントアウトとアンコメントもできます。


  • 「カッコで囲う」マクロは選択範囲内を、「引用符/コメント」マクロは選択範囲のある行全体をコメントアウトします。
abcdefghijklmnopqrstuvwxyz

「カッコで囲う」マクロ
abcdefg /* hijklmn */ opqrstuvwxyz
abcdefg <!-- hijklmn --> opqrstuvwxyz

「引用符/コメント」マクロ
/* abcdefghijklmnopqrstuvwxyz */
<!-- abcdefghijklmnopqrstuvwxyz -->
スポンサーリンク