<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://www.haijin-boys.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=92.202.159.41</id>
	<title>MeryWiki - 利用者の投稿記録 [ja]</title>
	<link rel="self" type="application/atom+xml" href="https://www.haijin-boys.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=92.202.159.41"/>
	<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/92.202.159.41"/>
	<updated>2026-06-27T18:49:06Z</updated>
	<subtitle>利用者の投稿記録</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=%E3%83%9E%E3%82%AF%E3%83%AD%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA&amp;diff=4954</id>
		<title>マクロライブラリ</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=%E3%83%9E%E3%82%AF%E3%83%AD%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA&amp;diff=4954"/>
		<updated>2020-03-15T10:56:23Z</updated>

		<summary type="html">&lt;p&gt;92.202.159.41: /* プログラミング補助 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mery で使用できるマクロを集めたライブラリです。&lt;br /&gt;
&lt;br /&gt;
スクリプトを拡張子「js」 (JavaScript、JScript の場合) にして「Macros」フォルダ等に保存し、マクロメニューの「選択」や「カスタマイズ」から読み込んで使用してください。&lt;br /&gt;
&lt;br /&gt;
マクロライブラリはどなたでも自由に編集できますので、みなさんが作成した便利なマクロをどんどん掲載してください。&lt;br /&gt;
&lt;br /&gt;
== テキスト操作補助 ==&lt;br /&gt;
&lt;br /&gt;
*[https://github.com/haijinboys/mery-macro-emmet Emmet] (Kuro)&lt;br /&gt;
*[[Zen Coding]] (Kuro)&lt;br /&gt;
*[[CSV のカーソル位置の列を削除]] (Kuro)&lt;br /&gt;
*[[対応する括弧に移動]] (Kuro, kurama, masme 他) update 2019/04/24 （追加コード 2019/12/05）&lt;br /&gt;
*[[選択文字列を強調]] (Kuro)&lt;br /&gt;
*[[行頭に移動]] (Kuro, 他) update 2014/03/15&lt;br /&gt;
*[[行頭か行末 または 選択範囲の始点か終点|行頭か行末 または 選択範囲の始点か終点 に移動]] (sukemaru) update 2019/03/29&lt;br /&gt;
*[[文書の先頭か末尾|文書の 先頭か末尾 に移動]] (sukemaru) update 2019/03/29&lt;br /&gt;
*[[バイト数]] (Kuro, ks)&lt;br /&gt;
*[[日付と時刻を挿入]] (n, masme, sukemaru) update 2018/12/09&lt;br /&gt;
*[[日付と時刻を挿入（カレンダー版）]] (papagoat) update 2016/05/24&lt;br /&gt;
*[[選択範囲を上下に移動]] (ks)&lt;br /&gt;
*[[行を上下に移動（Mery 2.7 用）]]　(sukemaru) 2019/05/07　※Mery 2.7 以降用（ブックマークを保持）&lt;br /&gt;
*[[行を複製 (複数行可)]] (sukemaru) update 2019/05/07&lt;br /&gt;
*[[TeraPadのCtrl↑と同じような動作をするマクロ]] (suke)&lt;br /&gt;
*[[TeraPadのCtrl↓と同じような動作をするマクロ]] (suke)&lt;br /&gt;
*[[Vz 風テキストスタック 2 ストロークキー]] (papagoat) update 2013/11/22&lt;br /&gt;
*[[非選択状態でも逆インデント]] (papagoat)&lt;br /&gt;
*[[ラクラク罫線]] (手石) Update 2012/12/22&lt;br /&gt;
*[[ファイル:XHTML.zip]] (アラフォー親父) HTMLタグを、ショートカット・キーに登録して入力するマクロ（文章挟み込み仕様）&lt;br /&gt;
*[[矩形ペースト]] (手石)&lt;br /&gt;
*[[自動箇条書き]] (手石) update 2013/03/15&lt;br /&gt;
*[[インデントを考慮した折り返し（改行挿入）]] (手石) update 2013/02/23&lt;br /&gt;
*[[青空文庫用整形補助]] (ks, 有志)&lt;br /&gt;
*[[部分編集]] (ks)&lt;br /&gt;
*[[文字カウント]] (masme) 2014/02/01, update 2019/12/21&lt;br /&gt;
*[[字下げ・字上げ]](インデント・逆インデント)  (masme) 2014/02/09, update 2019/06/01&lt;br /&gt;
:[[字下げ・字上げ#sukemaru 版|スペース×２ 追加・削除]]、[[字下げ・字上げ#インデント|インデント・逆インデント]] (sukemaru) last update 2019/12/01　※Mery 2.8.6 以上でブックマークを保持&lt;br /&gt;
*[[数値を増減]](インクリメント・デクリメント) (masme) 2014/06/17, update 2016/02/28&lt;br /&gt;
*[[少し便利な Undo/Redo]] (ks)&lt;br /&gt;
*[[自動ルビ振り]] (急急如律令)&lt;br /&gt;
*[[貼付け実行後のカーソル位置を貼付け文字列の先頭にする]] (yuko, sukemaru) update 2018/11/14&lt;br /&gt;
*[[ドイツ語特殊文字]] (鯉)&lt;br /&gt;
*[[矩形選択範囲の各行先頭に文字挿入]] (yuko)&lt;br /&gt;
*[[行の先頭に貼り付け]] (sukemaru) 2018/08/24&lt;br /&gt;
*[[文章で使用されている文字をユニーク抽出]] (Kuro)&lt;br /&gt;
*[[アウトライン用ノード追加]] (mik) 2018/06/25&lt;br /&gt;
*[[アウトラインのノードレベルを上げる]] (mik) 2018/06/25&lt;br /&gt;
*[[アウトラインのノードレベルを下げる]] (mik) 2018/06/25&lt;br /&gt;
*[[アウトラインのノードの完了/未完了を切り替える]] (mik) 2018/10/18 update&lt;br /&gt;
*[[ハルナアウトライン用の完了/未完了フラグをノード名に反映する]] (mik) 2018/10/18 update&lt;br /&gt;
*[[Markdown文書で改行時にリスト、引用ブロック開始記号を自動入力する]] (catfist, yuko) 2018/10/15 update&lt;br /&gt;
*[[Markdown 向け、リスト記号 (*) のトグル]] (yuko) 2019/04/29&lt;br /&gt;
*[[引用符／コメント]] ※ポップアップメニュー (行頭の文字列操作. 「引用の追加」マクロの増補改訂版)　(sukemaru) last modified 2019/04/07&lt;br /&gt;
*[[カッコで囲う]] (ポップアップメニューあり)　(sukemaru) last modified 2019/04/07&lt;br /&gt;
:「[[カッコで囲う#カッコで囲う (ポップアップメニューなし)|カッコで囲う (簡易版 ポップアップメニューなし)]]」&amp;lt;br&amp;gt; 「[[カッコで囲う#引用符を追加／削除|引用符を追加／削除]]」（ &amp;quot;二重引用符&amp;quot; の追加／削除トグル）&lt;br /&gt;
*[[カッコをはずす]] ＆ [[カッコをはずす#カッコを削除／追加|カッコを削除／追加]] ＆ [[カッコをはずす#カッコを追加／削除|カッコを追加／削除]] (sukemaru) fixed 2019/05/03&lt;br /&gt;
*[[定型文を挿入]]マクロ集 (sukemaru) 2018/12/03&lt;br /&gt;
*[[何年生で習う漢字？]] (シリル) 2019/03/10&lt;br /&gt;
*[[上に行挿入]] (yuko) 2019/05/11&lt;br /&gt;
*[[位置情報を保存してから「すべて選択／選択解除」(非スクロール)]] (sukemaru)&lt;br /&gt;
: update 2019/11/13： 「[[位置情報を保存してから「すべて選択／選択解除」(非スクロール)#【include 版】位置を復帰／保存|位置を復帰／保存]]」を追加&lt;br /&gt;
*[[選択範囲を広げる]] (yuko) 2020/02/24&lt;br /&gt;
&lt;br /&gt;
== ファイル操作補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[ファイルのプロパティ]] (sukemaru) 2018/12/18&lt;br /&gt;
*[[文字列中のパス起動]] (ks)&lt;br /&gt;
*[[選択範囲のURL・パスを開く|ひらけゴマ！]] ※「選択範囲のURL・パスを開く」 (sukemaru) update 2019/04/07&lt;br /&gt;
*[[自動バックアップ]] (ks)&lt;br /&gt;
*[[終了時状態保持・復元]] (ks)&lt;br /&gt;
*[[上書き保存(UAC対応)]] (ks)&lt;br /&gt;
*[[含んでいるフォルダを開く]] (ks)&lt;br /&gt;
*[[パスを取得]] (Kuro)&lt;br /&gt;
*[[フォルダ内のファイルをすべて開く]] (Kuro)&lt;br /&gt;
*[[ファイルを比較]] (Kuro)&lt;br /&gt;
*[[ファイル名を引数にしてアプリ起動]] (Kuro, miso)&lt;br /&gt;
*[[ブックマーク一覧ジャンプ]] ※ポップアップメニュー (goat, sukemaru) update 2019/12/05&lt;br /&gt;
*[[拡張子の違うファイルを開く]] (n)&lt;br /&gt;
*[[フォルダを開く]] (n)&lt;br /&gt;
*[[コマンドプロンプトを開く]] (n)&lt;br /&gt;
*[[SDIウィンドウの記憶と復帰]] (papagoat) Update 2012/10/23 (説明文変更 2013/11/22)&lt;br /&gt;
*[[よく使うフォルダ]] (手石) Update 2014/02/22&lt;br /&gt;
*[[ファイル（選択範囲）の仮保存]] (手石)&lt;br /&gt;
*[[ポップアップメニューでファイル選択]] (手石)&lt;br /&gt;
*[[フォルダツリーをポップアップ表示]] (n)&lt;br /&gt;
*[[タグジャンプ]] (o)&lt;br /&gt;
*[[ウィンドウの位置とサイズを拡張子で指定]] (papagoat) Update 2014/04/17&lt;br /&gt;
*[[編集モードの自動選択]] または 「書き換え禁止で開く」 ※イベントマクロ (sukemaru, Bleat) update 2019/04/24&lt;br /&gt;
*[[書き換え禁止モード色反転]] (Bleat)&lt;br /&gt;
*[[特定のフォルダで「ファイルを開く」ダイアログ]] (sukemaru) fixed 2018/12/19&lt;br /&gt;
*[[すべて閉じる]]マクロ集 (sukemaru) update 2019/05/03 &amp;lt;br&amp;gt;｢他（右側／左側）のタブを閉じる｣ などを追加&lt;br /&gt;
*[[文書が変更されていなければ変更マークを消す]] (Noah)&lt;br /&gt;
*[[変更なしのタブをすべて閉じる]] (Noah)&lt;br /&gt;
*[[ファイルを読み直す・開きなおす]] ※ポップアップメニュー (sukemaru) last update 2019/11/30 &amp;lt;br&amp;gt; エンコード指定で読み直し・読み取り専用属性の変更・編集モードの変更・プロパティを開く・さいごに閉じたファイルを開く・etc...&lt;br /&gt;
*[[さいごに閉じたファイルを開く]] ※ポップアップメニュー (sukemaru) 2019/11/30&lt;br /&gt;
&lt;br /&gt;
== 変換・ソート・整形 ==&lt;br /&gt;
&lt;br /&gt;
*[[可変長を固定長に変換]] (Kuro)&lt;br /&gt;
*[[SHA でハッシュ化]] (Kuro)&lt;br /&gt;
*[[標準変換]] (Kuro)&lt;br /&gt;
*[[連続する重複行を削除]] (Kuro)&lt;br /&gt;
*[[昇順で並び替え]] (Kuro)&lt;br /&gt;
*[[降順で並び替え]] (Kuro)&lt;br /&gt;
*[[昇順で並び替え／降順で並び替え]] トグル変換 (sukemaru) 2019/06/03&lt;br /&gt;
*[[ブックマーク系コマンド集]] (ks)&lt;br /&gt;
*[[テキスト変換]] (ks)&lt;br /&gt;
**[[テキスト整形]] (masme) 2013/09/15, update 2019/12/21&lt;br /&gt;
*[[旧漢字から新漢字に変換]] (furu)&lt;br /&gt;
*[[clustalw を用いてアライメントを実行]] (suke)&lt;br /&gt;
*[[連番の挿入]] (手石)&lt;br /&gt;
*[[TSV(CSV) ⇒ 固定長]] (手石) update 2013/04/16&lt;br /&gt;
*[[行並べ替え]] (masme) 2013/08/25, update 2019/04/12&lt;br /&gt;
*[[連番を挿入]] (masme) 2013/08/25, update 2019/12/30&lt;br /&gt;
*[[GFMをHTMLに変換]] (noonworks) 2014/03/09&lt;br /&gt;
*[[TrueとFalse_を切り替える|YES／NO マクロ]] (sukemaru) update 2018/11/27 ※「&amp;lt;span style=&amp;quot;color:#0000c0;&amp;quot;&amp;gt;True&amp;lt;/span&amp;gt;と&amp;lt;span style=&amp;quot;color:#c00;&amp;quot;&amp;gt;False&amp;lt;/span&amp;gt;をトグル切り替え」 &amp;lt;br&amp;gt;＋ 改造版「ToDoリストモード」 (sukemaru) Added 2019/05/06&lt;br /&gt;
*[[基数変換10_16]] (シリル) 2019/02/10&lt;br /&gt;
*[[スネークケース ⇔ キャメルケースの変換]] (Noah)&lt;br /&gt;
*[[罫線変換]] (シリル) 2019/03/09&lt;br /&gt;
*[[全角／半角変換]] (sukemaru) fixed 2019/05/11 ※「ＡＢＣ」→「ABC」／「ABC」→「ＡＢＣ」&lt;br /&gt;
*[[全角／半角 トグル変換]] (sukemaru) fixed 2019/05/20 ※「ＡＢＣ」⇔「ABC」&lt;br /&gt;
*[[大文字／小文字／頭文字 トグル変換]] (sukemaru) last update 2019/08/29 ※「Abc」→「ABC」→「abc」&lt;br /&gt;
*[[ひらがな／カタカナ変換]] (sukemaru) update 2020/01/03 ※「あいうえお」⇔「アイウエオ」&lt;br /&gt;
*[[文字列の順番を逆に書き出す]] (sukemaru) update 2020/01/03 ※「あいうえお」⇔「おえういあ」&lt;br /&gt;
&lt;br /&gt;
== 検索・置換 ==&lt;br /&gt;
&lt;br /&gt;
*[[文書から検索]] (Kuro)&lt;br /&gt;
*[[単語を抽出]] (Kuro)&lt;br /&gt;
*[[このファイルから検索(マッチしない行)]] (Kuro)&lt;br /&gt;
*[[このファイルから検索(マッチする行)]] (Kuro)&lt;br /&gt;
*[[タグの外側（内側）だけ置換]] (手石)&lt;br /&gt;
*[[ポップアップメニューで検索先にジャンプ]] (手石, sukemaru) Last Update 2019/04/16&lt;br /&gt;
*[[検索(SJIS以外)]] + 検索強調を解除 (masme) 2014/09/16, update 2019/06/01&lt;br /&gt;
*[https://github.com/TakamiChie/mery-scripts/blob/master/SearchWithMode.js 現在開いているファイルの言語名をつけてWeb検索] (高見知英)→[[https://vine.co/v/eeY59rFMail 実際の動作例]]&lt;br /&gt;
*[https://github.com/GunseiPaseri/Mery_macro 文字出現量ランキング] (群生系パセリ) 2015/12/28&lt;br /&gt;
*[[検索ヒット数表示]] (ks)&lt;br /&gt;
*[[検索ヒット数表示（選択文字列）]] ※イベントマクロ　(sukemaru) last update 2019/12/03 &amp;lt;br&amp;gt;「[[検索ヒット数表示（選択文字列）#機能強化バージョン|文字数・行数・バイト数・ヒット件数]]」を追加&lt;br /&gt;
*[[任意の検索エンジンで検索]] (Noah)&lt;br /&gt;
*[[任意の検索エンジンで検索ー改良版]] (Takeshi) 2019/07/12&lt;br /&gt;
*[[デフォルトの検索フラグを設定して検索ウィンドウ表示]] (yuko)&lt;br /&gt;
*[[簡易検索一覧]] (シリル) 2018/12/24&lt;br /&gt;
*[[簡易検索一覧などをアウトプット]] (シリル) 2018/12/31&lt;br /&gt;
*[[複数置換]] (Noah)&lt;br /&gt;
*[[類義語アウトプット【Python】]] (シリル) 2019/03/24&lt;br /&gt;
*[[校正支援アウトプット]] (シリル) 2019/05/01&lt;br /&gt;
*[[次／前の文字列を検索・改]] (sukemaru) last update 2019/12/03 ※複数行選択から『次／前の文字列を検索』&lt;br /&gt;
&lt;br /&gt;
== プログラミング補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[Eclipse風コメントアウト]] (ks)&lt;br /&gt;
*[[Eclipse風コメントアウト(改)]] (pizz) 2020/03/15&lt;br /&gt;
*[[コメントマーク付け外し]] (手石, masme, sukemaru) last update 2019/06/01&lt;br /&gt;
:([[コメントマーク付け外し#sukemaru 版|sukemaru版]]) last update 2019/12/01 ※ブックマーク対応&lt;br /&gt;
*[[スマートインデント(C 構文)]] (ks)&lt;br /&gt;
*[[ctags.exeでtagsファイルを生成、タグジャンプを行うマクロ]] (kazy)&lt;br /&gt;
*[[タグファイルから補完]] (n)&lt;br /&gt;
*[[コードスニペットもどき]] (手石) Update 2012/12/20&lt;br /&gt;
*[[TeX文書のコンパイル]] (手石)&lt;br /&gt;
*[[TeX数式のチェック]] (手石)&lt;br /&gt;
*[[簡易数式計算]] (ks)&lt;br /&gt;
*[[定義へ移動]] (ks)&lt;br /&gt;
*[[タブの桁数]] (手石)&lt;br /&gt;
*[[行末の空白を削除]] (n) 2014/12/19&lt;br /&gt;
*[https://github.com/TakamiChie/mery-scripts/tree/master/ 開いているスクリプトファイルを実行(掲載時点ではバッチファイル・Javascript・Lua・PHP・Perl・Python・Ruby・UWSCに対応。順次追加予定)] (高見知英)&lt;br /&gt;
*[https://github.com/TakamiChie/mery-scripts/tree/master/ 開いているスクリプトファイルを構文チェック(掲載時点ではPHP・Perlに対応。順次追加予定)] (高見知英)&lt;br /&gt;
*[[説明を出力]] (s) Create 2015/08/16&lt;br /&gt;
*[[拡張子からコンソール実行]] (YOS G-spec) 2019/6/22更新&lt;br /&gt;
*[[JSON整形]](Ovis) Create 2019/03/25&lt;br /&gt;
&lt;br /&gt;
== おもしろ ==&lt;br /&gt;
&lt;br /&gt;
*[[テキストブラウザ]] (Kuro)&lt;br /&gt;
*[[Yahoo!天気情報]] (Kuro, sukemaru) update 2020/01/02&lt;br /&gt;
*[[メール送信]] (ks)&lt;br /&gt;
*[[あつまれ☆みんなのおもしろアイコン]] (有志)&lt;br /&gt;
&lt;br /&gt;
== 実験的マクロ・練習マクロなど ==&lt;br /&gt;
&lt;br /&gt;
*【自家用】[[ファイルのフルパスをコピーして閉じる]] ※イベント (sukemaru) update 2019/04/14&lt;br /&gt;
*【自家用】[[行の表示方法を切り替える]] (sukemaru) update 2019/08/25 ※論理行⇔表示行 トグル&lt;br /&gt;
*【自家用】[[対応する括弧に移動#sukemaru 版|対応するカッコに移動・選択]] (sukemaru) last update 2019/12/05&lt;br /&gt;
*【実験】 [[位置情報を保存してから「次の文字列を検索」]]＋復帰　(sukemaru) 2019/05/28&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
&lt;br /&gt;
*[[HSPキーワード検索]] (SSSE) 2019/08/29&lt;br /&gt;
*[[最新版を確認]] (diaphragm)&lt;br /&gt;
*[[SAPI 使って単語読み上げ]] (miso)&lt;br /&gt;
*[[フォルダ選択ダイアログ]] (手石)&lt;br /&gt;
*[[HTA(HTML)の自作ダイアログを表示]] (noonworks)&lt;br /&gt;
*[[JavaScript を実行]] (n)&lt;br /&gt;
*[[ポップアップメニューを手軽に扱う]] (komorebikoboshi)&lt;br /&gt;
*[[マクロ・関数をメニューで呼び出す]] (aliquis) 2013/08/19&lt;br /&gt;
*[[階層化マクロメニュー]] (ks)&lt;br /&gt;
*[[シェルコマンドを実行]] (sasaki)&lt;br /&gt;
*[[ポップアップメニューでチェックボックス]] (手石)&lt;br /&gt;
*[[ポップアップメニューでラジオボタン]] (手石)&lt;br /&gt;
*[[Editor.OpenFile()のポリフィル]](kazy)&lt;br /&gt;
*[[折り返しトグル切り替え]] (Bleat, sukemaru) update 2019/02/19&lt;br /&gt;
*[[ファイルロック (排他制御) 的なもの]] (PebblePot)&lt;br /&gt;
*[[Mery.iniのオプション値を取得]] ※組み込み用関数 (sukemaru) last update 2019/11/15&lt;br /&gt;
*[[Mery本体のバージョンチェック]] ※組み込み用関数 (sukemaru) 2019/04/17 &amp;lt;br&amp;gt;サンプルコード: 「Begin/EndUndoGroup() メソッドを使えるのは ver 2.7.0 以降」&lt;br /&gt;
*[[IO.Serialize() の JSON を参照する]] ※組み込み用関数 (sukemaru) 2019/04/17&lt;br /&gt;
*[[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する]] ※組み込み用関数 (sukemaru) 2019/04/20 &amp;lt;br&amp;gt;サンプルコード: 「すべての論理行をポップアップメニューに表示する」&lt;br /&gt;
*[[アクティブなタブのマクロを実行する]] (sukemaru) 2019/08/12&lt;br /&gt;
*[[「クリップボード履歴」メニューのマクロ化]]　(sukemaru) last update 2019/11/29 &amp;lt;br&amp;gt;　※ [[プラグイン:スニペットプラグイン|スニペット]] の機能を統合 ／ ※ver 2.8.1 以降用&lt;br /&gt;
*[[コンパクトメニュー]] (sukemaru) last update 2019/11/21&lt;br /&gt;
*[[マクロメニュー]] (sukemaru) 2019/11/02&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
*[[キーアサイン集]] (ks, masme, sukemaru, 有志) last update 2019/06/16&lt;br /&gt;
*[[マテリアルデザインっぽいアイコンと『小マクロ集』]] ※アイコン収録数&#039;&#039;&#039;337&#039;&#039;&#039;コ (sukemaru) last update 2020/01/04&lt;br /&gt;
*[[includeライブラリ]] (ks)&lt;br /&gt;
*[[GetKeyState.exe(キー状態取得実行ファイル)]] (pizz) 2019/03/23&lt;br /&gt;
*[[マクロ覚え書き（開発者向け）]](ks, 有志) Last Update 2019/09/08&lt;/div&gt;</summary>
		<author><name>92.202.159.41</name></author>
	</entry>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=Eclipse%E9%A2%A8%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88(%E6%94%B9)&amp;diff=4953</id>
		<title>Eclipse風コメントアウト(改)</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=Eclipse%E9%A2%A8%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88(%E6%94%B9)&amp;diff=4953"/>
		<updated>2020-03-15T07:33:13Z</updated>

		<summary type="html">&lt;p&gt;92.202.159.41: /* コード */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
Eclipse風なコメントアウト &amp;lt;=&amp;gt; コメントの除去を行います。&lt;br /&gt;
&lt;br /&gt;
ksさんの作成された、[[Eclipse風コメントアウト]]は、私にとって欠かせないツールです。&lt;br /&gt;
&lt;br /&gt;
便利に使わせていただく一方、細かい挙動が気になって変更したり、機能を追加しているうちに、すっかり別物になってしまいました。&lt;br /&gt;
&lt;br /&gt;
オリジナルを作成されたksさんに感謝するとともに、せっかく作成したので改造版をここに公開します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Shiftキーの状態を取得するために、[[GetKeyState.exe(キー状態取得実行ファイル)]]を使用しています。&lt;br /&gt;
&lt;br /&gt;
本体マクロと併せて上記実行ファイルも必要になります。&lt;br /&gt;
&lt;br /&gt;
zipファイルをダウンロードしたら、ファイルのプロパティ画面で「ブロックの解除」を行ってください。&lt;br /&gt;
(これをしないと実行時に警告が表示されることがあります)&lt;br /&gt;
&lt;br /&gt;
その後、zipファイルを展開して、Macrosフォルダーに配置してください。&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2019/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
2019/4/12 window.Quit() メソッドの使用排除&lt;br /&gt;
&lt;br /&gt;
2020/3/15 Mery 3.0.0以降対応版の追加(document.tagプロパティを使用)&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
このスクリプトはMery Ver.3.0.0以降対応版です&lt;br /&gt;
Mery Ver.3.0.0未満の環境では、後半のスクリプトを利用してください&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
#icon = &amp;quot;_Comment.ico&amp;quot;&lt;br /&gt;
#title = &amp;quot;選択行コメントアウト&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// このスクリプトはMery Ver.3.0.0以降対応版です&lt;br /&gt;
// Ver.3.0.0以前の環境では動作しません&lt;br /&gt;
&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Eclipse風なコメントアウト&lt;br /&gt;
// 複数行一括コメントアウト，復帰マクロ&lt;br /&gt;
// 1) 対象は行全体(行途中の選択も行全体とみなす)&lt;br /&gt;
// 2) 空白行はコメントアウトしない&lt;br /&gt;
// 3) インデントは選択行の範囲で一番左(タブ幅単位)に合わせる&lt;br /&gt;
// 4) 選択範囲全体がコメントアウトされている場合は復帰&lt;br /&gt;
//&lt;br /&gt;
// Copyright (c) ks. All Rights Reserved.&lt;br /&gt;
// www:		http://merysmacro.seesaa.net/&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// a) 最終行の先頭までの選択状態では、最終行は処理範囲外にする(行選択対応)&lt;br /&gt;
// b) コメント文字の種類を追加(Mery標準で単一行コメント可能な編集モード全て対応)&lt;br /&gt;
// c) スペースが含まれるコメント文字に対応&lt;br /&gt;
// d) コメント文字が正規表現文字でも正しく動作するようにした&lt;br /&gt;
// e) コメント文字不明時、SHIFTキー押下起動時はコメント文字を入力できるようにした&lt;br /&gt;
// f) 選択方向を維持するようにした(下から上への選択対応)&lt;br /&gt;
// g) 空白行で実行するとUndoされてしまう問題に対処&lt;br /&gt;
// h) OutputBarにフォーカスがある場合に処理できない問題に対処&lt;br /&gt;
//&lt;br /&gt;
// SHIFTキー状態取得のために、&amp;quot;GetKeyState.exe&amp;quot;が必要です&lt;br /&gt;
//&lt;br /&gt;
// Improved by pizz&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
var doc = editor.ActiveDocument;&lt;br /&gt;
var COM = &amp;quot;&amp;quot;;	// 単一行コメント&lt;br /&gt;
var TAGKEY = &amp;quot;pizzComment&amp;quot;&lt;br /&gt;
&lt;br /&gt;
switch(doc.Mode.toLowerCase()){&lt;br /&gt;
case &amp;quot;bat&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;rem &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;c#&amp;quot;:&lt;br /&gt;
case &amp;quot;c++&amp;quot;:&lt;br /&gt;
case &amp;quot;coldfusion&amp;quot;:&lt;br /&gt;
case &amp;quot;delphi&amp;quot;:&lt;br /&gt;
case &amp;quot;java&amp;quot;:&lt;br /&gt;
case &amp;quot;javascript&amp;quot;:&lt;br /&gt;
case &amp;quot;jsp&amp;quot;:&lt;br /&gt;
case &amp;quot;php&amp;quot;:&lt;br /&gt;
case &amp;quot;uwsc&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;// &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;hsp&amp;quot;:&lt;br /&gt;
case &amp;quot;ini&amp;quot;:&lt;br /&gt;
case &amp;quot;x86 assembler&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;; &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;perl&amp;quot;:&lt;br /&gt;
case &amp;quot;perlscript&amp;quot;:&lt;br /&gt;
case &amp;quot;powershell&amp;quot;:&lt;br /&gt;
case &amp;quot;python&amp;quot;:&lt;br /&gt;
case &amp;quot;rhtml&amp;quot;:&lt;br /&gt;
case &amp;quot;ruby&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;# &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;sql&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;-- &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;tex&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;% &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;vbscript&amp;quot;:&lt;br /&gt;
case &amp;quot;visualbasic&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;&#039;&amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var wshShell = new ActiveXObject(&amp;quot;WScript.Shell&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// カレントディレクトリをマクロディレクトリに変更&lt;br /&gt;
wshShell.CurrentDirectory = editor.FullName.match(/^.*\\/)[0] + &#039;Macros&#039;;&lt;br /&gt;
&lt;br /&gt;
// タグ設定を取得&lt;br /&gt;
var comSelected = &amp;quot;&amp;quot;;&lt;br /&gt;
if(document.tag.exists(TAGKEY)) comSelected = document.tag(TAGKEY);&lt;br /&gt;
if(comSelected == &amp;quot;&amp;quot;) comSelected = COM;&lt;br /&gt;
var comTrim = comSelected.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;);	// スペースなしのコメント文字&lt;br /&gt;
&lt;br /&gt;
// SHIFTキー状態を取得&lt;br /&gt;
var shift = wshShell.Run(&amp;quot;GetKeyState.exe shift&amp;quot;, 0, true);&lt;br /&gt;
&lt;br /&gt;
if(shift != -1){&lt;br /&gt;
	// コメント文字の入力を受ける&lt;br /&gt;
	if(comTrim == &amp;quot;&amp;quot; || shift == 1){&lt;br /&gt;
		var comInput = &amp;quot;// &amp;quot;;&lt;br /&gt;
		if(comTrim != &amp;quot;&amp;quot;) comInput = comSelected;&lt;br /&gt;
&lt;br /&gt;
		comInput = prompt(&amp;quot;コメント文字を指定してください&amp;quot;, comInput);&lt;br /&gt;
&lt;br /&gt;
		comTrim = comInput.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;);	// スペースなしのコメント文字&lt;br /&gt;
		if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
			comSelected = comInput;&lt;br /&gt;
			document.tag(TAGKEY) = comSelected;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
		var meGetLineLogical = 0;&lt;br /&gt;
		var regOrg = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comSelected.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
		var regTrim = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comTrim.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
		var scrollY = window.ScrollY;&lt;br /&gt;
		var sel = doc.Selection;&lt;br /&gt;
		var st = sel.GetTopPointY(mePosLogical);&lt;br /&gt;
		var ed = sel.GetBottomPointY(mePosLogical);&lt;br /&gt;
		var ac = sel.GetActivePointY(mePosLogical);&lt;br /&gt;
		if(st != ed &amp;amp;&amp;amp; sel.GetBottomPointX(mePosLogical) == 1){&lt;br /&gt;
			// 複数行選択、最下行選択位置が行頭の場合は、最終行は除外&lt;br /&gt;
			ed--;&lt;br /&gt;
		}&lt;br /&gt;
		var tab = GetTabSpace();&lt;br /&gt;
&lt;br /&gt;
		sel.SetActivePoint(mePosLogical, doc.GetLine(ed, meGetLineLogical).length + 1, ed);&lt;br /&gt;
		sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
		var lines = sel.Text.split(&amp;quot;\n&amp;quot;)&lt;br /&gt;
		if(sel.Text.length &amp;gt; 0) sel.Untabify();&lt;br /&gt;
		var linesWithoutTab = sel.Text.split(&amp;quot;\n&amp;quot;);&lt;br /&gt;
		if(sel.Text.length &amp;gt; 0) doc.Undo();&lt;br /&gt;
&lt;br /&gt;
		// インデント取得&lt;br /&gt;
		var indent = -1;&lt;br /&gt;
		var existNotCommentLine = false;	// 空白・コメント行でない行が存在するか&lt;br /&gt;
		for(var i=0, len = linesWithoutTab.length; i &amp;lt; len; i++){&lt;br /&gt;
			var line = linesWithoutTab[i];&lt;br /&gt;
			var left = line.search(/[^ ]/);&lt;br /&gt;
			if(left &amp;gt;= 0 &amp;amp;&amp;amp; (indent &amp;lt; 0 || left &amp;lt; indent)){&lt;br /&gt;
				// インデントはタブ幅単位(左寄せ)&lt;br /&gt;
				indent = Math.floor(left / tab) * tab;&lt;br /&gt;
			}&lt;br /&gt;
			if(left &amp;gt;= 0){&lt;br /&gt;
				// コメント行判定&lt;br /&gt;
				if(!existNotCommentLine &amp;amp;&amp;amp; line.search(regTrim) == -1){&lt;br /&gt;
					existNotCommentLine = true;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var txt = &amp;quot;&amp;quot;;&lt;br /&gt;
		var changed = false;&lt;br /&gt;
		if(existNotCommentLine){&lt;br /&gt;
			// コメントアウト&lt;br /&gt;
			for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
				var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
				// 空白行はコメントアウトしない&lt;br /&gt;
				if(line.search(/[^ \t\n]/) == -1){&lt;br /&gt;
					txt += line;&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				// 挿入位置をタブと空白を考慮して決定&lt;br /&gt;
				var index = 0, j;&lt;br /&gt;
				for(j = 0; index &amp;lt; indent; j++){&lt;br /&gt;
					// indent の範囲には半角スペースかタブしかない&lt;br /&gt;
					if(line.charAt(j) == &amp;quot; &amp;quot;){&lt;br /&gt;
						index += 1;&lt;br /&gt;
					}else{&lt;br /&gt;
						index += tab - (index % tab);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				txt += line.substring(0, j) + comSelected + line.substring(j);&lt;br /&gt;
				changed = true;&lt;br /&gt;
			}&lt;br /&gt;
		}else{&lt;br /&gt;
			// コメントから復帰&lt;br /&gt;
			for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
				var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
				if(line.match(regTrim)){&lt;br /&gt;
					if(line.match(regOrg)){&lt;br /&gt;
						txt += line.replace(comSelected, &amp;quot;&amp;quot;);	// 先頭のコメント(空白付き)の削除&lt;br /&gt;
					}else{&lt;br /&gt;
						txt += line.replace(comTrim, &amp;quot;&amp;quot;);	// 先頭のコメント(空白なし)の削除&lt;br /&gt;
					}&lt;br /&gt;
					changed = true;&lt;br /&gt;
				}else{&lt;br /&gt;
					txt += line;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// コメントアウト部分を書き換えて，全体を選択&lt;br /&gt;
		if(doc.GetLine(ed + 1, meGetLineWithNewLines) == &amp;quot;&amp;quot;) txt = txt.substring(0, txt.length - 1);	// 最後の改行は除去&lt;br /&gt;
		if(ac == st){&lt;br /&gt;
			// 下から上への選択状態&lt;br /&gt;
			sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
			if(changed) sel.Text = txt;&lt;br /&gt;
			sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
		}else{&lt;br /&gt;
			// 上から下への選択状態&lt;br /&gt;
			sel.SetActivePoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
			if(changed) sel.Text = txt;&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
		}&lt;br /&gt;
		window.ScrollY = scrollY;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//========================================&lt;br /&gt;
// 関数&lt;br /&gt;
//========================================&lt;br /&gt;
// タブ幅を取得&lt;br /&gt;
function GetTabSpace()&lt;br /&gt;
{&lt;br /&gt;
	var doc = editor.ActiveDocument;&lt;br /&gt;
	var sel = doc.Selection;&lt;br /&gt;
	var saved = doc.Saved;&lt;br /&gt;
	sel.EndOfDocument();&lt;br /&gt;
	doc.Write(&amp;quot;\n\t&amp;quot;);&lt;br /&gt;
	sel.SetAnchorPoint(mePosLogical, sel.GetActivePointX(mePosLogical) - 1, sel.GetActivePointY(mePosLogical));&lt;br /&gt;
	sel.Untabify();&lt;br /&gt;
	var n = sel.Text.length;&lt;br /&gt;
	doc.Undo(); doc.Undo();&lt;br /&gt;
	doc.Saved = saved&lt;br /&gt;
&lt;br /&gt;
	return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以下は、Mery Ver.3.0.0未満の環境でも利用できます&lt;br /&gt;
(3.0.0以降でも動作しますが、上のバージョンの利用をお勧めします)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
#icon = &amp;quot;_Comment.ico&amp;quot;&lt;br /&gt;
#title = &amp;quot;選択行コメントアウト&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Eclipse風なコメントアウト&lt;br /&gt;
// 複数行一括コメントアウト，復帰マクロ&lt;br /&gt;
// 1) 対象は行全体(行途中の選択も行全体とみなす)&lt;br /&gt;
// 2) 空白行はコメントアウトしない&lt;br /&gt;
// 3) インデントは選択行の範囲で一番左(タブ幅単位)に合わせる&lt;br /&gt;
// 4) 選択範囲全体がコメントアウトされている場合は復帰&lt;br /&gt;
//&lt;br /&gt;
// Copyright (c) ks. All Rights Reserved.&lt;br /&gt;
// www:   http://merysmacro.seesaa.net/&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// a) 最終行の先頭までの選択状態では、最終行は処理範囲外にする(行選択対応)&lt;br /&gt;
// b) コメント文字の種類を追加(Mery標準で単一行コメント可能な編集モード全て対応)&lt;br /&gt;
// c) スペースが含まれるコメント文字に対応&lt;br /&gt;
// d) コメント文字が正規表現文字でも正しく動作するようにした&lt;br /&gt;
// e) コメント文字不明時、SHIFTキー押下起動時はコメント文字を入力できるようにした&lt;br /&gt;
//    (Mery.iniと同じ場所に設定ファイルとして一時記憶)&lt;br /&gt;
// f) 選択方向を維持するようにした(下から上への選択対応)&lt;br /&gt;
// g) 空白行で実行するとUndoされてしまう問題に対処&lt;br /&gt;
// h) OutputBarにフォーカスがある場合に処理できない問題に対処&lt;br /&gt;
//&lt;br /&gt;
// SHIFTキー状態取得のために、&amp;quot;GetKeyState.exe&amp;quot;が必要です&lt;br /&gt;
//&lt;br /&gt;
// Improved by pizz&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
var doc = editor.ActiveDocument;&lt;br /&gt;
var COM = &amp;quot;&amp;quot;; // 単一行コメント&lt;br /&gt;
var settingFilename = &amp;quot;_CommentMacro.ini&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
switch(doc.Mode.toLowerCase()){&lt;br /&gt;
case &amp;quot;bat&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;rem &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;c#&amp;quot;:&lt;br /&gt;
case &amp;quot;c++&amp;quot;:&lt;br /&gt;
case &amp;quot;coldfusion&amp;quot;:&lt;br /&gt;
case &amp;quot;delphi&amp;quot;:&lt;br /&gt;
case &amp;quot;java&amp;quot;:&lt;br /&gt;
case &amp;quot;javascript&amp;quot;:&lt;br /&gt;
case &amp;quot;jsp&amp;quot;:&lt;br /&gt;
case &amp;quot;php&amp;quot;:&lt;br /&gt;
case &amp;quot;uwsc&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;// &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;hsp&amp;quot;:&lt;br /&gt;
case &amp;quot;ini&amp;quot;:&lt;br /&gt;
case &amp;quot;x86 assembler&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;; &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;perl&amp;quot;:&lt;br /&gt;
case &amp;quot;perlscript&amp;quot;:&lt;br /&gt;
case &amp;quot;powershell&amp;quot;:&lt;br /&gt;
case &amp;quot;python&amp;quot;:&lt;br /&gt;
case &amp;quot;rhtml&amp;quot;:&lt;br /&gt;
case &amp;quot;ruby&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;# &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;sql&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;-- &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;tex&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;% &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;vbscript&amp;quot;:&lt;br /&gt;
case &amp;quot;visualbasic&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;&#039;&amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var wshShell = new ActiveXObject(&amp;quot;WScript.Shell&amp;quot;);&lt;br /&gt;
var fso = new ActiveXObject(&amp;quot;Scripting.FileSystemObject&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// カレントディレクトリをマクロディレクトリに変更&lt;br /&gt;
wshShell.CurrentDirectory = editor.FullName.match(/^.*\\/)[0] + &#039;Macros&#039;;&lt;br /&gt;
&lt;br /&gt;
// 設定ファイルからコメント文字を読み込む&lt;br /&gt;
var comSelected = LoadDocSetting();&lt;br /&gt;
if(comSelected != null){&lt;br /&gt;
  if(comSelected == &amp;quot;&amp;quot;) comSelected = COM;&lt;br /&gt;
&lt;br /&gt;
  var comTrim = comSelected.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;);  // スペースなしのコメント文字&lt;br /&gt;
&lt;br /&gt;
  // SHIFTキー状態を取得&lt;br /&gt;
  var shift = wshShell.Run(&amp;quot;GetKeyState.exe shift&amp;quot;, 0, true);&lt;br /&gt;
&lt;br /&gt;
  if(shift != -1){&lt;br /&gt;
    // コメント文字の入力を受ける&lt;br /&gt;
    if(comTrim == &amp;quot;&amp;quot; || shift == 1){&lt;br /&gt;
      var comInput = &amp;quot;// &amp;quot;;&lt;br /&gt;
      if(comTrim != &amp;quot;&amp;quot;) comInput = comSelected;&lt;br /&gt;
&lt;br /&gt;
      comInput = prompt(&amp;quot;コメント文字を指定してください&amp;quot;, comInput);&lt;br /&gt;
&lt;br /&gt;
      comTrim = comInput.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;); // スペースなしのコメント文字&lt;br /&gt;
      if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
        if(comInput != comSelected){&lt;br /&gt;
          SaveDocSetting(comInput);&lt;br /&gt;
          comSelected = comInput;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
      var meGetLineLogical = 0;&lt;br /&gt;
      var regOrg = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comSelected.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
      var regTrim = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comTrim.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
      var scrollY = window.ScrollY;&lt;br /&gt;
      var sel = doc.Selection;&lt;br /&gt;
      var st = sel.GetTopPointY(mePosLogical);&lt;br /&gt;
      var ed = sel.GetBottomPointY(mePosLogical);&lt;br /&gt;
      var ac = sel.GetActivePointY(mePosLogical);&lt;br /&gt;
      if(st != ed &amp;amp;&amp;amp; sel.GetBottomPointX(mePosLogical) == 1){&lt;br /&gt;
        // 複数行選択、最下行選択位置が行頭の場合は、最終行は除外&lt;br /&gt;
        ed--;&lt;br /&gt;
      }&lt;br /&gt;
      var tab = GetTabSpace();&lt;br /&gt;
&lt;br /&gt;
      sel.SetActivePoint(mePosLogical, doc.GetLine(ed, meGetLineLogical).length + 1, ed);&lt;br /&gt;
      sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
      var lines = sel.Text.split(&amp;quot;\n&amp;quot;)&lt;br /&gt;
      if(sel.Text.length &amp;gt; 0) sel.Untabify();&lt;br /&gt;
      var linesWithoutTab = sel.Text.split(&amp;quot;\n&amp;quot;);&lt;br /&gt;
      if(sel.Text.length &amp;gt; 0) doc.Undo();&lt;br /&gt;
&lt;br /&gt;
      // インデント取得&lt;br /&gt;
      var indent = -1;&lt;br /&gt;
      var existNotCommentLine = false;  // 空白・コメント行でない行が存在するか&lt;br /&gt;
      for(var i=0, len = linesWithoutTab.length; i &amp;lt; len; i++){&lt;br /&gt;
        var line = linesWithoutTab[i];&lt;br /&gt;
        var left = line.search(/[^ ]/);&lt;br /&gt;
        if(left &amp;gt;= 0 &amp;amp;&amp;amp; (indent &amp;lt; 0 || left &amp;lt; indent)){&lt;br /&gt;
          // インデントはタブ幅単位(左寄せ)&lt;br /&gt;
          indent = Math.floor(left / tab) * tab;&lt;br /&gt;
        }&lt;br /&gt;
        if(left &amp;gt;= 0){&lt;br /&gt;
          // コメント行判定&lt;br /&gt;
          if(!existNotCommentLine &amp;amp;&amp;amp; line.search(regTrim) == -1){&lt;br /&gt;
            existNotCommentLine = true;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var txt = &amp;quot;&amp;quot;;&lt;br /&gt;
      var changed = false;&lt;br /&gt;
      if(existNotCommentLine){&lt;br /&gt;
        // コメントアウト&lt;br /&gt;
        for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
          var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
          // 空白行はコメントアウトしない&lt;br /&gt;
          if(line.search(/[^ \t\n]/) == -1){&lt;br /&gt;
            txt += line;&lt;br /&gt;
            continue;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          // 挿入位置をタブと空白を考慮して決定&lt;br /&gt;
          var index = 0, j;&lt;br /&gt;
          for(j = 0; index &amp;lt; indent; j++){&lt;br /&gt;
            // indent の範囲には半角スペースかタブしかない&lt;br /&gt;
            if(line.charAt(j) == &amp;quot; &amp;quot;){&lt;br /&gt;
              index += 1;&lt;br /&gt;
            }else{&lt;br /&gt;
              index += tab - (index % tab);&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
          txt += line.substring(0, j) + comSelected + line.substring(j);&lt;br /&gt;
          changed = true;&lt;br /&gt;
        }&lt;br /&gt;
      }else{&lt;br /&gt;
        // コメントから復帰&lt;br /&gt;
        for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
          var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
          if(line.match(regTrim)){&lt;br /&gt;
            if(line.match(regOrg)){&lt;br /&gt;
              txt += line.replace(comSelected, &amp;quot;&amp;quot;); // 先頭のコメント(空白付き)の削除&lt;br /&gt;
            }else{&lt;br /&gt;
              txt += line.replace(comTrim, &amp;quot;&amp;quot;); // 先頭のコメント(空白なし)の削除&lt;br /&gt;
            }&lt;br /&gt;
            changed = true;&lt;br /&gt;
          }else{&lt;br /&gt;
            txt += line;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // コメントアウト部分を書き換えて，全体を選択&lt;br /&gt;
      if(doc.GetLine(ed + 1, meGetLineWithNewLines) == &amp;quot;&amp;quot;) txt = txt.substring(0, txt.length - 1);  // 最後の改行は除去&lt;br /&gt;
      if(ac == st){&lt;br /&gt;
        // 下から上への選択状態&lt;br /&gt;
        sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
        if(changed) sel.Text = txt;&lt;br /&gt;
        sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
      }else{&lt;br /&gt;
        // 上から下への選択状態&lt;br /&gt;
        sel.SetActivePoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
        if(changed) sel.Text = txt;&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
      }&lt;br /&gt;
      window.ScrollY = scrollY;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//========================================&lt;br /&gt;
// 関数&lt;br /&gt;
//========================================&lt;br /&gt;
// タブ幅を取得&lt;br /&gt;
function GetTabSpace()&lt;br /&gt;
{&lt;br /&gt;
  var doc = editor.ActiveDocument;&lt;br /&gt;
  var sel = doc.Selection;&lt;br /&gt;
  var saved = doc.Saved;&lt;br /&gt;
  sel.EndOfDocument();&lt;br /&gt;
  doc.Write(&amp;quot;\n\t&amp;quot;);&lt;br /&gt;
  sel.SetAnchorPoint(mePosLogical, sel.GetActivePointX(mePosLogical) - 1, sel.GetActivePointY(mePosLogical));&lt;br /&gt;
  sel.Untabify();&lt;br /&gt;
  var n = sel.Text.length;&lt;br /&gt;
  doc.Undo(); doc.Undo();&lt;br /&gt;
  doc.Saved = saved&lt;br /&gt;
&lt;br /&gt;
  return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&lt;br /&gt;
  if(dic == null) return null;&lt;br /&gt;
  var ret = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var key in dic){&lt;br /&gt;
    if(key.toLowerCase() == window.document.FullName.toLowerCase()){&lt;br /&gt;
      ret = dic[window.document.FullName.toLowerCase()];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// コメント文字設定をファイルに書き込み&lt;br /&gt;
function SaveDocSetting(comStr)&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&lt;br /&gt;
  if(dic != null){&lt;br /&gt;
    dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
    SaveDocSettingDataListWithOpend(dic);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 設定ファイルから全ての設定値を取得&lt;br /&gt;
function LoadDocSettingDataListWithOpend()&lt;br /&gt;
{&lt;br /&gt;
  var settingPath = GetSettingFilePath();&lt;br /&gt;
  if(settingPath == &amp;quot;&amp;quot;) return null;&lt;br /&gt;
&lt;br /&gt;
  var dic = {};&lt;br /&gt;
  var deleted = false;&lt;br /&gt;
  if(fso.FileExists(settingPath)){&lt;br /&gt;
    var tso = fso.OpenTextFile(settingPath, 1, false, -1);&lt;br /&gt;
    while(tso.AtEndOfStream == false){&lt;br /&gt;
      var setting = tso.ReadLine().split(&amp;quot;\t&amp;quot;, 2);&lt;br /&gt;
      var detect = false;&lt;br /&gt;
      for(var i = 0; i &amp;lt; window.Editors.Count; i++){&lt;br /&gt;
        for(var j = 0; j &amp;lt; window.Editors.Item(i).Documents.Count; j++){&lt;br /&gt;
          if(window.Editors.Item(i).Documents.Item(j).FullName.toLowerCase() == setting[0].toLowerCase()){&lt;br /&gt;
            dic[setting[0].toLowerCase()] = setting[1];&lt;br /&gt;
            detect = true;&lt;br /&gt;
            break;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        if(detect) break;&lt;br /&gt;
      }&lt;br /&gt;
      if(detect == false) deleted = true;&lt;br /&gt;
    }&lt;br /&gt;
    tso.Close();&lt;br /&gt;
  }&lt;br /&gt;
  if(deleted) SaveDocSettingDataListWithOpend(dic);&lt;br /&gt;
  return dic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 設定ファイルを全て書き換え&lt;br /&gt;
function SaveDocSettingDataListWithOpend(dic)&lt;br /&gt;
{&lt;br /&gt;
  var settingPath = GetSettingFilePath();&lt;br /&gt;
  if(settingPath != &amp;quot;&amp;quot;){&lt;br /&gt;
    var tso = fso.OpenTextFile(settingPath, 2, true, -1);&lt;br /&gt;
    for(var key in dic){&lt;br /&gt;
      tso.WriteLine(key + &amp;quot;\t&amp;quot; + dic[key]);&lt;br /&gt;
    }&lt;br /&gt;
    tso.Close();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// コメント文字設定ファイルの場所を取得する&lt;br /&gt;
function GetSettingFilePath()&lt;br /&gt;
{&lt;br /&gt;
  var meryDir = fso.GetParentFolderName(editor.FullName);&lt;br /&gt;
  var settingPath = &amp;quot;&amp;quot;;&lt;br /&gt;
  if(fso.FileExists(fso.BuildPath(meryDir, &amp;quot;Mery.ini&amp;quot;))){&lt;br /&gt;
    settingPath = fso.BuildPath(meryDir, settingFilename);&lt;br /&gt;
  }else{&lt;br /&gt;
    var appDataPath = fso.BuildPath(wshShell.SpecialFolders(&#039;Appdata&#039;), &#039;Mery&#039;);&lt;br /&gt;
    if(fso.FileExists(fso.BuildPath(appDataPath, &amp;quot;Mery.ini&amp;quot;))){&lt;br /&gt;
      settingPath = fso.BuildPath(appDataPath, settingFilename);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if(settingPath == &amp;quot;&amp;quot;){&lt;br /&gt;
    window.Alert(&amp;quot;Mery.ini ファイルが見つかりません&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>92.202.159.41</name></author>
	</entry>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=Eclipse%E9%A2%A8%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88(%E6%94%B9)&amp;diff=4952</id>
		<title>Eclipse風コメントアウト(改)</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=Eclipse%E9%A2%A8%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88(%E6%94%B9)&amp;diff=4952"/>
		<updated>2020-03-15T07:15:09Z</updated>

		<summary type="html">&lt;p&gt;92.202.159.41: /* 更新履歴 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
Eclipse風なコメントアウト &amp;lt;=&amp;gt; コメントの除去を行います。&lt;br /&gt;
&lt;br /&gt;
ksさんの作成された、[[Eclipse風コメントアウト]]は、私にとって欠かせないツールです。&lt;br /&gt;
&lt;br /&gt;
便利に使わせていただく一方、細かい挙動が気になって変更したり、機能を追加しているうちに、すっかり別物になってしまいました。&lt;br /&gt;
&lt;br /&gt;
オリジナルを作成されたksさんに感謝するとともに、せっかく作成したので改造版をここに公開します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Shiftキーの状態を取得するために、[[GetKeyState.exe(キー状態取得実行ファイル)]]を使用しています。&lt;br /&gt;
&lt;br /&gt;
本体マクロと併せて上記実行ファイルも必要になります。&lt;br /&gt;
&lt;br /&gt;
zipファイルをダウンロードしたら、ファイルのプロパティ画面で「ブロックの解除」を行ってください。&lt;br /&gt;
(これをしないと実行時に警告が表示されることがあります)&lt;br /&gt;
&lt;br /&gt;
その後、zipファイルを展開して、Macrosフォルダーに配置してください。&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2019/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
2019/4/12 window.Quit() メソッドの使用排除&lt;br /&gt;
&lt;br /&gt;
2020/3/15 Mery 3.0.0以降対応版の追加(document.tagプロパティを使用)&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
このスクリプトはMery Ver.3.0.0以降対応版です&lt;br /&gt;
Mery Ver.3.0.0未満の環境では、後半のスクリプトを利用してください&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
#icon = &amp;quot;_Comment.ico&amp;quot;&lt;br /&gt;
#title = &amp;quot;選択行コメントアウト&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// このスクリプトはMery Ver.3.0.0以降対応版です&lt;br /&gt;
// Ver.3.0.0未満の環境では動作しません&lt;br /&gt;
&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Eclipse風なコメントアウト&lt;br /&gt;
// 複数行一括コメントアウト，復帰マクロ&lt;br /&gt;
// 1) 対象は行全体(行途中の選択も行全体とみなす)&lt;br /&gt;
// 2) 空白行はコメントアウトしない&lt;br /&gt;
// 3) インデントは選択行の範囲で一番左(タブ幅単位)に合わせる&lt;br /&gt;
// 4) 選択範囲全体がコメントアウトされている場合は復帰&lt;br /&gt;
//&lt;br /&gt;
// Copyright (c) ks. All Rights Reserved.&lt;br /&gt;
// www:		http://merysmacro.seesaa.net/&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// a) 最終行の先頭までの選択状態では、最終行は処理範囲外にする(行選択対応)&lt;br /&gt;
// b) コメント文字の種類を追加(Mery標準で単一行コメント可能な編集モード全て対応)&lt;br /&gt;
// c) スペースが含まれるコメント文字に対応&lt;br /&gt;
// d) コメント文字が正規表現文字でも正しく動作するようにした&lt;br /&gt;
// e) コメント文字不明時、SHIFTキー押下起動時はコメント文字を入力できるようにした&lt;br /&gt;
// f) 選択方向を維持するようにした(下から上への選択対応)&lt;br /&gt;
// g) 空白行で実行するとUndoされてしまう問題に対処&lt;br /&gt;
// h) OutputBarにフォーカスがある場合に処理できない問題に対処&lt;br /&gt;
//&lt;br /&gt;
// SHIFTキー状態取得のために、&amp;quot;GetKeyState.exe&amp;quot;が必要です&lt;br /&gt;
//&lt;br /&gt;
// Improved by pizz&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
var doc = editor.ActiveDocument;&lt;br /&gt;
var COM = &amp;quot;&amp;quot;;	// 単一行コメント&lt;br /&gt;
var TAGKEY = &amp;quot;pizzComment&amp;quot;&lt;br /&gt;
var settingFilename = &amp;quot;_CommentMacro.ini&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
switch(doc.Mode.toLowerCase()){&lt;br /&gt;
case &amp;quot;bat&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;rem &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;c#&amp;quot;:&lt;br /&gt;
case &amp;quot;c++&amp;quot;:&lt;br /&gt;
case &amp;quot;coldfusion&amp;quot;:&lt;br /&gt;
case &amp;quot;delphi&amp;quot;:&lt;br /&gt;
case &amp;quot;java&amp;quot;:&lt;br /&gt;
case &amp;quot;javascript&amp;quot;:&lt;br /&gt;
case &amp;quot;jsp&amp;quot;:&lt;br /&gt;
case &amp;quot;php&amp;quot;:&lt;br /&gt;
case &amp;quot;uwsc&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;// &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;hsp&amp;quot;:&lt;br /&gt;
case &amp;quot;ini&amp;quot;:&lt;br /&gt;
case &amp;quot;x86 assembler&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;; &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;perl&amp;quot;:&lt;br /&gt;
case &amp;quot;perlscript&amp;quot;:&lt;br /&gt;
case &amp;quot;powershell&amp;quot;:&lt;br /&gt;
case &amp;quot;python&amp;quot;:&lt;br /&gt;
case &amp;quot;rhtml&amp;quot;:&lt;br /&gt;
case &amp;quot;ruby&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;# &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;sql&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;-- &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;tex&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;% &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;vbscript&amp;quot;:&lt;br /&gt;
case &amp;quot;visualbasic&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;&#039;&amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var wshShell = new ActiveXObject(&amp;quot;WScript.Shell&amp;quot;);&lt;br /&gt;
var fso = new ActiveXObject(&amp;quot;Scripting.FileSystemObject&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// カレントディレクトリをマクロディレクトリに変更&lt;br /&gt;
wshShell.CurrentDirectory = editor.FullName.match(/^.*\\/)[0] + &#039;Macros&#039;;&lt;br /&gt;
&lt;br /&gt;
// タグ設定を取得&lt;br /&gt;
var comSelected = &amp;quot;&amp;quot;;&lt;br /&gt;
if(document.tag.exists(TAGKEY)) comSelected = document.tag(TAGKEY);&lt;br /&gt;
if(comSelected == &amp;quot;&amp;quot;) comSelected = COM;&lt;br /&gt;
var comTrim = comSelected.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;);	// スペースなしのコメント文字&lt;br /&gt;
&lt;br /&gt;
// SHIFTキー状態を取得&lt;br /&gt;
var shift = wshShell.Run(&amp;quot;GetKeyState.exe shift&amp;quot;, 0, true);&lt;br /&gt;
&lt;br /&gt;
if(shift != -1){&lt;br /&gt;
	// コメント文字の入力を受ける&lt;br /&gt;
	if(comTrim == &amp;quot;&amp;quot; || shift == 1){&lt;br /&gt;
		var comInput = &amp;quot;// &amp;quot;;&lt;br /&gt;
		if(comTrim != &amp;quot;&amp;quot;) comInput = comSelected;&lt;br /&gt;
&lt;br /&gt;
		comInput = prompt(&amp;quot;コメント文字を指定してください&amp;quot;, comInput);&lt;br /&gt;
&lt;br /&gt;
		comTrim = comInput.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;);	// スペースなしのコメント文字&lt;br /&gt;
		if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
			comSelected = comInput;&lt;br /&gt;
			document.tag(TAGKEY) = comSelected;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
		var meGetLineLogical = 0;&lt;br /&gt;
		var regOrg = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comSelected.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
		var regTrim = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comTrim.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
		var scrollY = window.ScrollY;&lt;br /&gt;
		var sel = doc.Selection;&lt;br /&gt;
		var st = sel.GetTopPointY(mePosLogical);&lt;br /&gt;
		var ed = sel.GetBottomPointY(mePosLogical);&lt;br /&gt;
		var ac = sel.GetActivePointY(mePosLogical);&lt;br /&gt;
		if(st != ed &amp;amp;&amp;amp; sel.GetBottomPointX(mePosLogical) == 1){&lt;br /&gt;
			// 複数行選択、最下行選択位置が行頭の場合は、最終行は除外&lt;br /&gt;
			ed--;&lt;br /&gt;
		}&lt;br /&gt;
		var tab = GetTabSpace();&lt;br /&gt;
&lt;br /&gt;
		sel.SetActivePoint(mePosLogical, doc.GetLine(ed, meGetLineLogical).length + 1, ed);&lt;br /&gt;
		sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
		var lines = sel.Text.split(&amp;quot;\n&amp;quot;)&lt;br /&gt;
		if(sel.Text.length &amp;gt; 0) sel.Untabify();&lt;br /&gt;
		var linesWithoutTab = sel.Text.split(&amp;quot;\n&amp;quot;);&lt;br /&gt;
		if(sel.Text.length &amp;gt; 0) doc.Undo();&lt;br /&gt;
&lt;br /&gt;
		// インデント取得&lt;br /&gt;
		var indent = -1;&lt;br /&gt;
		var existNotCommentLine = false;	// 空白・コメント行でない行が存在するか&lt;br /&gt;
		for(var i=0, len = linesWithoutTab.length; i &amp;lt; len; i++){&lt;br /&gt;
			var line = linesWithoutTab[i];&lt;br /&gt;
			var left = line.search(/[^ ]/);&lt;br /&gt;
			if(left &amp;gt;= 0 &amp;amp;&amp;amp; (indent &amp;lt; 0 || left &amp;lt; indent)){&lt;br /&gt;
				// インデントはタブ幅単位(左寄せ)&lt;br /&gt;
				indent = Math.floor(left / tab) * tab;&lt;br /&gt;
			}&lt;br /&gt;
			if(left &amp;gt;= 0){&lt;br /&gt;
				// コメント行判定&lt;br /&gt;
				if(!existNotCommentLine &amp;amp;&amp;amp; line.search(regTrim) == -1){&lt;br /&gt;
					existNotCommentLine = true;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var txt = &amp;quot;&amp;quot;;&lt;br /&gt;
		var changed = false;&lt;br /&gt;
		if(existNotCommentLine){&lt;br /&gt;
			// コメントアウト&lt;br /&gt;
			for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
				var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
				// 空白行はコメントアウトしない&lt;br /&gt;
				if(line.search(/[^ \t\n]/) == -1){&lt;br /&gt;
					txt += line;&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				// 挿入位置をタブと空白を考慮して決定&lt;br /&gt;
				var index = 0, j;&lt;br /&gt;
				for(j = 0; index &amp;lt; indent; j++){&lt;br /&gt;
					// indent の範囲には半角スペースかタブしかない&lt;br /&gt;
					if(line.charAt(j) == &amp;quot; &amp;quot;){&lt;br /&gt;
						index += 1;&lt;br /&gt;
					}else{&lt;br /&gt;
						index += tab - (index % tab);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				txt += line.substring(0, j) + comSelected + line.substring(j);&lt;br /&gt;
				changed = true;&lt;br /&gt;
			}&lt;br /&gt;
		}else{&lt;br /&gt;
			// コメントから復帰&lt;br /&gt;
			for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
				var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
				if(line.match(regTrim)){&lt;br /&gt;
					if(line.match(regOrg)){&lt;br /&gt;
						txt += line.replace(comSelected, &amp;quot;&amp;quot;);	// 先頭のコメント(空白付き)の削除&lt;br /&gt;
					}else{&lt;br /&gt;
						txt += line.replace(comTrim, &amp;quot;&amp;quot;);	// 先頭のコメント(空白なし)の削除&lt;br /&gt;
					}&lt;br /&gt;
					changed = true;&lt;br /&gt;
				}else{&lt;br /&gt;
					txt += line;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// コメントアウト部分を書き換えて，全体を選択&lt;br /&gt;
		if(doc.GetLine(ed + 1, meGetLineWithNewLines) == &amp;quot;&amp;quot;) txt = txt.substring(0, txt.length - 1);	// 最後の改行は除去&lt;br /&gt;
		if(ac == st){&lt;br /&gt;
			// 下から上への選択状態&lt;br /&gt;
			sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
			if(changed) sel.Text = txt;&lt;br /&gt;
			sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
		}else{&lt;br /&gt;
			// 上から下への選択状態&lt;br /&gt;
			sel.SetActivePoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
			if(changed) sel.Text = txt;&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
		}&lt;br /&gt;
		window.ScrollY = scrollY;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//========================================&lt;br /&gt;
// 関数&lt;br /&gt;
//========================================&lt;br /&gt;
// タブ幅を取得&lt;br /&gt;
function GetTabSpace()&lt;br /&gt;
{&lt;br /&gt;
	var doc = editor.ActiveDocument;&lt;br /&gt;
	var sel = doc.Selection;&lt;br /&gt;
	var saved = doc.Saved;&lt;br /&gt;
	sel.EndOfDocument();&lt;br /&gt;
	doc.Write(&amp;quot;\n\t&amp;quot;);&lt;br /&gt;
	sel.SetAnchorPoint(mePosLogical, sel.GetActivePointX(mePosLogical) - 1, sel.GetActivePointY(mePosLogical));&lt;br /&gt;
	sel.Untabify();&lt;br /&gt;
	var n = sel.Text.length;&lt;br /&gt;
	doc.Undo(); doc.Undo();&lt;br /&gt;
	doc.Saved = saved&lt;br /&gt;
&lt;br /&gt;
	return n;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以下は、Mery Ver.3.0.0未満の環境でも利用できます&lt;br /&gt;
(3.0.0以降でも動作しますが、上のバージョンの利用をお勧めします)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
#icon = &amp;quot;_Comment.ico&amp;quot;&lt;br /&gt;
#title = &amp;quot;選択行コメントアウト&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Eclipse風なコメントアウト&lt;br /&gt;
// 複数行一括コメントアウト，復帰マクロ&lt;br /&gt;
// 1) 対象は行全体(行途中の選択も行全体とみなす)&lt;br /&gt;
// 2) 空白行はコメントアウトしない&lt;br /&gt;
// 3) インデントは選択行の範囲で一番左(タブ幅単位)に合わせる&lt;br /&gt;
// 4) 選択範囲全体がコメントアウトされている場合は復帰&lt;br /&gt;
//&lt;br /&gt;
// Copyright (c) ks. All Rights Reserved.&lt;br /&gt;
// www:   http://merysmacro.seesaa.net/&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// a) 最終行の先頭までの選択状態では、最終行は処理範囲外にする(行選択対応)&lt;br /&gt;
// b) コメント文字の種類を追加(Mery標準で単一行コメント可能な編集モード全て対応)&lt;br /&gt;
// c) スペースが含まれるコメント文字に対応&lt;br /&gt;
// d) コメント文字が正規表現文字でも正しく動作するようにした&lt;br /&gt;
// e) コメント文字不明時、SHIFTキー押下起動時はコメント文字を入力できるようにした&lt;br /&gt;
//    (Mery.iniと同じ場所に設定ファイルとして一時記憶)&lt;br /&gt;
// f) 選択方向を維持するようにした(下から上への選択対応)&lt;br /&gt;
// g) 空白行で実行するとUndoされてしまう問題に対処&lt;br /&gt;
// h) OutputBarにフォーカスがある場合に処理できない問題に対処&lt;br /&gt;
//&lt;br /&gt;
// SHIFTキー状態取得のために、&amp;quot;GetKeyState.exe&amp;quot;が必要です&lt;br /&gt;
//&lt;br /&gt;
// Improved by pizz&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
var doc = editor.ActiveDocument;&lt;br /&gt;
var COM = &amp;quot;&amp;quot;; // 単一行コメント&lt;br /&gt;
var settingFilename = &amp;quot;_CommentMacro.ini&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
switch(doc.Mode.toLowerCase()){&lt;br /&gt;
case &amp;quot;bat&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;rem &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;c#&amp;quot;:&lt;br /&gt;
case &amp;quot;c++&amp;quot;:&lt;br /&gt;
case &amp;quot;coldfusion&amp;quot;:&lt;br /&gt;
case &amp;quot;delphi&amp;quot;:&lt;br /&gt;
case &amp;quot;java&amp;quot;:&lt;br /&gt;
case &amp;quot;javascript&amp;quot;:&lt;br /&gt;
case &amp;quot;jsp&amp;quot;:&lt;br /&gt;
case &amp;quot;php&amp;quot;:&lt;br /&gt;
case &amp;quot;uwsc&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;// &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;hsp&amp;quot;:&lt;br /&gt;
case &amp;quot;ini&amp;quot;:&lt;br /&gt;
case &amp;quot;x86 assembler&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;; &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;perl&amp;quot;:&lt;br /&gt;
case &amp;quot;perlscript&amp;quot;:&lt;br /&gt;
case &amp;quot;powershell&amp;quot;:&lt;br /&gt;
case &amp;quot;python&amp;quot;:&lt;br /&gt;
case &amp;quot;rhtml&amp;quot;:&lt;br /&gt;
case &amp;quot;ruby&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;# &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;sql&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;-- &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;tex&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;% &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;vbscript&amp;quot;:&lt;br /&gt;
case &amp;quot;visualbasic&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;&#039;&amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var wshShell = new ActiveXObject(&amp;quot;WScript.Shell&amp;quot;);&lt;br /&gt;
var fso = new ActiveXObject(&amp;quot;Scripting.FileSystemObject&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// カレントディレクトリをマクロディレクトリに変更&lt;br /&gt;
wshShell.CurrentDirectory = editor.FullName.match(/^.*\\/)[0] + &#039;Macros&#039;;&lt;br /&gt;
&lt;br /&gt;
// 設定ファイルからコメント文字を読み込む&lt;br /&gt;
var comSelected = LoadDocSetting();&lt;br /&gt;
if(comSelected != null){&lt;br /&gt;
  if(comSelected == &amp;quot;&amp;quot;) comSelected = COM;&lt;br /&gt;
&lt;br /&gt;
  var comTrim = comSelected.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;);  // スペースなしのコメント文字&lt;br /&gt;
&lt;br /&gt;
  // SHIFTキー状態を取得&lt;br /&gt;
  var shift = wshShell.Run(&amp;quot;GetKeyState.exe shift&amp;quot;, 0, true);&lt;br /&gt;
&lt;br /&gt;
  if(shift != -1){&lt;br /&gt;
    // コメント文字の入力を受ける&lt;br /&gt;
    if(comTrim == &amp;quot;&amp;quot; || shift == 1){&lt;br /&gt;
      var comInput = &amp;quot;// &amp;quot;;&lt;br /&gt;
      if(comTrim != &amp;quot;&amp;quot;) comInput = comSelected;&lt;br /&gt;
&lt;br /&gt;
      comInput = prompt(&amp;quot;コメント文字を指定してください&amp;quot;, comInput);&lt;br /&gt;
&lt;br /&gt;
      comTrim = comInput.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;); // スペースなしのコメント文字&lt;br /&gt;
      if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
        if(comInput != comSelected){&lt;br /&gt;
          SaveDocSetting(comInput);&lt;br /&gt;
          comSelected = comInput;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
      var meGetLineLogical = 0;&lt;br /&gt;
      var regOrg = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comSelected.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
      var regTrim = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comTrim.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
      var scrollY = window.ScrollY;&lt;br /&gt;
      var sel = doc.Selection;&lt;br /&gt;
      var st = sel.GetTopPointY(mePosLogical);&lt;br /&gt;
      var ed = sel.GetBottomPointY(mePosLogical);&lt;br /&gt;
      var ac = sel.GetActivePointY(mePosLogical);&lt;br /&gt;
      if(st != ed &amp;amp;&amp;amp; sel.GetBottomPointX(mePosLogical) == 1){&lt;br /&gt;
        // 複数行選択、最下行選択位置が行頭の場合は、最終行は除外&lt;br /&gt;
        ed--;&lt;br /&gt;
      }&lt;br /&gt;
      var tab = GetTabSpace();&lt;br /&gt;
&lt;br /&gt;
      sel.SetActivePoint(mePosLogical, doc.GetLine(ed, meGetLineLogical).length + 1, ed);&lt;br /&gt;
      sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
      var lines = sel.Text.split(&amp;quot;\n&amp;quot;)&lt;br /&gt;
      if(sel.Text.length &amp;gt; 0) sel.Untabify();&lt;br /&gt;
      var linesWithoutTab = sel.Text.split(&amp;quot;\n&amp;quot;);&lt;br /&gt;
      if(sel.Text.length &amp;gt; 0) doc.Undo();&lt;br /&gt;
&lt;br /&gt;
      // インデント取得&lt;br /&gt;
      var indent = -1;&lt;br /&gt;
      var existNotCommentLine = false;  // 空白・コメント行でない行が存在するか&lt;br /&gt;
      for(var i=0, len = linesWithoutTab.length; i &amp;lt; len; i++){&lt;br /&gt;
        var line = linesWithoutTab[i];&lt;br /&gt;
        var left = line.search(/[^ ]/);&lt;br /&gt;
        if(left &amp;gt;= 0 &amp;amp;&amp;amp; (indent &amp;lt; 0 || left &amp;lt; indent)){&lt;br /&gt;
          // インデントはタブ幅単位(左寄せ)&lt;br /&gt;
          indent = Math.floor(left / tab) * tab;&lt;br /&gt;
        }&lt;br /&gt;
        if(left &amp;gt;= 0){&lt;br /&gt;
          // コメント行判定&lt;br /&gt;
          if(!existNotCommentLine &amp;amp;&amp;amp; line.search(regTrim) == -1){&lt;br /&gt;
            existNotCommentLine = true;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var txt = &amp;quot;&amp;quot;;&lt;br /&gt;
      var changed = false;&lt;br /&gt;
      if(existNotCommentLine){&lt;br /&gt;
        // コメントアウト&lt;br /&gt;
        for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
          var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
          // 空白行はコメントアウトしない&lt;br /&gt;
          if(line.search(/[^ \t\n]/) == -1){&lt;br /&gt;
            txt += line;&lt;br /&gt;
            continue;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          // 挿入位置をタブと空白を考慮して決定&lt;br /&gt;
          var index = 0, j;&lt;br /&gt;
          for(j = 0; index &amp;lt; indent; j++){&lt;br /&gt;
            // indent の範囲には半角スペースかタブしかない&lt;br /&gt;
            if(line.charAt(j) == &amp;quot; &amp;quot;){&lt;br /&gt;
              index += 1;&lt;br /&gt;
            }else{&lt;br /&gt;
              index += tab - (index % tab);&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
          txt += line.substring(0, j) + comSelected + line.substring(j);&lt;br /&gt;
          changed = true;&lt;br /&gt;
        }&lt;br /&gt;
      }else{&lt;br /&gt;
        // コメントから復帰&lt;br /&gt;
        for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
          var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
          if(line.match(regTrim)){&lt;br /&gt;
            if(line.match(regOrg)){&lt;br /&gt;
              txt += line.replace(comSelected, &amp;quot;&amp;quot;); // 先頭のコメント(空白付き)の削除&lt;br /&gt;
            }else{&lt;br /&gt;
              txt += line.replace(comTrim, &amp;quot;&amp;quot;); // 先頭のコメント(空白なし)の削除&lt;br /&gt;
            }&lt;br /&gt;
            changed = true;&lt;br /&gt;
          }else{&lt;br /&gt;
            txt += line;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // コメントアウト部分を書き換えて，全体を選択&lt;br /&gt;
      if(doc.GetLine(ed + 1, meGetLineWithNewLines) == &amp;quot;&amp;quot;) txt = txt.substring(0, txt.length - 1);  // 最後の改行は除去&lt;br /&gt;
      if(ac == st){&lt;br /&gt;
        // 下から上への選択状態&lt;br /&gt;
        sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
        if(changed) sel.Text = txt;&lt;br /&gt;
        sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
      }else{&lt;br /&gt;
        // 上から下への選択状態&lt;br /&gt;
        sel.SetActivePoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
        if(changed) sel.Text = txt;&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
      }&lt;br /&gt;
      window.ScrollY = scrollY;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//========================================&lt;br /&gt;
// 関数&lt;br /&gt;
//========================================&lt;br /&gt;
// タブ幅を取得&lt;br /&gt;
function GetTabSpace()&lt;br /&gt;
{&lt;br /&gt;
  var doc = editor.ActiveDocument;&lt;br /&gt;
  var sel = doc.Selection;&lt;br /&gt;
  var saved = doc.Saved;&lt;br /&gt;
  sel.EndOfDocument();&lt;br /&gt;
  doc.Write(&amp;quot;\n\t&amp;quot;);&lt;br /&gt;
  sel.SetAnchorPoint(mePosLogical, sel.GetActivePointX(mePosLogical) - 1, sel.GetActivePointY(mePosLogical));&lt;br /&gt;
  sel.Untabify();&lt;br /&gt;
  var n = sel.Text.length;&lt;br /&gt;
  doc.Undo(); doc.Undo();&lt;br /&gt;
  doc.Saved = saved&lt;br /&gt;
&lt;br /&gt;
  return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&lt;br /&gt;
  if(dic == null) return null;&lt;br /&gt;
  var ret = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var key in dic){&lt;br /&gt;
    if(key.toLowerCase() == window.document.FullName.toLowerCase()){&lt;br /&gt;
      ret = dic[window.document.FullName.toLowerCase()];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// コメント文字設定をファイルに書き込み&lt;br /&gt;
function SaveDocSetting(comStr)&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&lt;br /&gt;
  if(dic != null){&lt;br /&gt;
    dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
    SaveDocSettingDataListWithOpend(dic);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 設定ファイルから全ての設定値を取得&lt;br /&gt;
function LoadDocSettingDataListWithOpend()&lt;br /&gt;
{&lt;br /&gt;
  var settingPath = GetSettingFilePath();&lt;br /&gt;
  if(settingPath == &amp;quot;&amp;quot;) return null;&lt;br /&gt;
&lt;br /&gt;
  var dic = {};&lt;br /&gt;
  var deleted = false;&lt;br /&gt;
  if(fso.FileExists(settingPath)){&lt;br /&gt;
    var tso = fso.OpenTextFile(settingPath, 1, false, -1);&lt;br /&gt;
    while(tso.AtEndOfStream == false){&lt;br /&gt;
      var setting = tso.ReadLine().split(&amp;quot;\t&amp;quot;, 2);&lt;br /&gt;
      var detect = false;&lt;br /&gt;
      for(var i = 0; i &amp;lt; window.Editors.Count; i++){&lt;br /&gt;
        for(var j = 0; j &amp;lt; window.Editors.Item(i).Documents.Count; j++){&lt;br /&gt;
          if(window.Editors.Item(i).Documents.Item(j).FullName.toLowerCase() == setting[0].toLowerCase()){&lt;br /&gt;
            dic[setting[0].toLowerCase()] = setting[1];&lt;br /&gt;
            detect = true;&lt;br /&gt;
            break;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        if(detect) break;&lt;br /&gt;
      }&lt;br /&gt;
      if(detect == false) deleted = true;&lt;br /&gt;
    }&lt;br /&gt;
    tso.Close();&lt;br /&gt;
  }&lt;br /&gt;
  if(deleted) SaveDocSettingDataListWithOpend(dic);&lt;br /&gt;
  return dic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 設定ファイルを全て書き換え&lt;br /&gt;
function SaveDocSettingDataListWithOpend(dic)&lt;br /&gt;
{&lt;br /&gt;
  var settingPath = GetSettingFilePath();&lt;br /&gt;
  if(settingPath != &amp;quot;&amp;quot;){&lt;br /&gt;
    var tso = fso.OpenTextFile(settingPath, 2, true, -1);&lt;br /&gt;
    for(var key in dic){&lt;br /&gt;
      tso.WriteLine(key + &amp;quot;\t&amp;quot; + dic[key]);&lt;br /&gt;
    }&lt;br /&gt;
    tso.Close();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// コメント文字設定ファイルの場所を取得する&lt;br /&gt;
function GetSettingFilePath()&lt;br /&gt;
{&lt;br /&gt;
  var meryDir = fso.GetParentFolderName(editor.FullName);&lt;br /&gt;
  var settingPath = &amp;quot;&amp;quot;;&lt;br /&gt;
  if(fso.FileExists(fso.BuildPath(meryDir, &amp;quot;Mery.ini&amp;quot;))){&lt;br /&gt;
    settingPath = fso.BuildPath(meryDir, settingFilename);&lt;br /&gt;
  }else{&lt;br /&gt;
    var appDataPath = fso.BuildPath(wshShell.SpecialFolders(&#039;Appdata&#039;), &#039;Mery&#039;);&lt;br /&gt;
    if(fso.FileExists(fso.BuildPath(appDataPath, &amp;quot;Mery.ini&amp;quot;))){&lt;br /&gt;
      settingPath = fso.BuildPath(appDataPath, settingFilename);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if(settingPath == &amp;quot;&amp;quot;){&lt;br /&gt;
    window.Alert(&amp;quot;Mery.ini ファイルが見つかりません&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>92.202.159.41</name></author>
	</entry>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=Eclipse%E9%A2%A8%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88(%E6%94%B9)&amp;diff=4951</id>
		<title>Eclipse風コメントアウト(改)</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=Eclipse%E9%A2%A8%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88(%E6%94%B9)&amp;diff=4951"/>
		<updated>2020-03-15T07:12:54Z</updated>

		<summary type="html">&lt;p&gt;92.202.159.41: /* コード */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
Eclipse風なコメントアウト &amp;lt;=&amp;gt; コメントの除去を行います。&lt;br /&gt;
&lt;br /&gt;
ksさんの作成された、[[Eclipse風コメントアウト]]は、私にとって欠かせないツールです。&lt;br /&gt;
&lt;br /&gt;
便利に使わせていただく一方、細かい挙動が気になって変更したり、機能を追加しているうちに、すっかり別物になってしまいました。&lt;br /&gt;
&lt;br /&gt;
オリジナルを作成されたksさんに感謝するとともに、せっかく作成したので改造版をここに公開します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Shiftキーの状態を取得するために、[[GetKeyState.exe(キー状態取得実行ファイル)]]を使用しています。&lt;br /&gt;
&lt;br /&gt;
本体マクロと併せて上記実行ファイルも必要になります。&lt;br /&gt;
&lt;br /&gt;
zipファイルをダウンロードしたら、ファイルのプロパティ画面で「ブロックの解除」を行ってください。&lt;br /&gt;
(これをしないと実行時に警告が表示されることがあります)&lt;br /&gt;
&lt;br /&gt;
その後、zipファイルを展開して、Macrosフォルダーに配置してください。&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2019/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
2019/4/12 window.Quit() メソッドの使用排除&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
このスクリプトはMery Ver.3.0.0以降対応版です&lt;br /&gt;
Mery Ver.3.0.0未満の環境では、後半のスクリプトを利用してください&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
#icon = &amp;quot;_Comment.ico&amp;quot;&lt;br /&gt;
#title = &amp;quot;選択行コメントアウト&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// このスクリプトはMery Ver.3.0.0以降対応版です&lt;br /&gt;
// Ver.3.0.0未満の環境では動作しません&lt;br /&gt;
&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Eclipse風なコメントアウト&lt;br /&gt;
// 複数行一括コメントアウト，復帰マクロ&lt;br /&gt;
// 1) 対象は行全体(行途中の選択も行全体とみなす)&lt;br /&gt;
// 2) 空白行はコメントアウトしない&lt;br /&gt;
// 3) インデントは選択行の範囲で一番左(タブ幅単位)に合わせる&lt;br /&gt;
// 4) 選択範囲全体がコメントアウトされている場合は復帰&lt;br /&gt;
//&lt;br /&gt;
// Copyright (c) ks. All Rights Reserved.&lt;br /&gt;
// www:		http://merysmacro.seesaa.net/&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// a) 最終行の先頭までの選択状態では、最終行は処理範囲外にする(行選択対応)&lt;br /&gt;
// b) コメント文字の種類を追加(Mery標準で単一行コメント可能な編集モード全て対応)&lt;br /&gt;
// c) スペースが含まれるコメント文字に対応&lt;br /&gt;
// d) コメント文字が正規表現文字でも正しく動作するようにした&lt;br /&gt;
// e) コメント文字不明時、SHIFTキー押下起動時はコメント文字を入力できるようにした&lt;br /&gt;
// f) 選択方向を維持するようにした(下から上への選択対応)&lt;br /&gt;
// g) 空白行で実行するとUndoされてしまう問題に対処&lt;br /&gt;
// h) OutputBarにフォーカスがある場合に処理できない問題に対処&lt;br /&gt;
//&lt;br /&gt;
// SHIFTキー状態取得のために、&amp;quot;GetKeyState.exe&amp;quot;が必要です&lt;br /&gt;
//&lt;br /&gt;
// Improved by pizz&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
var doc = editor.ActiveDocument;&lt;br /&gt;
var COM = &amp;quot;&amp;quot;;	// 単一行コメント&lt;br /&gt;
var TAGKEY = &amp;quot;pizzComment&amp;quot;&lt;br /&gt;
var settingFilename = &amp;quot;_CommentMacro.ini&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
switch(doc.Mode.toLowerCase()){&lt;br /&gt;
case &amp;quot;bat&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;rem &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;c#&amp;quot;:&lt;br /&gt;
case &amp;quot;c++&amp;quot;:&lt;br /&gt;
case &amp;quot;coldfusion&amp;quot;:&lt;br /&gt;
case &amp;quot;delphi&amp;quot;:&lt;br /&gt;
case &amp;quot;java&amp;quot;:&lt;br /&gt;
case &amp;quot;javascript&amp;quot;:&lt;br /&gt;
case &amp;quot;jsp&amp;quot;:&lt;br /&gt;
case &amp;quot;php&amp;quot;:&lt;br /&gt;
case &amp;quot;uwsc&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;// &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;hsp&amp;quot;:&lt;br /&gt;
case &amp;quot;ini&amp;quot;:&lt;br /&gt;
case &amp;quot;x86 assembler&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;; &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;perl&amp;quot;:&lt;br /&gt;
case &amp;quot;perlscript&amp;quot;:&lt;br /&gt;
case &amp;quot;powershell&amp;quot;:&lt;br /&gt;
case &amp;quot;python&amp;quot;:&lt;br /&gt;
case &amp;quot;rhtml&amp;quot;:&lt;br /&gt;
case &amp;quot;ruby&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;# &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;sql&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;-- &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;tex&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;% &amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
case &amp;quot;vbscript&amp;quot;:&lt;br /&gt;
case &amp;quot;visualbasic&amp;quot;:&lt;br /&gt;
	COM = &amp;quot;&#039;&amp;quot;;&lt;br /&gt;
	break;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var wshShell = new ActiveXObject(&amp;quot;WScript.Shell&amp;quot;);&lt;br /&gt;
var fso = new ActiveXObject(&amp;quot;Scripting.FileSystemObject&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// カレントディレクトリをマクロディレクトリに変更&lt;br /&gt;
wshShell.CurrentDirectory = editor.FullName.match(/^.*\\/)[0] + &#039;Macros&#039;;&lt;br /&gt;
&lt;br /&gt;
// タグ設定を取得&lt;br /&gt;
var comSelected = &amp;quot;&amp;quot;;&lt;br /&gt;
if(document.tag.exists(TAGKEY)) comSelected = document.tag(TAGKEY);&lt;br /&gt;
if(comSelected == &amp;quot;&amp;quot;) comSelected = COM;&lt;br /&gt;
var comTrim = comSelected.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;);	// スペースなしのコメント文字&lt;br /&gt;
&lt;br /&gt;
// SHIFTキー状態を取得&lt;br /&gt;
var shift = wshShell.Run(&amp;quot;GetKeyState.exe shift&amp;quot;, 0, true);&lt;br /&gt;
&lt;br /&gt;
if(shift != -1){&lt;br /&gt;
	// コメント文字の入力を受ける&lt;br /&gt;
	if(comTrim == &amp;quot;&amp;quot; || shift == 1){&lt;br /&gt;
		var comInput = &amp;quot;// &amp;quot;;&lt;br /&gt;
		if(comTrim != &amp;quot;&amp;quot;) comInput = comSelected;&lt;br /&gt;
&lt;br /&gt;
		comInput = prompt(&amp;quot;コメント文字を指定してください&amp;quot;, comInput);&lt;br /&gt;
&lt;br /&gt;
		comTrim = comInput.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;);	// スペースなしのコメント文字&lt;br /&gt;
		if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
			comSelected = comInput;&lt;br /&gt;
			document.tag(TAGKEY) = comSelected;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
		var meGetLineLogical = 0;&lt;br /&gt;
		var regOrg = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comSelected.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
		var regTrim = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comTrim.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
		var scrollY = window.ScrollY;&lt;br /&gt;
		var sel = doc.Selection;&lt;br /&gt;
		var st = sel.GetTopPointY(mePosLogical);&lt;br /&gt;
		var ed = sel.GetBottomPointY(mePosLogical);&lt;br /&gt;
		var ac = sel.GetActivePointY(mePosLogical);&lt;br /&gt;
		if(st != ed &amp;amp;&amp;amp; sel.GetBottomPointX(mePosLogical) == 1){&lt;br /&gt;
			// 複数行選択、最下行選択位置が行頭の場合は、最終行は除外&lt;br /&gt;
			ed--;&lt;br /&gt;
		}&lt;br /&gt;
		var tab = GetTabSpace();&lt;br /&gt;
&lt;br /&gt;
		sel.SetActivePoint(mePosLogical, doc.GetLine(ed, meGetLineLogical).length + 1, ed);&lt;br /&gt;
		sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
		var lines = sel.Text.split(&amp;quot;\n&amp;quot;)&lt;br /&gt;
		if(sel.Text.length &amp;gt; 0) sel.Untabify();&lt;br /&gt;
		var linesWithoutTab = sel.Text.split(&amp;quot;\n&amp;quot;);&lt;br /&gt;
		if(sel.Text.length &amp;gt; 0) doc.Undo();&lt;br /&gt;
&lt;br /&gt;
		// インデント取得&lt;br /&gt;
		var indent = -1;&lt;br /&gt;
		var existNotCommentLine = false;	// 空白・コメント行でない行が存在するか&lt;br /&gt;
		for(var i=0, len = linesWithoutTab.length; i &amp;lt; len; i++){&lt;br /&gt;
			var line = linesWithoutTab[i];&lt;br /&gt;
			var left = line.search(/[^ ]/);&lt;br /&gt;
			if(left &amp;gt;= 0 &amp;amp;&amp;amp; (indent &amp;lt; 0 || left &amp;lt; indent)){&lt;br /&gt;
				// インデントはタブ幅単位(左寄せ)&lt;br /&gt;
				indent = Math.floor(left / tab) * tab;&lt;br /&gt;
			}&lt;br /&gt;
			if(left &amp;gt;= 0){&lt;br /&gt;
				// コメント行判定&lt;br /&gt;
				if(!existNotCommentLine &amp;amp;&amp;amp; line.search(regTrim) == -1){&lt;br /&gt;
					existNotCommentLine = true;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var txt = &amp;quot;&amp;quot;;&lt;br /&gt;
		var changed = false;&lt;br /&gt;
		if(existNotCommentLine){&lt;br /&gt;
			// コメントアウト&lt;br /&gt;
			for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
				var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
				// 空白行はコメントアウトしない&lt;br /&gt;
				if(line.search(/[^ \t\n]/) == -1){&lt;br /&gt;
					txt += line;&lt;br /&gt;
					continue;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				// 挿入位置をタブと空白を考慮して決定&lt;br /&gt;
				var index = 0, j;&lt;br /&gt;
				for(j = 0; index &amp;lt; indent; j++){&lt;br /&gt;
					// indent の範囲には半角スペースかタブしかない&lt;br /&gt;
					if(line.charAt(j) == &amp;quot; &amp;quot;){&lt;br /&gt;
						index += 1;&lt;br /&gt;
					}else{&lt;br /&gt;
						index += tab - (index % tab);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				txt += line.substring(0, j) + comSelected + line.substring(j);&lt;br /&gt;
				changed = true;&lt;br /&gt;
			}&lt;br /&gt;
		}else{&lt;br /&gt;
			// コメントから復帰&lt;br /&gt;
			for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
				var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
				if(line.match(regTrim)){&lt;br /&gt;
					if(line.match(regOrg)){&lt;br /&gt;
						txt += line.replace(comSelected, &amp;quot;&amp;quot;);	// 先頭のコメント(空白付き)の削除&lt;br /&gt;
					}else{&lt;br /&gt;
						txt += line.replace(comTrim, &amp;quot;&amp;quot;);	// 先頭のコメント(空白なし)の削除&lt;br /&gt;
					}&lt;br /&gt;
					changed = true;&lt;br /&gt;
				}else{&lt;br /&gt;
					txt += line;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// コメントアウト部分を書き換えて，全体を選択&lt;br /&gt;
		if(doc.GetLine(ed + 1, meGetLineWithNewLines) == &amp;quot;&amp;quot;) txt = txt.substring(0, txt.length - 1);	// 最後の改行は除去&lt;br /&gt;
		if(ac == st){&lt;br /&gt;
			// 下から上への選択状態&lt;br /&gt;
			sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
			if(changed) sel.Text = txt;&lt;br /&gt;
			sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
		}else{&lt;br /&gt;
			// 上から下への選択状態&lt;br /&gt;
			sel.SetActivePoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
			if(changed) sel.Text = txt;&lt;br /&gt;
			sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
		}&lt;br /&gt;
		window.ScrollY = scrollY;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//========================================&lt;br /&gt;
// 関数&lt;br /&gt;
//========================================&lt;br /&gt;
// タブ幅を取得&lt;br /&gt;
function GetTabSpace()&lt;br /&gt;
{&lt;br /&gt;
	var doc = editor.ActiveDocument;&lt;br /&gt;
	var sel = doc.Selection;&lt;br /&gt;
	var saved = doc.Saved;&lt;br /&gt;
	sel.EndOfDocument();&lt;br /&gt;
	doc.Write(&amp;quot;\n\t&amp;quot;);&lt;br /&gt;
	sel.SetAnchorPoint(mePosLogical, sel.GetActivePointX(mePosLogical) - 1, sel.GetActivePointY(mePosLogical));&lt;br /&gt;
	sel.Untabify();&lt;br /&gt;
	var n = sel.Text.length;&lt;br /&gt;
	doc.Undo(); doc.Undo();&lt;br /&gt;
	doc.Saved = saved&lt;br /&gt;
&lt;br /&gt;
	return n;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以下は、Mery Ver.3.0.0未満の環境でも利用できます&lt;br /&gt;
(3.0.0以降でも動作しますが、上のバージョンの利用をお勧めします)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
#icon = &amp;quot;_Comment.ico&amp;quot;&lt;br /&gt;
#title = &amp;quot;選択行コメントアウト&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// Eclipse風なコメントアウト&lt;br /&gt;
// 複数行一括コメントアウト，復帰マクロ&lt;br /&gt;
// 1) 対象は行全体(行途中の選択も行全体とみなす)&lt;br /&gt;
// 2) 空白行はコメントアウトしない&lt;br /&gt;
// 3) インデントは選択行の範囲で一番左(タブ幅単位)に合わせる&lt;br /&gt;
// 4) 選択範囲全体がコメントアウトされている場合は復帰&lt;br /&gt;
//&lt;br /&gt;
// Copyright (c) ks. All Rights Reserved.&lt;br /&gt;
// www:   http://merysmacro.seesaa.net/&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
// a) 最終行の先頭までの選択状態では、最終行は処理範囲外にする(行選択対応)&lt;br /&gt;
// b) コメント文字の種類を追加(Mery標準で単一行コメント可能な編集モード全て対応)&lt;br /&gt;
// c) スペースが含まれるコメント文字に対応&lt;br /&gt;
// d) コメント文字が正規表現文字でも正しく動作するようにした&lt;br /&gt;
// e) コメント文字不明時、SHIFTキー押下起動時はコメント文字を入力できるようにした&lt;br /&gt;
//    (Mery.iniと同じ場所に設定ファイルとして一時記憶)&lt;br /&gt;
// f) 選択方向を維持するようにした(下から上への選択対応)&lt;br /&gt;
// g) 空白行で実行するとUndoされてしまう問題に対処&lt;br /&gt;
// h) OutputBarにフォーカスがある場合に処理できない問題に対処&lt;br /&gt;
//&lt;br /&gt;
// SHIFTキー状態取得のために、&amp;quot;GetKeyState.exe&amp;quot;が必要です&lt;br /&gt;
//&lt;br /&gt;
// Improved by pizz&lt;br /&gt;
// -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
var doc = editor.ActiveDocument;&lt;br /&gt;
var COM = &amp;quot;&amp;quot;; // 単一行コメント&lt;br /&gt;
var settingFilename = &amp;quot;_CommentMacro.ini&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
switch(doc.Mode.toLowerCase()){&lt;br /&gt;
case &amp;quot;bat&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;rem &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;c#&amp;quot;:&lt;br /&gt;
case &amp;quot;c++&amp;quot;:&lt;br /&gt;
case &amp;quot;coldfusion&amp;quot;:&lt;br /&gt;
case &amp;quot;delphi&amp;quot;:&lt;br /&gt;
case &amp;quot;java&amp;quot;:&lt;br /&gt;
case &amp;quot;javascript&amp;quot;:&lt;br /&gt;
case &amp;quot;jsp&amp;quot;:&lt;br /&gt;
case &amp;quot;php&amp;quot;:&lt;br /&gt;
case &amp;quot;uwsc&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;// &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;hsp&amp;quot;:&lt;br /&gt;
case &amp;quot;ini&amp;quot;:&lt;br /&gt;
case &amp;quot;x86 assembler&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;; &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;perl&amp;quot;:&lt;br /&gt;
case &amp;quot;perlscript&amp;quot;:&lt;br /&gt;
case &amp;quot;powershell&amp;quot;:&lt;br /&gt;
case &amp;quot;python&amp;quot;:&lt;br /&gt;
case &amp;quot;rhtml&amp;quot;:&lt;br /&gt;
case &amp;quot;ruby&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;# &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;sql&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;-- &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;tex&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;% &amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
case &amp;quot;vbscript&amp;quot;:&lt;br /&gt;
case &amp;quot;visualbasic&amp;quot;:&lt;br /&gt;
  COM = &amp;quot;&#039;&amp;quot;;&lt;br /&gt;
  break;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var wshShell = new ActiveXObject(&amp;quot;WScript.Shell&amp;quot;);&lt;br /&gt;
var fso = new ActiveXObject(&amp;quot;Scripting.FileSystemObject&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// カレントディレクトリをマクロディレクトリに変更&lt;br /&gt;
wshShell.CurrentDirectory = editor.FullName.match(/^.*\\/)[0] + &#039;Macros&#039;;&lt;br /&gt;
&lt;br /&gt;
// 設定ファイルからコメント文字を読み込む&lt;br /&gt;
var comSelected = LoadDocSetting();&lt;br /&gt;
if(comSelected != null){&lt;br /&gt;
  if(comSelected == &amp;quot;&amp;quot;) comSelected = COM;&lt;br /&gt;
&lt;br /&gt;
  var comTrim = comSelected.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;);  // スペースなしのコメント文字&lt;br /&gt;
&lt;br /&gt;
  // SHIFTキー状態を取得&lt;br /&gt;
  var shift = wshShell.Run(&amp;quot;GetKeyState.exe shift&amp;quot;, 0, true);&lt;br /&gt;
&lt;br /&gt;
  if(shift != -1){&lt;br /&gt;
    // コメント文字の入力を受ける&lt;br /&gt;
    if(comTrim == &amp;quot;&amp;quot; || shift == 1){&lt;br /&gt;
      var comInput = &amp;quot;// &amp;quot;;&lt;br /&gt;
      if(comTrim != &amp;quot;&amp;quot;) comInput = comSelected;&lt;br /&gt;
&lt;br /&gt;
      comInput = prompt(&amp;quot;コメント文字を指定してください&amp;quot;, comInput);&lt;br /&gt;
&lt;br /&gt;
      comTrim = comInput.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;); // スペースなしのコメント文字&lt;br /&gt;
      if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
        if(comInput != comSelected){&lt;br /&gt;
          SaveDocSetting(comInput);&lt;br /&gt;
          comSelected = comInput;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if(comTrim != &amp;quot;&amp;quot;){&lt;br /&gt;
      var meGetLineLogical = 0;&lt;br /&gt;
      var regOrg = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comSelected.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
      var regTrim = new RegExp(&amp;quot;^[ \\t]*&amp;quot; + comTrim.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;));&lt;br /&gt;
      var scrollY = window.ScrollY;&lt;br /&gt;
      var sel = doc.Selection;&lt;br /&gt;
      var st = sel.GetTopPointY(mePosLogical);&lt;br /&gt;
      var ed = sel.GetBottomPointY(mePosLogical);&lt;br /&gt;
      var ac = sel.GetActivePointY(mePosLogical);&lt;br /&gt;
      if(st != ed &amp;amp;&amp;amp; sel.GetBottomPointX(mePosLogical) == 1){&lt;br /&gt;
        // 複数行選択、最下行選択位置が行頭の場合は、最終行は除外&lt;br /&gt;
        ed--;&lt;br /&gt;
      }&lt;br /&gt;
      var tab = GetTabSpace();&lt;br /&gt;
&lt;br /&gt;
      sel.SetActivePoint(mePosLogical, doc.GetLine(ed, meGetLineLogical).length + 1, ed);&lt;br /&gt;
      sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
      var lines = sel.Text.split(&amp;quot;\n&amp;quot;)&lt;br /&gt;
      if(sel.Text.length &amp;gt; 0) sel.Untabify();&lt;br /&gt;
      var linesWithoutTab = sel.Text.split(&amp;quot;\n&amp;quot;);&lt;br /&gt;
      if(sel.Text.length &amp;gt; 0) doc.Undo();&lt;br /&gt;
&lt;br /&gt;
      // インデント取得&lt;br /&gt;
      var indent = -1;&lt;br /&gt;
      var existNotCommentLine = false;  // 空白・コメント行でない行が存在するか&lt;br /&gt;
      for(var i=0, len = linesWithoutTab.length; i &amp;lt; len; i++){&lt;br /&gt;
        var line = linesWithoutTab[i];&lt;br /&gt;
        var left = line.search(/[^ ]/);&lt;br /&gt;
        if(left &amp;gt;= 0 &amp;amp;&amp;amp; (indent &amp;lt; 0 || left &amp;lt; indent)){&lt;br /&gt;
          // インデントはタブ幅単位(左寄せ)&lt;br /&gt;
          indent = Math.floor(left / tab) * tab;&lt;br /&gt;
        }&lt;br /&gt;
        if(left &amp;gt;= 0){&lt;br /&gt;
          // コメント行判定&lt;br /&gt;
          if(!existNotCommentLine &amp;amp;&amp;amp; line.search(regTrim) == -1){&lt;br /&gt;
            existNotCommentLine = true;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      var txt = &amp;quot;&amp;quot;;&lt;br /&gt;
      var changed = false;&lt;br /&gt;
      if(existNotCommentLine){&lt;br /&gt;
        // コメントアウト&lt;br /&gt;
        for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
          var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
          // 空白行はコメントアウトしない&lt;br /&gt;
          if(line.search(/[^ \t\n]/) == -1){&lt;br /&gt;
            txt += line;&lt;br /&gt;
            continue;&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          // 挿入位置をタブと空白を考慮して決定&lt;br /&gt;
          var index = 0, j;&lt;br /&gt;
          for(j = 0; index &amp;lt; indent; j++){&lt;br /&gt;
            // indent の範囲には半角スペースかタブしかない&lt;br /&gt;
            if(line.charAt(j) == &amp;quot; &amp;quot;){&lt;br /&gt;
              index += 1;&lt;br /&gt;
            }else{&lt;br /&gt;
              index += tab - (index % tab);&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
          txt += line.substring(0, j) + comSelected + line.substring(j);&lt;br /&gt;
          changed = true;&lt;br /&gt;
        }&lt;br /&gt;
      }else{&lt;br /&gt;
        // コメントから復帰&lt;br /&gt;
        for(var i = 0, len = lines.length; i &amp;lt; len; i++){&lt;br /&gt;
          var line = lines[i] + &amp;quot;\n&amp;quot;;&lt;br /&gt;
          if(line.match(regTrim)){&lt;br /&gt;
            if(line.match(regOrg)){&lt;br /&gt;
              txt += line.replace(comSelected, &amp;quot;&amp;quot;); // 先頭のコメント(空白付き)の削除&lt;br /&gt;
            }else{&lt;br /&gt;
              txt += line.replace(comTrim, &amp;quot;&amp;quot;); // 先頭のコメント(空白なし)の削除&lt;br /&gt;
            }&lt;br /&gt;
            changed = true;&lt;br /&gt;
          }else{&lt;br /&gt;
            txt += line;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // コメントアウト部分を書き換えて，全体を選択&lt;br /&gt;
      if(doc.GetLine(ed + 1, meGetLineWithNewLines) == &amp;quot;&amp;quot;) txt = txt.substring(0, txt.length - 1);  // 最後の改行は除去&lt;br /&gt;
      if(ac == st){&lt;br /&gt;
        // 下から上への選択状態&lt;br /&gt;
        sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
        if(changed) sel.Text = txt;&lt;br /&gt;
        sel.SetActivePoint(mePosLogical, 1, st);&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
      }else{&lt;br /&gt;
        // 上から下への選択状態&lt;br /&gt;
        sel.SetActivePoint(mePosLogical, 1, ed + 1);&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
        if(changed) sel.Text = txt;&lt;br /&gt;
        sel.SetAnchorPoint(mePosLogical, 1, st);&lt;br /&gt;
      }&lt;br /&gt;
      window.ScrollY = scrollY;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//========================================&lt;br /&gt;
// 関数&lt;br /&gt;
//========================================&lt;br /&gt;
// タブ幅を取得&lt;br /&gt;
function GetTabSpace()&lt;br /&gt;
{&lt;br /&gt;
  var doc = editor.ActiveDocument;&lt;br /&gt;
  var sel = doc.Selection;&lt;br /&gt;
  var saved = doc.Saved;&lt;br /&gt;
  sel.EndOfDocument();&lt;br /&gt;
  doc.Write(&amp;quot;\n\t&amp;quot;);&lt;br /&gt;
  sel.SetAnchorPoint(mePosLogical, sel.GetActivePointX(mePosLogical) - 1, sel.GetActivePointY(mePosLogical));&lt;br /&gt;
  sel.Untabify();&lt;br /&gt;
  var n = sel.Text.length;&lt;br /&gt;
  doc.Undo(); doc.Undo();&lt;br /&gt;
  doc.Saved = saved&lt;br /&gt;
&lt;br /&gt;
  return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&lt;br /&gt;
  if(dic == null) return null;&lt;br /&gt;
  var ret = &amp;quot;&amp;quot;;&lt;br /&gt;
  for(var key in dic){&lt;br /&gt;
    if(key.toLowerCase() == window.document.FullName.toLowerCase()){&lt;br /&gt;
      ret = dic[window.document.FullName.toLowerCase()];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// コメント文字設定をファイルに書き込み&lt;br /&gt;
function SaveDocSetting(comStr)&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&lt;br /&gt;
  if(dic != null){&lt;br /&gt;
    dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
    SaveDocSettingDataListWithOpend(dic);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 設定ファイルから全ての設定値を取得&lt;br /&gt;
function LoadDocSettingDataListWithOpend()&lt;br /&gt;
{&lt;br /&gt;
  var settingPath = GetSettingFilePath();&lt;br /&gt;
  if(settingPath == &amp;quot;&amp;quot;) return null;&lt;br /&gt;
&lt;br /&gt;
  var dic = {};&lt;br /&gt;
  var deleted = false;&lt;br /&gt;
  if(fso.FileExists(settingPath)){&lt;br /&gt;
    var tso = fso.OpenTextFile(settingPath, 1, false, -1);&lt;br /&gt;
    while(tso.AtEndOfStream == false){&lt;br /&gt;
      var setting = tso.ReadLine().split(&amp;quot;\t&amp;quot;, 2);&lt;br /&gt;
      var detect = false;&lt;br /&gt;
      for(var i = 0; i &amp;lt; window.Editors.Count; i++){&lt;br /&gt;
        for(var j = 0; j &amp;lt; window.Editors.Item(i).Documents.Count; j++){&lt;br /&gt;
          if(window.Editors.Item(i).Documents.Item(j).FullName.toLowerCase() == setting[0].toLowerCase()){&lt;br /&gt;
            dic[setting[0].toLowerCase()] = setting[1];&lt;br /&gt;
            detect = true;&lt;br /&gt;
            break;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        if(detect) break;&lt;br /&gt;
      }&lt;br /&gt;
      if(detect == false) deleted = true;&lt;br /&gt;
    }&lt;br /&gt;
    tso.Close();&lt;br /&gt;
  }&lt;br /&gt;
  if(deleted) SaveDocSettingDataListWithOpend(dic);&lt;br /&gt;
  return dic;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// 設定ファイルを全て書き換え&lt;br /&gt;
function SaveDocSettingDataListWithOpend(dic)&lt;br /&gt;
{&lt;br /&gt;
  var settingPath = GetSettingFilePath();&lt;br /&gt;
  if(settingPath != &amp;quot;&amp;quot;){&lt;br /&gt;
    var tso = fso.OpenTextFile(settingPath, 2, true, -1);&lt;br /&gt;
    for(var key in dic){&lt;br /&gt;
      tso.WriteLine(key + &amp;quot;\t&amp;quot; + dic[key]);&lt;br /&gt;
    }&lt;br /&gt;
    tso.Close();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// コメント文字設定ファイルの場所を取得する&lt;br /&gt;
function GetSettingFilePath()&lt;br /&gt;
{&lt;br /&gt;
  var meryDir = fso.GetParentFolderName(editor.FullName);&lt;br /&gt;
  var settingPath = &amp;quot;&amp;quot;;&lt;br /&gt;
  if(fso.FileExists(fso.BuildPath(meryDir, &amp;quot;Mery.ini&amp;quot;))){&lt;br /&gt;
    settingPath = fso.BuildPath(meryDir, settingFilename);&lt;br /&gt;
  }else{&lt;br /&gt;
    var appDataPath = fso.BuildPath(wshShell.SpecialFolders(&#039;Appdata&#039;), &#039;Mery&#039;);&lt;br /&gt;
    if(fso.FileExists(fso.BuildPath(appDataPath, &amp;quot;Mery.ini&amp;quot;))){&lt;br /&gt;
      settingPath = fso.BuildPath(appDataPath, settingFilename);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if(settingPath == &amp;quot;&amp;quot;){&lt;br /&gt;
    window.Alert(&amp;quot;Mery.ini ファイルが見つかりません&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>92.202.159.41</name></author>
	</entry>
</feed>