「
コメントマーク付け外し
」を編集中
2019年3月20日 (水) 00:08時点における
Sukemaru
(
トーク
|
投稿記録
)
による版
(
→
sukemaru 版
:
説明文を少し修正)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
= 手石 版 (2014/03) = コメントマークの付け外しをするマクロです。<br> js 以外の拡張子に対応させる時は、最後の関数に追加してください。 == 更新履歴 == * 2013/03/28 ** 無題のときに対応しました。 * 2014/03/22 ** できるだけ短くしてみました。 == ソースコード == <source lang="javascript"> // コメントマーク.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( "コメントマーク?", "//"); }; }; </source> = masme 版 = マクロ「[[テキスト整形]]」の「行頭 // を付加/削除」を独立・改造したバージョンです。<br> 行頭(論理行)にコメント文字が有れば削除(アンコメント)し、無ければ付加(コメントアウト)します。 * 空白行(改行/半角空白/水平タブのみの行)はコメントアウトしないようにしました。 * 初期設定では、インデントされたコメント文字には対応していません。<br>「indent」変数を「false」から「true」に書き換えると、手石 版のように行頭空白後のコメント文字も削除するようになります。<br>インデントへの対応は、手石 版と同様に削除限定です。付加するときは行頭(論理行)になります。 * 編集モードによる定義切替は、マクロ「[[Eclipse風コメントアウト]]」を参考にしました。 == 更新履歴 == * 2016/02/28 ** 編集モードによる定義切替が正常に機能していないミスを修正。 * 2015/02/14 ** 特殊文字の対処にミスがあったため再修正。 * 2015/02/14 ** 「行コメント文字の定義」に正規表現の特殊文字があると誤動作する不具合を修正。 ** 矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正。 ** テキストの処理方法を変更。 * 2014/02/22 ** 初版公開。 == ソースコード == <source lang="javascript"> //■行コメントのアン・アウト // 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); </source> = sukemaru 版 = 行頭のコメントマーク付けはずし * masme 版の設定用変数 indent = true の状態(インデントされたコメントマークを削除できる)を下地として、選択範囲内のもっとも字下げの少ない位置にあわせてコメントマークを付けられます。 ※コードブロックのコメントアウトのさいに、各行の先頭位置が少しだけ分かりやすくなります。 * 空白行(タブ文字/半角スペースのみの行と、完全な空行)は無視します。 * 編集モードによる定義切替は、「コメントマーク付け外し」(masme版 2016/02/28)まま。 * 変数 comment の定義に "'''> '''" などの引用マークを指定すると、引用マークの付けはずしにも利用できます。 ▼ '''注意事項''' (仕様上の制限) ▼ ※字下げルールが「半角スペースのみ または タブ文字のみである」か、混在する場合には「半角スペースとタブ文字の出現順序が同じである」という前提になっています。タブ文字ひとつを半角スペースひとつと同じように数え、表示上の幅で評価しません。 * 半角スペースとタブ文字が不規則に混在しているなら、変数 indent = 0 or 1 にして使ってください。従来版と同様に行の先頭でコメントアウトします。 ※コメントアウトの状態を反転させるマクロなので、コメントアウト済みの行を二重にコメントアウトすることはできないことがあります。 * 行頭1文字目にコメントマークがある行は、かならずアンコメントされます。 <span style="color:#c00;">※行コメント文字の変数 comment = "hoge"; の <u>先頭が空白文字</u> だとアンコメントできません。</span> ▼ '''使用例''' ▼ '''例1.''' 5行まとめて選択すると… : ※変数 indent = 1; のばあい (従来版とおなじ動作) <source> //comment 1 => |comment 1 => |//comment 1 //comment 2 => | comment 2 => |// comment 2 hoge => |// hoge => | hoge fuga => |// fuga => | fuga piyo => |// piyo => | piyo </source> '''例2.''' 下3行だけを選択すれば… : ※変数 indent = 2 or 3; (sukemaru版 独自拡張) <source> //comment 1 => |//comment 1 => |//comment 1 //comment 2 => | //comment 2 => | //comment 2 hoge => | //hoge => | hoge fuga => | // fuga => | fuga piyo => | // piyo => | piyo </source> '''例3.''' 5行まとめて選択しても、コメントアウトとアンコメントで別々の先頭位置を使うことができる : ※変数 indent = 3; (sukemaru版 独自拡張) <source> //comment 1 => |comment 1 => |//comment 1 //comment 2 => | comment 2 => |// comment 2 hoge => | //hoge => | hoge fuga => | // fuga => | fuga piyo => | // piyo => | piyo </source> '''例4.''' 例4. 一応、こういうこともできる : ※変数 indent = 4; (sukemaru版 独自拡張) <source> //comment 1 => |comment 1 => |//comment 1 //comment 2 => | comment 2 => | //comment 2 hoge => | //hoge => | hoge fuga => | //fuga => | fuga piyo => | //piyo => | piyo </source> '''例5.''' コードブロックをまとめてコメントアウトするなら、「[[Eclipse風コメントアウト(改)]]」、「[[Eclipse風コメントアウト]]」、「[[引用符/コメント]]('''引用の追加''')」マクロか「[[行の先頭に貼り付け]]」マクロなどのほうがよい... : ※変数 indent = 0; にしても行頭にあるコメントマーク(e.g. 1行め)だけは削除されるので不適当 <br> ※以下の例は、拙作「[[引用符/コメント]]」マクロの 「// JS・C コメント」と「1つ削除」 <source> //comment 1 => |// //comment 1 => |//comment 1 //comment 2 => |// //comment 2 => | //comment 2 hoge => |// hoge => | hoge fuga => |// fuga => | fuga piyo => |// piyo => | piyo </source> == ソースコード == <br> ダウンロード: 「[[メディア:行コメント.zip|行コメント.zip]](アイコン入り)」(2018/11/02) * ※'''人柱版'''の追加コードは含んでいません。 <source lang="javascript"> #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 ) } </source> == 人柱用 追加コード == コメントアウトするときは "'''//'''<span style="color:#c0c0c0;">␣</span>" や "'''>'''<span style="color:#c0c0c0;">␣</span>" のようにうしろに半角スペースを入れたいけれど、拾い物のコード内やコピペした文章内の半角スペースなしのコメント行 "'''//コメント'''" や "'''>コメント'''" も手軽にアンコメントしたい、なんて人もいますよね。 そんな使い方もできるように sukemaru版の「行コメント」マクロ用に追加コードを作ってみました。 <br> とりあえず "//<span style="color:#c0c0c0;">␣</span>" や "><span style="color:#c0c0c0;">␣</span>" でしか動作検証していないので「<b style="color:#c00;">人柱版</b>」としてコードだけ掲載しておきます。 * コメントマークの定義の末尾に「半角スペース×1」がついている状態をデフォルト状態にしてください(初期値も編集モードごとの個別定義も)。 * コメントマーク定義の末尾につける空白は半角スペース1文字しか想定していません。コメント定義の先頭には空白文字をつけないでください。 * コメントマークの定義文字列に「正規表現のメタ文字」が含まれていても大丈夫なはずですが、保証はいたしかねます。 * もしも誤動作などで使いづらくなってしまうことがあった場合は、◆人柱版の追加オプション◆ "''var sEnable = true;''" の "''true''" を "''false''" にすれば追加コード部分はすべて無効化できます。 ▼冒頭の /** コメントドキュメント部分 */ のなかに追加▼ <source lang="javascript"> * ◆ 人柱版の追加オプション ◆ * ・comment 定義の末尾に空白×1 "//␣" があっても、"//こういうコメント行" をアンコメントできます。 * ※ 末尾空白2つ以上 "//␣␣" で定義して "//␣こういうコメント行" をアンコメントした場合は * 行頭に空白が1つ残ります。 * → 字下げ対応で再度コメントアウトすると、1つ字下げした位置にコメントマークが付いてしまいます。 * </source> ▼コメント定義切替の関数の下、'''''var s = document.selection;''''' の上に追加▼ <source lang="javascript"> // ◆ 人柱版の追加オプション ◆ (※ 動作確認は不十分) // ◆コメントマーク末尾に空白つきで定義しているときに、末尾空白のないコメントマークも削除するか? var sEnable = true; // (※ comment = "// "; のときに "//こういうコメント行" をアンコメントするか?) // sEnable = true; なら削除する // sEnable = false; なら削除しない // ※ 再度コメントアウトするさいは comment で定義したコメントマーク(末尾空白つき)になります。 // コメントマークを末尾空白なしで定義した場合は無視されます。 // コメントマークの末尾が空白文字の場合、末尾空白なしの部分を取得 ◆ 人柱版 ◆ if ( sEnable && comment.match( /\s+$/ ) >= 0 ) var cStr = comment.replace( /\s+$/ , "" ); </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> == おまけ == <br> "'''/* '''" と "''' */'''" と "''' * '''" で複数行のコメントブロックをつくるなら、<br> 「[[カッコで囲う|カッコで囲う(ポップアップメニューあり)]]」マクロか「[[引用符/コメント]]」マクロで。 * <u>hoge, fuga, piyo</u> の3行をコメントアウトする hoge fuga piyo * 「'''カッコで囲う'''(ポップアップメニューあり)」マクロの「JS コメントアウト2」 :: つねに行の先頭へコメントマークを挿入します。 /* * hoge * fuga * piyo */ * 「'''引用符/コメント'''」マクロの「JS コメントアウト2」 :: 字下げされたブロックの先頭位置へコメントマークを挿入します。 /* * hoge * fuga * piyo */ ※どちらのマクロもアンコメント機能がありますが、「カッコで囲う」マクロは「引用符/コメント」マクロによって字下げ位置に挿入されたコメントマークを正しく削除できません。 ※どちらのマクロも "'''/* '''" と "''' */'''" だけでコメントアウトすることができます。 : また、"'''<nowiki><!-- </nowiki>'''" と "'''<nowiki> --></nowiki>'''" でのコメントアウトとアンコメントもできます。 * 「カッコで囲う」マクロは選択範囲内を、「引用符/コメント」マクロは選択範囲のある行全体をコメントアウトします。 abcdefghijklmnopqrstuvwxyz 「カッコで囲う」マクロ abcdefg ''/* hijklmn */'' opqrstuvwxyz abcdefg ''<nowiki><!-- hijklmn --></nowiki>'' opqrstuvwxyz 「引用符/コメント」マクロ ''/* abcdefghijklmnopqrstuvwxyz */'' ''<nowiki><!-- abcdefghijklmnopqrstuvwxyz --></nowiki>''
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク