「コメントマーク付け外し」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
sukemaru 版: 説明文を少し修正
Sukemaru (トーク | 投稿記録)
sukemaru 版: 全面改版
109行目: 109行目:


= sukemaru 版 =
= sukemaru 版 =
行頭のコメントマーク付けはずし
「行コメント」マクロ (コメントマーク付けはずし sukemaru版)


* masme 版の設定用変数 indent = true の状態(インデントされたコメントマークを削除できる)を下地として、選択範囲内のもっとも字下げの少ない位置にあわせてコメントマークを付けられます。
'''ダウンロード:''' 「[[ファイル:行コメント.zip|行コメント.zip]](アイコン入り)」(最終更新2019/03/25)
----


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


※コードブロックのコメントアウトのさいに、各行の先頭位置が少しだけ分かりやすくなります。
:コードブロックのコメントアウトのさいに、各行の先頭位置が少しだけ分かりやすくなります。
* 空白行(タブ文字/半角スペースのみの行と、完全な空行)は無視します。
:* 空白行(タブ文字/半角スペースのみの行と、完全な空行)は無視します。
* 編集モードによる定義切替は、「コメントマーク付け外し」(masme版 2016/02/28)まま。
:* 編集モードによる定義切替は、「コメントマーク付け外し」(masme版 2016/02/28)まま。
* 変数 comment の定義に "'''> '''" などの引用マークを指定すると、引用マークの付けはずしにも利用できます。
:* 設定変数 comment の定義に "'''><span style="color:#c0c0c0;">␣</span>'''" などの引用マークを指定すると、引用マークの付けはずしにも利用できます。
 
 
「コメントアウトするときは "'''//<span style="color:#c0c0c0;">␣</span>コメント'''" や "'''><span style="color:#c0c0c0;">␣</span>コメント'''" のようにうしろに半角スペースを入れたいけれど、拾い物のコード内やコピペした文章内の半角スペースなしのコメント行 "'''//コメント'''" や "'''>コメント'''" も手軽にアンコメントしたい」という使い方も想定しています。
:* コメントマークの定義の末尾に「半角スペース×1」がついている状態をデフォルト状態にしてあります(初期値も編集モードごとの個別定義も)。
 
 
選択範囲が1行内の場合は、選択範囲の先頭位置でコメントアウト/アンコメントしますので、'''行の途中からのインラインコメントアウト'''ができます。
:* 選択範囲の先頭が空白文字なら字下げオプションに準じて処理します。
:* 行の途中からの "'''// インラインコメント'''" 部分(1行内)を範囲選択している状態で Ctrl キーを押しながらマクロを実行した場合は、選択範囲の先頭にコメントマークを追加します。
 
 
<div class="warningbox">
このマクロは、以下の外部実行ファイルで機能を拡張できます。<br> マクロライブラリから ZIP ファイルをダウンロードして Mery\Macros フォルダに解凍してください。
* '''pizz 氏作成の "[[GetKeyState.exe(キー状態取得実行ファイル)]]" を Macros フォルダに配置してください。'''
ソースコードは "GetKeyState" を導入している前提で書いています。<br><u> "GetKeyState" を導入しない場合は、ソースコード冒頭部分の指定された2行をコメントアウトしてください。</u>
</div>
'''Ctrl キー'''を押しながら実行したときは、コメントアウト状態の反転ではなく、選択範囲をふくむ行全体を'''強制的にコメントアウト'''します。
:* "'''// コメント行'''" を含むコードブロックをまとめてコメントアウトするさいに、既存の "'''// コメント行'''" を "'''// // 二重にコメントアウト'''" できます。
:* 強制コメントアウトでコメントマークを挿入する位置は、行頭に限定されます。
:* Ctrl キーの押し下げ状態でマクロの機能を切り替えるので、このマクロに'''ショートカットキー'''を割り当てる場合は、「Ctrl キーをふくむキーパターン」と「Ctrl キーをふくまないキーパターン」の2つを登録する必要があります。
:: e.g.1 「Ctrl + /」キー  と  「/」キー
:: e.g.2 「Ctrl + Alt + /」キー  と  「Alt + /」キー
: ※ "GetKeyState" を導入してない場合でも、"強制コメントアウト" 以外の機能はそのまま使用できます。




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


※字下げルールが「半角スペースのみ または タブ文字のみである」か、混在する場合には「半角スペースとタブ文字の出現順序が同じである」という前提になっています。タブ文字ひとつを半角スペースひとつと同じように数え、表示上の幅で評価しません。
* 動作モードの優先順位
* 半角スペースとタブ文字が不規則に混在しているなら、変数 indent = 0 or 1 にして使ってください。従来版と同様に行の先頭でコメントアウトします。
:# Ctrl キーを押しながらの強制コメントアウト(行の先頭で強制コメントアウト)
:# インラインコメントアウト/アンコメント(行の途中からのコメントアウト)
:# 字下げオプションに応じたコメントアウト/アンコメントのトグル(反転)


* 字下げルールが「半角スペースのみ または タブ文字のみである」か、混在する場合には「半角スペースとタブ文字の出現順序が同じである」という前提になっています。タブ文字ひとつを半角スペースひとつと同じように数え、表示上の幅で評価しません。
: 半角スペースとタブ文字が不規則に混在しているなら、字下げオプションの変数を indentMode = '''0''' or '''1''' にして使ってください。手石・masme版と同様に行の先頭でコメントアウトします。


※コメントアウトの状態を反転させるマクロなので、コメントアウト済みの行を二重にコメントアウトすることはできないことがあります。
* "GetKeyState" を導入しない場合は、コメントアウトの状態を'''反転'''させるだけのマクロとなり、"// コメントアウトされている行" を二重にコメントアウトすることはできなくなります。
* 行頭1文字目にコメントマークがある行は、かならずアンコメントされます。
: 字下げオプションの設定値が 0 でも、行頭1文字目にコメントマークがある行は、かならずアンコメントされます。


* コメントマーク末尾の半角空白 あり/なし の差分について。
:* <span style="color:#c00">コメントマーク定義の末尾につける空白は半角スペース1文字しか想定していません。</span>
:* コメントマークの定義文字列に「正規表現のメタ文字」が含まれていても大丈夫なはずですが、保証はいたしかねます。
:* もしも誤動作などで使いづらくなってしまうことがあった場合は、設定項目 "''var varEnable = true;''" の "''true''" を "''false''" にしてください。


<span style="color:#c00;">※行コメント文字の変数 comment = "hoge"; の <u>先頭が空白文字</u> だとアンコメントできません。</span>
* <span style="color:#c00;"> コメント定義の先頭には空白文字をつけないでください。</span>
: 行コメント文字の変数 comment = "hoge"; の先頭が空白文字だとアンコメントできなくなるので、先頭の空白文字は無視します。




▼ '''使用例''' ▼
▼ '''使用例''' ▼
<div style="height:30em; overflow:auto;">
'''例0-1'''. 字下げに非対応だと…
: ※ indentMode = '''0''';  varEnable = false;  のばあい
<source>
//comment 0          =>    |// //comment 0    =>      |//comment 0 
// comment 1        =>    |comment 1          =>      |// comment 1 
  // comment 2      =>    |//  // comment 2  =>      |  // comment 2
</source>


'''例1.''' 5行まとめて選択すると…
'''例0-2'''. 字下げには非対応でも…
: ※変数 indent = 1; のばあい (従来版とおなじ動作)
: ※ indentMode = '''0''';  varEnable = true; (sukemaru版 独自拡張)
<source>
<source>
//comment 1      =>    |comment 1          =>   |//comment 1   
//comment 0          =>    |comment 0          =>     |// comment
  //comment 2    =>    | comment 2        =>   |// comment 2
// comment 1        =>    |comment 1          =>     |// comment 1 
       hoge        =>    |//     hoge        =>    |      hoge   
  // comment 2      =>    |// // comment 2   =>     | // comment 2
        fuga      =>    |//       fuga      =>    |        fuga    
          piyo    =>   |//         piyo    =>    |          piyo
</source>
</source>


'''例2.''' 下3行だけを選択すれば…
'''例1-1'''. 6行まとめて選択すると…
: ※変数 indent = 2 or 3; (sukemaru版 独自拡張)
: ※ indentMode = '''1''';  varEnable = false; (従来版とおなじ動作)
<source>
<source>
//comment 1      =>    |//comment 1        =>    |//comment 1  
//comment 0          =>    |// //comment 0    =>      |//comment 0   
   //comment 2     =>    |  //comment 2       =>   | //comment 2
// comment 1        =>    |comment 1          =>      |// comment 1  
      hoge       =>    |     //hoge       =>   |     hoge     
   // comment 2       =>    |  comment 2       =>     |//   comment 2  
        fuga     =>    |     // fuga     =>    |        fuga  
  hoge               =>    |//   hoge         =>     | hoge        
           piyo    =>    |     //   piyo   =>   |         piyo  
     fuga             =>    |//     fuga       =>     |   fuga      
      piyo           =>    |//       piyo     =>     |     piyo    
</source>
</source>


'''例3.''' 5行まとめて選択しても、コメントアウトとアンコメントで別々の先頭位置を使うことができる
'''例1-2'''. 6行まとめて選択でも…
: ※変数 indent = 3; (sukemaru版 独自拡張)
: ※ indentMode = '''1''';  varEnable = true; (sukemaru版 独自拡張)
<source>
<source>
//comment 1       =>    |comment 1           =>   |//comment 1  
//comment 0          =>    |comment 0          =>      |// comment 0 
   //comment 2     =>    |  comment 2         =>   |// comment 2
// comment 1         =>    |comment 1         =>     |// comment 1  
      hoge       =>    |     //hoge       =>   |     hoge     
   // comment 2       =>    |  comment 2       =>     |//   comment 2  
        fuga     =>    |     // fuga     =>    |        fuga  
  hoge               =>    |//   hoge         =>     | hoge        
           piyo    =>    |     //   piyo   =>   |         piyo  
     fuga             =>    |//     fuga       =>     |   fuga      
      piyo           =>    |//       piyo     =>     |     piyo    
</source>
</source>


'''例4.''' 例4. 一応、こういうこともできる
'''例2-1'''. 下3行だけを選択すれば…
: ※変数 indent = 4; (sukemaru版 独自拡張)
: ※ indentMode = '''2''' or '''3'''; (sukemaru版 独自拡張)
<source>
<source>
//comment 1       =>    |comment 1           =>   |//comment 1  
//comment 0          =>    |//comment 0        =>      |//comment 0   
   //comment 2     =>    |  comment 2         =>   |  //comment 2
// comment 1         =>    |// comment 1       =>     |// comment 1  
      hoge       =>    |     //hoge       =>   |     hoge     
   // comment 2       =>    |  // comment 2     =>     |  // comment 2  
        fuga     =>    |       //fuga     =>    |        fuga  
  hoge               =>    | // hoge         =>     | hoge        
           piyo    =>    |         //piyo   =>   |         piyo  
     fuga             =>    | //   fuga       =>     |   fuga      
      piyo           =>    | //     piyo     =>     |     piyo    
</source>
</source>


'''例5.''' コードブロックをまとめてコメントアウトするなら、「[[Eclipse風コメントアウト(改)]]」、「[[Eclipse風コメントアウト]]」、「[[引用符/コメント]]('''引用の追加''')」マクロか「[[行の先頭に貼り付け]]」マクロなどのほうがよい...
'''例2-2'''. 下4行を選択だと…
: ※変数 indent = 0; にしても行頭にあるコメントマーク(e.g. 1行め)だけは削除されるので不適当 <br> ※以下の例は、拙作「[[引用符/コメント]]」マクロの 「// JS・C コメント」と「1つ削除」
: ※ indentMode = '''2''' or '''3''';  (sukemaru版 独自拡張)
<source>
<source>
//comment 1      =>    |// //comment 1      =>   |//comment 1  
//comment 0          =>    |//comment 0        =>      |//comment 0   
   //comment 2     =>    |//  //comment 2     =>   |  //comment 2
// comment 1        =>    |// comment 1      =>     |// comment 1  
      hoge       =>    |//       hoge       =>   |     hoge     
   // comment 2       =>    | comment 2       =>     |  // comment 2  
        fuga     =>    |//         fuga     =>    |        fuga  
  hoge               =>    | // hoge         =>     | hoge        
           piyo    =>    |//           piyo   =>   |         piyo  
     fuga             =>    | //   fuga       =>     |   fuga      
      piyo           =>    | //     piyo     =>     |     piyo    
</source>
</source>
'''例3'''. 6行まとめて選択しても、コメントアウトとアンコメントで別々の先頭位置を使うこともできる
: ※ indentMode = '''3''';  varEnable = true;  (sukemaru版 独自拡張)
<source>
//comment 0          =>    |comment 0          =>      |// comment 0 
// comment 1        =>    |comment 1          =>      |// comment 1 
  // comment 2      =>    |  comment 2        =>      |//  comment 2
  hoge              =>    |  // hoge          =>      |  hoge       
    fuga            =>    |  //  fuga        =>      |    fuga     
      piyo          =>    |  //    piyo      =>      |      piyo   
</source>
'''例4'''. 一応、こういうこともできる
: ※ indentMode = '''4''';  varEnable = true;  (sukemaru版 独自拡張)
<source>
//comment 0          =>    |comment 0          =>      |// comment 0 
// comment 1        =>    |comment 1          =>      |// comment 1 
  // comment 2      =>    |  comment 2        =>      |  // comment 2
  hoge              =>    |  // hoge          =>      |  hoge       
    fuga            =>    |    // fuga        =>      |    fuga     
      piyo          =>    |      // piyo      =>      |      piyo   
</source>
'''例5'''. コードブロックをまとめて強制的にコメントアウトするなら
: ※ '''Ctrl キー'''を押しながらマクロを実行  (sukemaru版 独自拡張)
<source>
//comment 0          =>    |// //comment 0    =>      |//comment 0   
// comment 1        =>    |// // comment 1    =>      |// comment 1 
  // comment 2      =>    |//  // comment 2  =>      |  // comment 2
  hoge              =>    |//  hoge          =>      |  hoge       
  fuga              =>    |//    fuga        =>      |    fuga     
    piyo            =>    |//      piyo      =>      |      piyo   
</source> </div>


== ソースコード ==
== ソースコード ==
<br>
<br>
ダウンロード: 「[[メディア:行コメント.zip|行コメント.zip]](アイコン入り)」(2018/11/02)
'''ダウンロード:''' 「[[ファイル:行コメント.zip|行コメント.zip]](アイコン入り)」(最終更新2019/03/25)
* ※'''人柱版'''の追加コードは含んでいません。
: ※以前の '''人柱版''' の追加コードを統合してあります。


<source lang="javascript">
<source lang="javascript" style="height:80em; overflow:auto;">
#title = "行コメント"
#title = "行コメント"
#tooltip = "コメントマーク付けはずし"
#tooltip = "コメントマーク付けはずし"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",215
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",215
// 行コメント(sukemaru版)2018/10/25 - 2018/11/01


var $ctrl = 0; // この行をコメントアウトしないこと


// ●字下げされたコメントマークも削除するか? (0: しない / 1 - 4: する)
// Ctrl キーの状態を取得(GetKeyState をインストールしていないなら以下の2行は無効化すること)
var indent = 3;
var getKeyState = '"' + editor.FullName.replace( /mery\.exe$/i , "Macros\\" ) + 'GetKeyState.exe" control';
  // indent = 0 なら 追加/削除 する位置は「常に行頭」のみ
$ctrl = new ActiveXObject( "WScript.Shell" ).Run( getKeyState, 0, true );
  //  ※ 1 ~ 4 なら行の先頭以外のコメントマークも削除する。追加する位置は以下のとおり。
  // indent = 1 なら「常に先頭」にコメントマークを追加する(例1.の使い方 ※従来版とおなじ挿入パターン)
  // indent = 2 なら追加と削除で同じ判定基準の先頭位置検出をする(例2.の使い方ができる)
  // indent = 3 なら追加と削除で別々の判定基準の先頭位置検出をする(例3.の使い方)
  // indent = 4 なら「常に各行の字下げ位置」にあわせてコメントマークを追加する(例4.の使い方)




/* ここから「コメントマーク付け外し」(masme版 2016/02/28)より流用 */  
// -------------------- ▼ 設定項目 ▼ --------------------
// ◆行コメント文字の定義  ●初期値="//"
 
// ●行の途中にある選択範囲をインラインコメントアウトするか?
var inLineEnable = true;
 
  // inLineEnable = true; ならインラインコメントアウトする
  //  ※ 選択範囲が1行内のとき、選択範囲の先頭位置でコメントアウトする(アンコメントも可)
  // inLineEnable = false; ならインラインコメントアウトしない
 
 
// ●字下げされたコメントマークも削除するか?
var indentMode = 3;
 
  // indentMode = 0; なら 追加/削除 する位置は「常に行頭」のみ(字下げされたコメントマークは削除しない)
  //  ※ 1 ~ 4  なら字下げされたコメントマークも削除する。追加する位置は以下のとおり。
  // indentMode = 1; なら「常に先頭」にコメントマークを追加する(例1.の使い方 ※従来版とおなじ挿入パターン)
  //  ※ 2 ~ 4  なら追加する位置は字下げに対応可。
  // indentMode = 2; なら追加と削除で同じ判定基準の先頭位置検出をする(例2.の使い方ができる)
  // indentMode = 3; なら追加と削除で別々の判定基準の先頭位置検出をする(例3.の使い方)
  // indentMode = 4; なら「常に各行の字下げ位置」にあわせてコメントマークを追加する(例4.の使い方)
 
 
// ■コメントマーク末尾に空白つきで定義しているときに、末尾空白のないコメントマークも削除するか?
// (※ comment = "// "; のときに "//こういうコメント行" もアンコメントするか?)
var varEnable = true;
 
  // varEnable = true;  なら削除する
  // varEnable = false; なら削除しない
  // ※ 再度コメントアウトするさいは comment で定義したコメントマーク(末尾空白つき)になります。
  //  コメントマークを comment 末尾に空白なしで定義した場合は無視されます。
 
 
/* ここから「コメントマーク付け外し」(masme版 2016/02/28)より改変 */  
// ◆行コメント文字の定義  ●初期値="// "
var comment = "// ";
var comment = "// ";
  // ※「var comment = "> ";」にするか、下の定義切替ブロックに「case "text": return "> ";」 を追加すると「> 引用マーク」の付けはずしにもなる (sukemaru)


// ▼編集モードによる定義切替
// ▼コメントマークの定義切替
comment = ( function() {
comment = ( function() {
   switch ( document.Mode.toLowerCase() ) {
 
    case "bat":
  // ▼拡張子による定義切り替え
      return "::";
  if ( document.Name.match( /\.def$|\.asm$|\.reg$|\.key$|\.inf$/i ) ) {
    case "c#":  case "c++":  case "javascript":
    return "; ";
       return "//";
   }
    case "ini":  case "python":  case "ruby":
  // ▼ファイル名による定義切り替え
       return "#";
  else if ( document.Name.match( /^hosts$/i ) ) {
    case "visualbasic":  case "vbscript":
    return "# ";
      return "'";
  }
    //case "text":
  // else if ( document.Name.toLowerCase() == "hoge.txt" ) {
    //  return "> ";
  //  return "> ";
    default:
  // }
      return comment;
  // // ▼フォルダ名による定義切り替え(正規表現)
  // else if ( document.FullName.match( /\\mery\\(?!macros\\)/ ) ) {
  //  return "> ";
  // }
 
  else {
    // ▼編集モードによる定義切り替え
    switch ( document.Mode.toLowerCase() ) {
      case "bat":
        return ":: "; // return "REM "; ": " や "' " でも可
      case "c#":  case "c++":  case "javascript":
       case "delphi":  case "java":  case "jsp":  case "windows script":
      case "mery_macro_js":  case "mery_macros_js":
      case "janestyle (正規表現用)":
        return "// ";
      case "ini":  case "python":  case "ruby": // ini は "; " のグループでも可
      case "perl":  case "perlscript":  case "php":  case "python":
      case "powershell":  case "ruby":
       case "mery msy":  case "autohotkey":
        return "# ";
      case "visualbasic":  case "vbscript":
        return "' ";
      case "hsp":  // case: "ini": // ini はデフォルトで "# " のグループ
        return "; ";
      case "sql":
        return "-- ";
      case "tex":
        return "% ";
      case "text":
        return "> ";
      default:
        return comment;
    }
   }
   }
} )();
} )();
/* ここまで「コメントマーク付け外し」(masme版 2016/02/28)より流用 */  
/* ここまで「コメントマーク付け外し」(masme版 2016/02/28)より改変 */  


// -------------------- ▲ 設定項目 ▲ --------------------
if ( document.ReadOnly ) {
  Status = " ドキュメントは書き換え禁止です。";
  Quit();
}
// コメントマークが空白文字だけならマクロを閉じる
if ( comment.match( /^[ \t\n]*$/ ) ) {
  Status = " コメントマークの定義が無効です。";
  Quit();
}
// コメントマークの先頭の空白文字は除去する
// ※comment の先頭に空白文字(半角空白、タブ文字、改行)があるとアンコメントできない
else if ( comment.match( /^[ \t\n]*/ ) ) {
  comment = comment.replace( /^[ \t\n]*/ , "" );
}
// コメントマークの末尾が空白文字の場合、末尾空白なしのコメントマークを定義
if ( varEnable && comment.match( /\s+$/ ) ) {
  var comStr = comment.replace( /\s+$/ , "" );
}
// 選択範囲
var s = document.selection;
var s = document.selection;
// 選択範囲を取得
var tx = s.GetTopPointX( mePosLogical );
var tx = s.GetTopPointX( mePosLogical );
var ty = s.GetTopPointY( mePosLogical );
var ty = s.GetTopPointY( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
var by = s.GetBottomPointY( mePosLogical );
var by = s.GetBottomPointY( mePosLogical );
var anc = s.GetAnchorPos(); // 選択範囲の開始位置
var anc = s.GetAnchorPos(); // 選択範囲の開始位置
var act = s.GetActivePos(); // 選択範囲の終了位置
var act = s.GetActivePos(); // 選択範囲の終了位置
// 選択範囲の末尾が行頭にあるときの調整
var pos = s.IsEmpty ? true : false; // 範囲選択なしのフラグ
if ( ty != by && bx == 1 )
 
  by --;
// 1行内で範囲選択しているとき(右側のコメントアウト)
// 選択範囲を拡張
// ※選択範囲を拡張しない
s.SetActivePoint( mePosLogical, 1, by );
if ( inLineEnable && ty == by && ! pos ) {
s.EndOfLine( false, mePosLogical );
  var inLine = true; // 部分選択のフラグ
s.SetAnchorPoint( mePosLogical, 1, ty );
}
// 範囲選択なし または 複数行選択のとき(行全体のコメントアウト)
else {
  // 選択範囲の末尾が行頭にあるときの調整
  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 st = s.Text; // 選択範囲の文字列を取得
var ad = AddDeleteComment( st );
var ad = AddDeleteComment( st ); // コメントアウト/アンコメント処理した文字列
if ( ad != st ) // (処理の前後で変化なしなら undo 履歴に残さない)
 
   s.Text = ad;
if ( ad != st ) { // (処理の前後で変化なしなら undo 履歴に残さない)
   s.Text = ad; // コメントマークの付けはずし完了
// 選択範囲が空白行1行だけなら範囲選択を残さない
}
if ( s.Text == st && ty == by ) {
var gap = st.length - ad.length;
   s.SetActivePos( act );
 
   s.SetAnchorPos( anc );
// 選択範囲なしで実行したときは範囲選択を残さない
if ( pos ) {
    s.SetActivePoint( mePosLogical, ( gap < tx ) ? tx - gap : 1, ty );
}
// 選択範囲が1行だけのときは選択範囲を復旧する
else if ( inLine ) {
   s.SetActivePos( ( anc < act ) ? act - gap : act );
   s.SetAnchorPos( ( anc < act ) ? anc : anc - gap );
}
}
// 拡張した選択範囲に復帰する
// 複数行選択なら拡張した選択範囲を復旧する
else { // ( ty < by )
else {
   s.SetActivePoint( mePosLogical, 1, by + 1 );
   s.SetActivePoint( mePosLogical, 1, by + 1 );
   s.SetAnchorPoint( mePosLogical, 1, ty );
   s.SetAnchorPoint( mePosLogical, 1, ty );
}
}
Quit();


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 ++ ) {
* 関数 AddDeleteComment( str )
    id = a[i].indexOf( a[i].match( /[^ \t]/ ) );
* 選択範囲の各行の字下げ量をチェックして、字下げ位置にあわせてコメントアウトする
* コメントマークのチェックには正規表現を使っていないので、誤爆はほぼないはず
* ※変数 comment の先頭が空白文字(半角スペース、タブコード \t)だとアンコメントできない
*/  
function AddDeleteComment( str ) {


    // 空白行では -1 (sort のジャマ)が返されるはずなのでデタラメな数値にしておく
  // Ctrl キー押し下げで強制コメントアウト(※行頭にコメントマーク追加)
    // ※ 空白行はコメントアウトしないから数値は大きく
  if ( $ctrl == 1 ) {
    if ( id < 0 ) id += 1000000; // 最小値を 0 以上に
     return str.replace( /^/gm , comment );
     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] だけ使う)
   else {
    var id, _id, c0, d0; // 字下げ量(空白以外の文字の最初の出現位置)
    var a = str.split( "\n" ); // 選択範囲を行単位に分解して配列 a に
    var b = []; // 各行の字下げ量 id を格納する → 削除の基準 b[i]
    var c = []; // id をソートして最小の字下げ量を調べる → 追加の基準 c[0]
    var d = []; // 非コメント行の字下げ量 _id を格納する → 追加の基準 d[0]


  // 各行をコメントアウト/アンコメント処理
    // 選択範囲内の各行の字下げ量を取得 → 配列 b, c, d に
  for ( var i = 0; i < a.length; i ++ ) {
    for ( var i = 0, len = a.length; i < len; i ++ ) {
    // 空白行(id にデタラメな数値を入れた行)はスキップ
      // 各行ごとの字下げ量
    if ( a[i].match( /^[ \t]*$/ ) )
      id = a[i].indexOf( a[i].match( /[^ \t]/ ) ); // a[i].search( /[^ \t]/ ) とおなじ
      continue;


    // 行頭の空白 b[i] の直後がコメントマークかチェック
      // 空白行では -1 (sort のジャマ)が返されるはずなので
    if ( a[i].substr( b[i], comment.length ) == comment ) {
      // デタラメな数値(最小値を 0 以上に)にして id を配列 b, c に格納する
      id = ( id < 0 ) ? 1000000 : id; // 空白行はコメントアウトしないから数値は大きく
      b.push( id );
      if ( indentMode == 2 ) {
        c.push( id );
      }
      // コメント行の数値もデタラメな数値にして _id を配列 d に格納
      else if ( indentMode == 3 ) {
        _id = ( a[i].substr( b[i], comment.length ) == comment ) ? 1000000 : id;
        d.push( _id );
      }
    } // end for


      // コメント行なら...
    // 配列 c, d を昇順で並びかえ( → 最小値 c[0] d[0] だけ使う)
      // (indent>0) またはコメントマークが行頭なら削除する
    if ( indentMode == 2 ) {
      // (indent=0) でコメントマークが行頭以外なら行頭にコメントマークを追加する
       c0 = c.sort( CompareForSort )[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 if ( indentMode == 3 ) {
     else { //  非コメント行ならコメントマークを追加する
       d0 = d.sort( CompareForSort )[0];
      // 最少の字下げ量 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 */
    for ( var i = 0; i < a.length; i ++ ) {
function CompareForSort( first, second ) {
      // 空白行(id にデタラメな数値を入れた行)はスキップ
// 文字コード昇順 (1, 10, 2, 20) ではなく、数値の大きさ (1, 2, 10, 20) でソート
      if ( b[i] == 1000000 ) {
  if ( first == second ) return 0;
        continue;
  if ( first < second ) return -1;
      }
  else  return 1; // ( first > second )  
      // 行頭の空白 b[i] の直後がコメントマークかチェック
}
      // "// コメント行" なら...
</source>
      if ( a[i].substr( b[i], comment.length ) == comment ) {
        // アンコメント または コメントアウト
        a[i] = ( indentMode != 0 || b[i] == 0 )
                  ? a[i].substr( 0, b[i] ) + a[i].substr( b[i] + comment.length )
                  : comment + a[i]; // ( indentMode == 0 && b[i] != 0 )
      }


== 人柱用 追加コード ==
      // 定義されたコメントマークの末尾が空白文字つき "// " ならば
コメントアウトするときは "'''//'''<span style="color:#c0c0c0;">␣</span>" や "'''>'''<span style="color:#c0c0c0;">␣</span>" のようにうしろに半角スペースを入れたいけれど、拾い物のコード内やコピペした文章内の半角スペースなしのコメント行 "'''//コメント'''" や "'''>コメント'''" も手軽にアンコメントしたい、なんて人もいますよね。
      // 各行が末尾空白なしの "//" でコメントアウトされているか再チェック
そんな使い方もできるように sukemaru版の「行コメント」マクロ用に追加コードを作ってみました。 <br>
      else if ( varEnable && comStr
とりあえず "//<span style="color:#c0c0c0;">␣</span>" や "><span style="color:#c0c0c0;">␣</span>" でしか動作検証していないので「<b style="color:#c00;">人柱版</b>」としてコードだけ掲載しておきます。
            && a[i].substr( b[i], comStr.length ) == comStr ) {
        // アンコメント または コメントアウト
        a[i] = ( indentMode != 0 || b[i] == 0 )
                  ? a[i].substr( 0, b[i] ) + a[i].substr( b[i] + comStr.length )
                  : comment + a[i]; // ← ( indentMode == 0 && b[i] != 0 )
      }


* コメントマークの定義の末尾に「半角スペース×1」がついている状態をデフォルト状態にしてください(初期値も編集モードごとの個別定義も)。
      // 非コメント行なら字下げ位置にあわせてコメントアウトする
* コメントマーク定義の末尾につける空白は半角スペース1文字しか想定していません。コメント定義の先頭には空白文字をつけないでください。
      else {
* コメントマークの定義文字列に「正規表現のメタ文字」が含まれていても大丈夫なはずですが、保証はいたしかねます。
        a[i] = ( indentMode == 4 ) ? a[i].slice( 0, b[i] ) + comment + a[i].slice( b[i] )
* もしも誤動作などで使いづらくなってしまうことがあった場合は、◆人柱版の追加オプション◆ "''var sEnable = true;''" "''true''" を "''false''" にすれば追加コード部分はすべて無効化できます。
            : ( indentMode == 3 ) ? a[i].slice( 0, d0 ) + comment + a[i].slice( d0 )
            : ( indentMode == 2 ) ? a[i].slice( 0, c0 ) + comment + a[i].slice( c0 )
            : /*     else      */  comment + a[i];
      }
    } // end for
    return a.join( "\n" );
  } // end else
} // end function




▼冒頭の /** コメントドキュメント部分 */ のなかに追加▼
/**
<source lang="javascript">
  * 以下の関数は『sort メソッド (Array) (JavaScript) | MSDN』より
  * ◆ 人柱版の追加オプション ◆
  * https://msdn.microsoft.com/ja-jp/library/4b4fbfhk%28v=vs.94%29.aspx
  * ・comment 定義の末尾に空白×1 "//␣" があっても、"//こういうコメント行" をアンコメントできます。
  * Sorts array elements in ascending order numerically.
  * ※ 末尾空白2つ以上 "//␣␣" で定義して "//␣こういうコメント行" をアンコメントした場合は
  * sort メソッドデフォルトの ascii 昇順 (1, 10, 2, 20) ではなく、
  *   行頭に空白が1つ残ります。
  * 数値の大きさ (1, 2, 10, 20) でソート
  *   → 字下げ対応で再度コメントアウトすると、1つ字下げした位置にコメントマークが付いてしまいます。
  */
  *
function CompareForSort( first, second ) {
</source>
  if ( first == second )
 
    return 0;
 
   else if ( first < second )
▼コメント定義切替の関数の下、'''''var s = document.selection;''''' の上に追加▼
    return -1;
<source lang="javascript">
   else // ( first > second )
// ◆ 人柱版の追加オプション ◆  (※ 動作確認は不十分)
    return 1;  
// ◆コメントマーク末尾に空白つきで定義しているときに、末尾空白のないコメントマークも削除するか?
}
var sEnable = true;
   // (※ comment = "// "; のときに "//こういうコメント行" をアンコメントするか?)
  // sEnable = true; なら削除する
  // sEnable = false; なら削除しない
  // ※ 再度コメントアウトするさいは comment で定義したコメントマーク(末尾空白つき)になります。
   //   コメントマークを末尾空白なしで定義した場合は無視されます。
 
 
// コメントマークの末尾が空白文字の場合、末尾空白なしの部分を取得 ◆ 人柱版 ◆
if ( sEnable && comment.match( /\s+$/ ) >= 0 )
  var cStr = comment.replace( /\s+$/ , "" );
</source>
</source>


▼関数 AddDeleteComment() 内の '''''// 非コメント行ならコメントマークを追加する''''' の上に追加▼
<source lang="javascript">
    // ◆定義されたコメントマークの末尾が空白文字 "// " かをチェック ◆ 人柱版 追加コード ◆
    else if ( sEnable && cStr && a[i].substr( b[i], cStr.length ) == cStr ) {
      // コメント行なら...
      // (indent>0) またはコメントマークが行頭なら削除する
      // (indent=0) でコメントマークが行頭以外なら行頭にコメントマークを追加する
        var uncomment = a[i].substr( 0, b[i] ) + a[i].substr( b[i] + cStr.length );
        a[i] = ( indent != 0 || b[i] == 0 ) ? uncomment :
              /* indent == 0 && b[i] != 0 */  comment + a[i];
    } // ここまで ◆ 人柱版 追加コード ◆
</source>


== おまけ ==
== おまけ ==
396行目: 548行目:
"'''/* '''"  と  "''' */'''"  と  "''' * '''"  で複数行のコメントブロックをつくるなら、<br>  
"'''/* '''"  と  "''' */'''"  と  "''' * '''"  で複数行のコメントブロックをつくるなら、<br>  
「[[カッコで囲う|カッコで囲う(ポップアップメニューあり)]]」マクロか「[[引用符/コメント]]」マクロで。
「[[カッコで囲う|カッコで囲う(ポップアップメニューあり)]]」マクロか「[[引用符/コメント]]」マクロで。


* <u>hoge, fuga, piyo</u> の3行をコメントアウトする
* <u>hoge, fuga, piyo</u> の3行をコメントアウトする
403行目: 554行目:
           piyo
           piyo


* 「'''カッコで囲う'''(ポップアップメニューあり)」マクロの「JS コメントアウト2」
* 「'''カッコで囲う'''(ポップアップメニューあり)」マクロの「JS コメントアウト2」<br> つねに行の先頭へコメントマークを挿入します。
:: つねに行の先頭へコメントマークを挿入します。
  /*
  /*
   *        hoge
   *        hoge
411行目: 561行目:
   */
   */


* 「'''引用符/コメント'''」マクロの「JS コメントアウト2」
* 「'''引用符/コメント'''」マクロの「JS コメントアウト2」<br> 字下げされたブロックの先頭位置へコメントマークを挿入します。
:: 字下げされたブロックの先頭位置へコメントマークを挿入します。
       /*  
       /*  
         * hoge
         * hoge
419行目: 568行目:
         */
         */


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




※どちらのマクロも  "'''/* '''"  と  "''' */'''"  だけでコメントアウトすることができます。
※どちらのマクロも  "'''/* '''"  と  "''' */'''"  だけでコメントアウトすることもできます。
: また、"'''<nowiki><!-- </nowiki>'''"  と  "'''<nowiki> --></nowiki>'''"  でのコメントアウトとアンコメントもできます。
: また、"'''<nowiki><!-- </nowiki>'''"  と  "'''<nowiki> --></nowiki>'''"  でのコメントアウトとアンコメントもできます。


430行目: 579行目:
   
   
  「カッコで囲う」マクロ
  「カッコで囲う」マクロ
  abcdefg ''/* hijklmn */'' opqrstuvwxyz
  abcdefg '''''/* hijklmn */''''' opqrstuvwxyz
  abcdefg ''<nowiki><!-- hijklmn --></nowiki>'' opqrstuvwxyz
  abcdefg '''''<nowiki><!-- hijklmn --></nowiki>''''' opqrstuvwxyz
   
   
  「引用符/コメント」マクロ
  「引用符/コメント」マクロ
  ''/* abcdefghijklmnopqrstuvwxyz */''
  '''''/* abcdefghijklmnopqrstuvwxyz */'''''
  ''<nowiki><!-- abcdefghijklmnopqrstuvwxyz --></nowiki>''
  '''''<nowiki><!-- abcdefghijklmnopqrstuvwxyz --></nowiki>'''''

2019年3月25日 (月) 02:27時点における版

手石 版 (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 版

「行コメント」マクロ (コメントマーク付けはずし sukemaru版)

ダウンロード:ファイル:行コメント.zip(アイコン入り)」(最終更新2019/03/25)


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

コードブロックのコメントアウトのさいに、各行の先頭位置が少しだけ分かりやすくなります。
  • 空白行(タブ文字/半角スペースのみの行と、完全な空行)は無視します。
  • 編集モードによる定義切替は、「コメントマーク付け外し」(masme版 2016/02/28)まま。
  • 設定変数 comment の定義に ">" などの引用マークを指定すると、引用マークの付けはずしにも利用できます。


「コメントアウトするときは "//コメント" や ">コメント" のようにうしろに半角スペースを入れたいけれど、拾い物のコード内やコピペした文章内の半角スペースなしのコメント行 "//コメント" や ">コメント" も手軽にアンコメントしたい」という使い方も想定しています。

  • コメントマークの定義の末尾に「半角スペース×1」がついている状態をデフォルト状態にしてあります(初期値も編集モードごとの個別定義も)。


選択範囲が1行内の場合は、選択範囲の先頭位置でコメントアウト/アンコメントしますので、行の途中からのインラインコメントアウトができます。

  • 選択範囲の先頭が空白文字なら字下げオプションに準じて処理します。
  • 行の途中からの "// インラインコメント" 部分(1行内)を範囲選択している状態で Ctrl キーを押しながらマクロを実行した場合は、選択範囲の先頭にコメントマークを追加します。


このマクロは、以下の外部実行ファイルで機能を拡張できます。
マクロライブラリから ZIP ファイルをダウンロードして Mery\Macros フォルダに解凍してください。

ソースコードは "GetKeyState" を導入している前提で書いています。
"GetKeyState" を導入しない場合は、ソースコード冒頭部分の指定された2行をコメントアウトしてください。

Ctrl キーを押しながら実行したときは、コメントアウト状態の反転ではなく、選択範囲をふくむ行全体を強制的にコメントアウトします。

  • "// コメント行" を含むコードブロックをまとめてコメントアウトするさいに、既存の "// コメント行" を "// // 二重にコメントアウト" できます。
  • 強制コメントアウトでコメントマークを挿入する位置は、行頭に限定されます。
  • Ctrl キーの押し下げ状態でマクロの機能を切り替えるので、このマクロにショートカットキーを割り当てる場合は、「Ctrl キーをふくむキーパターン」と「Ctrl キーをふくまないキーパターン」の2つを登録する必要があります。
e.g.1 「Ctrl + /」キー と 「/」キー
e.g.2 「Ctrl + Alt + /」キー と 「Alt + /」キー
※ "GetKeyState" を導入してない場合でも、"強制コメントアウト" 以外の機能はそのまま使用できます。


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

  • 動作モードの優先順位
  1. Ctrl キーを押しながらの強制コメントアウト(行の先頭で強制コメントアウト)
  2. インラインコメントアウト/アンコメント(行の途中からのコメントアウト)
  3. 字下げオプションに応じたコメントアウト/アンコメントのトグル(反転)
  • 字下げルールが「半角スペースのみ または タブ文字のみである」か、混在する場合には「半角スペースとタブ文字の出現順序が同じである」という前提になっています。タブ文字ひとつを半角スペースひとつと同じように数え、表示上の幅で評価しません。
半角スペースとタブ文字が不規則に混在しているなら、字下げオプションの変数を indentMode = 0 or 1 にして使ってください。手石・masme版と同様に行の先頭でコメントアウトします。
  • "GetKeyState" を導入しない場合は、コメントアウトの状態を反転させるだけのマクロとなり、"// コメントアウトされている行" を二重にコメントアウトすることはできなくなります。
字下げオプションの設定値が 0 でも、行頭1文字目にコメントマークがある行は、かならずアンコメントされます。
  • コメントマーク末尾の半角空白 あり/なし の差分について。
  • コメントマーク定義の末尾につける空白は半角スペース1文字しか想定していません。
  • コメントマークの定義文字列に「正規表現のメタ文字」が含まれていても大丈夫なはずですが、保証はいたしかねます。
  • もしも誤動作などで使いづらくなってしまうことがあった場合は、設定項目 "var varEnable = true;" の "true" を "false" にしてください。
  • コメント定義の先頭には空白文字をつけないでください。
行コメント文字の変数 comment = "hoge"; の先頭が空白文字だとアンコメントできなくなるので、先頭の空白文字は無視します。


使用例

例0-1. 字下げに非対応だと…

※ indentMode = 0; varEnable = false; のばあい
//comment 0          =>    |// //comment 0     =>      |//comment 0   
// comment 1         =>    |comment 1          =>      |// comment 1   
  // comment 2       =>    |//  // comment 2   =>      |  // comment 2

例0-2. 字下げには非対応でも…

※ indentMode = 0; varEnable = true; (sukemaru版 独自拡張)
//comment 0          =>    |comment 0          =>      |// comment 0   
// comment 1         =>    |comment 1          =>      |// comment 1   
  // comment 2       =>    |//  // comment 2   =>      |  // comment 2

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

※ indentMode = 1; varEnable = false; (従来版とおなじ動作)
//comment 0          =>    |// //comment 0     =>      |//comment 0    
// comment 1         =>    |comment 1          =>      |// comment 1   
  // comment 2       =>    |  comment 2        =>      |//   comment 2 
  hoge               =>    |//   hoge          =>      |  hoge         
    fuga             =>    |//     fuga        =>      |    fuga       
      piyo           =>    |//       piyo      =>      |      piyo

例1-2. 6行まとめて選択でも…

※ indentMode = 1; varEnable = true; (sukemaru版 独自拡張)
//comment 0          =>    |comment 0          =>      |// comment 0   
// comment 1         =>    |comment 1          =>      |// comment 1   
  // comment 2       =>    |  comment 2        =>      |//   comment 2 
  hoge               =>    |//   hoge          =>      |  hoge         
    fuga             =>    |//     fuga        =>      |    fuga       
      piyo           =>    |//       piyo      =>      |      piyo

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

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

例2-2. 下4行を選択だと…

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

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

※ indentMode = 3; varEnable = true; (sukemaru版 独自拡張)
//comment 0          =>    |comment 0          =>      |// comment 0   
// comment 1         =>    |comment 1          =>      |// comment 1   
  // comment 2       =>    |  comment 2        =>      |//   comment 2 
  hoge               =>    |  // hoge          =>      |  hoge         
    fuga             =>    |  //   fuga        =>      |    fuga       
      piyo           =>    |  //     piyo      =>      |      piyo

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

※ indentMode = 4; varEnable = true; (sukemaru版 独自拡張)
//comment 0          =>    |comment 0          =>      |// comment 0   
// comment 1         =>    |comment 1          =>      |// comment 1   
  // comment 2       =>    |  comment 2        =>      |  // comment 2 
  hoge               =>    |  // hoge          =>      |  hoge         
    fuga             =>    |    // fuga        =>      |    fuga       
      piyo           =>    |      // piyo      =>      |      piyo

例5. コードブロックをまとめて強制的にコメントアウトするなら

Ctrl キーを押しながらマクロを実行 (sukemaru版 独自拡張)
//comment 0          =>    |// //comment 0     =>      |//comment 0    
// comment 1         =>    |// // comment 1    =>      |// comment 1   
  // comment 2       =>    |//   // comment 2  =>      |  // comment 2 
  hoge               =>    |//   hoge          =>      |  hoge         
   fuga              =>    |//     fuga        =>      |    fuga       
     piyo            =>    |//       piyo      =>      |      piyo

ソースコード


ダウンロード:ファイル:行コメント.zip(アイコン入り)」(最終更新2019/03/25)

※以前の 人柱版 の追加コードを統合してあります。
#title = "行コメント"
#tooltip = "コメントマーク付けはずし"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",215

var $ctrl = 0;	// この行をコメントアウトしないこと

// Ctrl キーの状態を取得(GetKeyState をインストールしていないなら以下の2行は無効化すること)
var getKeyState = '"' + editor.FullName.replace( /mery\.exe$/i , "Macros\\" ) + 'GetKeyState.exe" control';
$ctrl = new ActiveXObject( "WScript.Shell" ).Run( getKeyState, 0, true );


// -------------------- ▼ 設定項目 ▼ --------------------	

// ●行の途中にある選択範囲をインラインコメントアウトするか?
var inLineEnable = true;

  // inLineEnable = true; ならインラインコメントアウトする
  //  ※ 選択範囲が1行内のとき、選択範囲の先頭位置でコメントアウトする(アンコメントも可)
  // inLineEnable = false; ならインラインコメントアウトしない


// ●字下げされたコメントマークも削除するか?
var indentMode = 3;

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


// ■コメントマーク末尾に空白つきで定義しているときに、末尾空白のないコメントマークも削除するか?
// (※ comment = "// "; のときに "//こういうコメント行" もアンコメントするか?)
var varEnable = true;

  // varEnable = true;  なら削除する
  // varEnable = false; なら削除しない
  // ※ 再度コメントアウトするさいは comment で定義したコメントマーク(末尾空白つき)になります。
  //   コメントマークを comment 末尾に空白なしで定義した場合は無視されます。


/* ここから「コメントマーク付け外し」(masme版 2016/02/28)より改変 */ 
// ◆行コメント文字の定義  ●初期値="// "
var comment = "// ";

// ▼コメントマークの定義切替
comment = ( function() {

  // ▼拡張子による定義切り替え
  if ( document.Name.match( /\.def$|\.asm$|\.reg$|\.key$|\.inf$/i ) ) {
    return "; ";
  }
  // ▼ファイル名による定義切り替え
  else if ( document.Name.match( /^hosts$/i ) ) {
    return "# ";
  }
  // else if ( document.Name.toLowerCase() == "hoge.txt" ) {
  //   return "> ";
  // }
  // // ▼フォルダ名による定義切り替え(正規表現)
  // else if ( document.FullName.match( /\\mery\\(?!macros\\)/ ) ) {
  //   return "> ";
  // }

  else {
    // ▼編集モードによる定義切り替え
    switch ( document.Mode.toLowerCase() ) {
      case "bat":
        return ":: ";	// return "REM ";	": " や "' " でも可
      case "c#":  case "c++":  case "javascript":
      case "delphi":  case "java":  case "jsp":  case "windows script":
      case "mery_macro_js":  case "mery_macros_js":
      case "janestyle (正規表現用)":
        return "// ";
      case "ini":  case "python":  case "ruby":		// ini は "; " のグループでも可
      case "perl":  case "perlscript":  case "php":  case "python":
      case "powershell":  case "ruby":
      case "mery msy":  case "autohotkey":
        return "# ";
      case "visualbasic":  case "vbscript":
        return "' ";
      case "hsp":  // case: "ini":	// ini はデフォルトで "# " のグループ
        return "; ";
      case "sql":
        return "-- ";
      case "tex":
        return "% ";
      case "text":
        return "> ";
      default:
        return comment;
    }
  }
} )();
/* ここまで「コメントマーク付け外し」(masme版 2016/02/28)より改変 */ 

// -------------------- ▲ 設定項目 ▲ --------------------

if ( document.ReadOnly ) {
  Status = " ドキュメントは書き換え禁止です。";
  Quit();
}
// コメントマークが空白文字だけならマクロを閉じる
if ( comment.match( /^[ \t\n]*$/ ) ) {
  Status = " コメントマークの定義が無効です。";
  Quit();
}
// コメントマークの先頭の空白文字は除去する
// ※comment の先頭に空白文字(半角空白、タブ文字、改行)があるとアンコメントできない
else if ( comment.match( /^[ \t\n]*/ ) ) {
  comment = comment.replace( /^[ \t\n]*/ , "" );
}
// コメントマークの末尾が空白文字の場合、末尾空白なしのコメントマークを定義
if ( varEnable && comment.match( /\s+$/ ) ) {
  var comStr = comment.replace( /\s+$/ , "" );
}

// 選択範囲
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();		// 選択範囲の終了位置
var pos = s.IsEmpty ? true : false;	// 範囲選択なしのフラグ

// 1行内で範囲選択しているとき(右側のコメントアウト)
// ※選択範囲を拡張しない
if ( inLineEnable && ty == by && ! pos ) {
  var inLine = true;			// 部分選択のフラグ
}
// 範囲選択なし または 複数行選択のとき(行全体のコメントアウト)
else {
  // 選択範囲の末尾が行頭にあるときの調整
  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;		// コメントマークの付けはずし完了
}
var gap = st.length - ad.length;

// 選択範囲なしで実行したときは範囲選択を残さない
if ( pos ) {
    s.SetActivePoint( mePosLogical, ( gap < tx ) ? tx - gap : 1, ty );
}
// 選択範囲が1行だけのときは選択範囲を復旧する
else if ( inLine ) {
  s.SetActivePos( ( anc < act ) ? act - gap : act );
  s.SetAnchorPos( ( anc < act ) ? anc : anc - gap );
}
// 複数行選択なら拡張した選択範囲を復旧する
else {
  s.SetActivePoint( mePosLogical, 1, by + 1 );
  s.SetAnchorPoint( mePosLogical, 1, ty );
}
Quit();

// ------------------------------------------------------------

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

  // Ctrl キー押し下げで強制コメントアウト(※行頭にコメントマーク追加)
  if ( $ctrl == 1 ) {
    return str.replace( /^/gm , comment );
  }
    
  else {
    var id, _id, c0, d0;		// 字下げ量(空白以外の文字の最初の出現位置)
    var a = str.split( "\n" );	// 選択範囲を行単位に分解して配列 a に
    var b = [];	// 各行の字下げ量 id を格納する			→ 削除の基準 b[i]
    var c = [];	// id をソートして最小の字下げ量を調べる	→ 追加の基準 c[0]
    var d = [];	// 非コメント行の字下げ量 _id を格納する	→ 追加の基準 d[0]

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

      // 空白行では -1 (sort のジャマ)が返されるはずなので
      // デタラメな数値(最小値を 0 以上に)にして id を配列 b, c に格納する
      id = ( id < 0 ) ? 1000000 : id;	// 空白行はコメントアウトしないから数値は大きく
      b.push( id );
      if ( indentMode == 2 ) {
        c.push( id );
      }
      // コメント行の数値もデタラメな数値にして _id を配列 d に格納
      else if ( indentMode == 3 ) {
        _id = ( a[i].substr( b[i], comment.length ) == comment ) ? 1000000 : id;
        d.push( _id );
      }
    }	// end for

    // 配列 c, d を昇順で並びかえ( → 最小値 c[0] d[0] だけ使う)
    if ( indentMode == 2 ) {
      c0 = c.sort( CompareForSort )[0];
    }
    else if ( indentMode == 3 ) {
      d0 = d.sort( CompareForSort )[0];
    }

    // 各行をコメントアウト/アンコメント処理
    for ( var i = 0; i < a.length; i ++ ) {
      // 空白行(id にデタラメな数値を入れた行)はスキップ
      if ( b[i] == 1000000 ) {
        continue;
      }
      // 行頭の空白 b[i] の直後がコメントマークかチェック
      // "// コメント行" なら...
      if ( a[i].substr( b[i], comment.length ) == comment ) {
        // アンコメント または コメントアウト
        a[i] = ( indentMode != 0 || b[i] == 0 )
                   ? a[i].substr( 0, b[i] ) + a[i].substr( b[i] + comment.length )
                   : comment + a[i];	// ← ( indentMode == 0 && b[i] != 0 )
      }

      // 定義されたコメントマークの末尾が空白文字つき "// " ならば
      // 各行が末尾空白なしの "//" でコメントアウトされているか再チェック
      else if ( varEnable && comStr
             && a[i].substr( b[i], comStr.length ) == comStr ) {
        // アンコメント または コメントアウト
        a[i] = ( indentMode != 0 || b[i] == 0 )
                   ? a[i].substr( 0, b[i] ) + a[i].substr( b[i] + comStr.length )
                   : comment + a[i];	// ← ( indentMode == 0 && b[i] != 0 )
      }

      // 非コメント行なら字下げ位置にあわせてコメントアウトする
      else {
        a[i] = ( indentMode == 4 ) ? a[i].slice( 0, b[i] ) + comment + a[i].slice( b[i] )
             : ( indentMode == 3 ) ? a[i].slice( 0, d0 ) + comment + a[i].slice( d0 )
             : ( indentMode == 2 ) ? a[i].slice( 0, c0 ) + comment + a[i].slice( c0 )
             : /*     else      */   comment + a[i];
      }
    }	// end for
    return a.join( "\n" );
  }	// end else
}	// end function


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


おまけ


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

  • 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 -->
スポンサーリンク