「
コメントマーク付け外し
」を編集中
2018年10月29日 (月) 02:11時点における
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 の状態(インデントされたコメントマークを削除できる)を下地として、選択範囲内のもっとも字下げの少ない位置にあわせてコメントマークを付けられます。 <br> ※コードブロックのコメントアウトのさいに、各行の先頭位置が少しだけ分かりやすくなります。 * 空白行(タブ文字/半角スペースのみの行と、完全な空行)は無視します。 * 編集モードによる定義切替は、「コメントマーク付け外し」(masme版 2016/02/28)まま。 * <u>変数 comment の定義に "'''> '''" などの引用マークを指定すると、引用マークの付けはずしにも使用可。</u> ▼ '''注意事項''' (仕様上の制限) ▼ ※字下げルールが「半角スペースのみ または タブ文字のみである」か、混在する場合には「半角スペースとタブ文字の出現順序が同じである」という前提になっています。タブ文字ひとつを半角スペースひとつと同じように数え、表示上の幅で評価しません。 <br> 半角スペースとタブ文字が不規則に混在しているなら、変数 addByIndent = false; にして使ってください。従来版と同様に行の先頭でコメントアウトします。 ※行コメント文字の変数 comment = "hoge"; の <u>先頭が空白文字</u> だとアンコメントできません。 ▼ '''使用例''' ▼ '''例1.''' 5行まとめて選択すると… : ※変数 indent = true; addByIndent = false; のばあい (従来版とおなじ動作) <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 = addByIndent = true; (sukemaru版 独自拡張1) <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 = addByIndent = independent = true; (sukemaru版 独自拡張2) <source> //comment 1 => |comment 1 => |//comment 1 //comment 2 => | comment 2 => |// comment 2 hoge => | //hoge => | hoge fuga => | // fuga => | fuga piyo => | // piyo => | piyo </source> '''例4.''' コードブロックをまとめてコメントアウトするなら「[[引用符/コメント]]('''引用の追加''')」マクロか「[[行の先頭に貼り付け]]」マクロのほうがよい... : ※変数 indent = false; にしても行頭にあるコメントマーク(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]]」(アイコン入り) <source lang="javascript"> #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 ) } </source>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
編集を中止
編集の仕方
(新しいウィンドウで開きます)
スポンサーリンク
案内メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク