コメントマーク付け外し

提供:MeryWiki
2018年10月30日 (火) 04:51時点におけるSukemaru (トーク | 投稿記録)による版 (→‎sukemaru 版: 「sukemaru 版」に「おまけ」の節を追加)
ナビゲーションに移動 検索に移動

手石 版 (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 の定義に "> " などの引用マークを指定すると、引用マークの付けはずしにも利用できます。


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

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

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

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


使用例

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

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

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

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

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

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

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

※変数 indent = false; にしても行頭にあるコメントマーク(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(アイコン入り)」

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

// ●字下げされたコメントマークも削除 (true:する / false:しない)
var indent = true;
  // ※※ false なら 挿入/削除 する位置は「常に行頭」のみ ※※ 最優先フラグ ※※ (例1 の使い方)
  // true ならコメントマークを挿入する位置は addByIndent フラグで決定する

// ▲コメントマークを挿入する位置を字下げにあわせるか (true:あわせる / false:あわせない)
var addByIndent = true;
  // false なら「常に先頭」にコメントマークを挿入する  ※従来版では挿入パターンは false のみ
  // true なら字下げ位置にあわせてコメントマークを挿入する (例2 の使い方ができる)
  // ※ いずれの場合でも、indent = false なら addByIndent = false となる

// ■コメントアウトとアンコメントで別々の先頭位置を使うか (true:使う / false:使わない)
var independent = true;
  // false なら追加と削除で同じ判定基準の先頭位置検出をする
  // true なら追加と削除で別々の判定基準の先頭位置検出をする (例3 の使い方)
  // ※ いずれの場合でも、indent = false または addByIndent = false なら independent = false となる

// ▼sukemaru版 独自拡張の推奨設定 (例3の動作)
// indent = addByIndent = independent = true;

/* ここから「コメントマーク付け外し」(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 "'";
    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 );
// 選択範囲の末尾が行頭にあるときの調整
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.SetActivePoint( mePosLogical, bx, by );
  s.SetAnchorPoint( mePosLogical, tx, ty );
}
// 拡張した選択範囲に復帰する
else {	// ( ty < by )
  s.SetActivePoint( mePosLogical, 1, by + 1 );
  s.SetAnchorPoint( mePosLogical, 1, ty );
}

function AddDeleteComment( arg1 ) {
// 選択範囲の各行の字下げ量をチェックして、最少の字下げ位置にあわせてコメントアウトする
  var a = arg1.split( "\n" );		// 選択範囲を行単位に分解して配列 a に
  var b = [];	// 各行の行頭の空白文字数を格納する => 削除の基準
  var c = [];	// 配列 b をソートして最少の空白文字数を調べる => 追加の基準
  var d = [];	// 非コメント行の空白文字数を格納する => 追加の基準

  // 選択範囲内の各行の行頭の空白文字数を取得 => 配列 b c に(最小値は 0 以上)
  for ( var i = 0; i < a.length; i ++ ) {
    var id = a[i].indexOf( a[i].match( /[^ \t]/ ) );	// 空白以外の文字の最初の出現位置
    // 空白行では -1 か null が返されるはず?(←ソートのジャマになる)なのでデタラメな数値にしておく
    id = ( id < 0 || id == null) ? 1000000 : id;
    b.push( id );  c.push( id );
    // 非コメント行の字下げ量を選り分けて取得 => 配列 d に
    var _id = ( a[i].substr( b[i], comment.length ) == comment ) ? 1000000 : id;
    d.push( _id );
  }
  c.sort( CompareForSort );
  d.sort( CompareForSort );

  // 各行をコメントアウト/アンコメント処理
  for ( var i = 0; i < a.length; i ++ ) {
    if ( a[i].match( /^[ \t]*$/ ) )	// 空白行はスルー
      continue;
    // 行頭の空白文字の直後がコメントマークかチェックして、コメントマークを削除/追加
    if ( a[i].substr( b[i], comment.length ) == comment ) {
      var uncomment = a[i].substr( 0, b[i] ) + a[i].substr( b[i] + comment.length );
      a[i] = ( indent || b[i] == 0 ) ? uncomment : comment + a[i];
    }
    else {
      var blank = ( independent ) ? a[i].slice( 0, d[0] ) : a[i].slice( 0, c[0] );
      var str = ( independent ) ? a[i].slice( d[0] ) : a[i].slice( c[0] );
      a[i] = ( indent && addByIndent ) ? blank + comment + str : comment + a[i];
    }
  }
  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 -->
スポンサーリンク