<?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=Pizz</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=Pizz"/>
	<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/Pizz"/>
	<updated>2026-09-12T00:55:17Z</updated>
	<subtitle>利用者の投稿記録</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=%E3%83%86%E3%83%BC%E3%83%9E%E3%81%AE%E8%87%AA%E5%8B%95%E5%A4%89%E6%9B%B4&amp;diff=9356</id>
		<title>テーマの自動変更</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=%E3%83%86%E3%83%BC%E3%83%9E%E3%81%AE%E8%87%AA%E5%8B%95%E5%A4%89%E6%9B%B4&amp;diff=9356"/>
		<updated>2025-12-14T04:13:58Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 概要 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 概要 ==&lt;br /&gt;
Windowsのテーマ設定に合わせて、Meryのエディタ部のテーマを自動変更します。&lt;br /&gt;
&lt;br /&gt;
Meryのオプションで、「アプリのテーマ」を「システム設定を使用する」とすると、Windowsに合わせてMeryのテーマが変更されるようになりますが、エディタ部のテーマはこれとは別に設定変更する必要があります。&lt;br /&gt;
&lt;br /&gt;
[https://apps.microsoft.com/detail/xp89dcgq3k6vld?hl=ja-JP&amp;amp;gl=JP Microsoft PowerToys]の Light Switch や、[https://apps.microsoft.com/detail/xp8jk4hzbvf435?hl=ja-JP&amp;amp;gl=JP Auto Dark Mode]などを使用すると、Windowsのテーマを時間で自動変更するなどができますが、Mery本体はこれに追随するのに、エディタ部のテーマだけ置き去りになって、なんか悲しかったので作りました。&lt;br /&gt;
&lt;br /&gt;
* Meryのオプション-&amp;gt;「基本」-&amp;gt;「アプリのテーマ」で、「システム設定を使用する」としている場合のみ動作するようにしてあります。&lt;br /&gt;
* ライトモード/ダークモード用のテーマを用意しておき、マクロ先頭でテーマ名を指定します&lt;br /&gt;
:(Mery標準のテーマは使えません、「名前を付けて保存」したテーマを使用します)&lt;br /&gt;
* マクロのカスタマイズ画面のリストに登録したら、イベントを有効にします&lt;br /&gt;
:イベントはお好みで...(「フォーカスを受け取った時」「フォーカスを失った時」くらいが妥当だと思います)&lt;br /&gt;
&lt;br /&gt;
テーマを書き換えるアイディアは、ucky様の「[[テーマのトグル]]」マクロからいただきました。&lt;br /&gt;
すてきなアイディアありがとうございます。&lt;br /&gt;
&lt;br /&gt;
== 変更履歴 ==&lt;br /&gt;
* 2025-12-10&lt;br /&gt;
** 新規作成&lt;br /&gt;
&lt;br /&gt;
== ソースコード ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; copy&amp;gt;&lt;br /&gt;
#title = &amp;quot;テーマの自動変更&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// ライトモード/ダークモード用のテーマを用意しておき、ここでテーマ名を指定します&lt;br /&gt;
// (Mery標準のテーマは使えません、「名前を付けて保存」したテーマを使用します)&lt;br /&gt;
var lightModeTheme = &amp;quot;#Custom-Light&amp;quot;;&lt;br /&gt;
var darkModeTheme = &amp;quot;#Custom-Dark&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// マクロのカスタマイズ画面のリストに登録したら、イベントを有効にします&lt;br /&gt;
//    イベントはお好みで...(「フォーカスを受け取った時」「フォーカスを失った時」くらいが妥当だと思います)&lt;br /&gt;
// Meryのオプション-&amp;gt;「基本」-&amp;gt;「アプリのテーマ」で、&lt;br /&gt;
//    「システム設定を使用する」としている場合のみ動作するようにしてあります&lt;br /&gt;
&lt;br /&gt;
if (&amp;quot;ReadSettings&amp;quot; in editor) {&lt;br /&gt;
	if(editor.ReadSettingInteger(&amp;quot;General&amp;quot;, &amp;quot;DarkMode&amp;quot;, -1) == 2){&lt;br /&gt;
		// Meryの現在のテーマ&lt;br /&gt;
		var currentTheme = editor.ReadSettingString(&amp;quot;Themes&amp;quot;, &amp;quot;ThemeName&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		// Windowsのテーマ状態&lt;br /&gt;
		var regKey = &amp;quot;HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\\AppsUseLightTheme&amp;quot;;&lt;br /&gt;
		var isLight = (new ActiveXObject(&amp;quot;WScript.Shell&amp;quot;)).RegRead(regKey);&lt;br /&gt;
		var newTheme;&lt;br /&gt;
		if(isLight == 0){&lt;br /&gt;
			newTheme = darkModeTheme;&lt;br /&gt;
		}else{&lt;br /&gt;
			newTheme = lightModeTheme;&lt;br /&gt;
		}&lt;br /&gt;
		if(currentTheme != newTheme){&lt;br /&gt;
			// 表示設定項目一覧取得&lt;br /&gt;
			var iniKeys = enumKeysInSection(&amp;quot;Theme\\&amp;quot; + newTheme);&lt;br /&gt;
			if(iniKeys.length &amp;gt; 0){&lt;br /&gt;
				editor.WriteSettings();&lt;br /&gt;
&lt;br /&gt;
				// テーマを「名前を付けて保存」したときに設定ファイルに追加される&lt;br /&gt;
				// [Theme\テーマ名] セクションを読んで [Display] セクションの該当する項目を書き換える&lt;br /&gt;
				for(var i = 0; i &amp;lt; iniKeys.length; i++){&lt;br /&gt;
					editor.WriteSettingString(&amp;quot;Display&amp;quot;, iniKeys[i],&lt;br /&gt;
						editor.ReadSettingString(&amp;quot;Theme\\&amp;quot; + newTheme, iniKeys[i], &amp;quot;&amp;quot;)&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
				editor.WriteSettingString(&amp;quot;Themes&amp;quot;, &amp;quot;ThemeName&amp;quot;, newTheme);&lt;br /&gt;
&lt;br /&gt;
				editor.ReadSettings();&lt;br /&gt;
			}else{&lt;br /&gt;
				window.OutputBar.Visible = true;&lt;br /&gt;
				window.OutputBar.Writeln(&amp;quot;指定されたテーマが見つかりません: &amp;quot; + newTheme);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}else{&lt;br /&gt;
	window.OutputBar.Visible = true;&lt;br /&gt;
	window.OutputBar.Writeln(&amp;quot;動作対象外のMeryです: Ver.&amp;quot; + editor.Version);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Mery.iniから指定セクションのキー名一覧を取得する&lt;br /&gt;
function enumKeysInSection(sectionName){&lt;br /&gt;
	var keys = [];&lt;br /&gt;
&lt;br /&gt;
	// Mery.ini を探す&lt;br /&gt;
	var iniPath = editor.FullName.replace(/\.exe$/i, &amp;quot;.ini&amp;quot;);&lt;br /&gt;
	if(! (new ActiveXObject(&amp;quot;Scripting.FileSystemObject&amp;quot;)).FileExists(iniPath)){&lt;br /&gt;
		var iniName = /\\([^\\]+)\.exe$/.exec(editor.FullName)[1];&lt;br /&gt;
		iniPath = (new ActiveXObject(&amp;quot;WScript.Shell&amp;quot;)).SpecialFolders(&amp;quot;APPDATA&amp;quot;) + &amp;quot;\\Mery\\&amp;quot; + iniName + &amp;quot;.ini&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	// Mery.ini を読みこむ&lt;br /&gt;
	var adodb = new ActiveXObject(&amp;quot;adodb.Stream&amp;quot;);&lt;br /&gt;
	var adTypeText = 2, adReadAll = -1;&lt;br /&gt;
	adodb.Type = adTypeText, adodb.Charset = &amp;quot;UTF-8&amp;quot;;&lt;br /&gt;
	adodb.Open();&lt;br /&gt;
	adodb.LoadFromFile(iniPath);&lt;br /&gt;
	var iniText = adodb.ReadText(adReadAll);&lt;br /&gt;
	adodb.Close();&lt;br /&gt;
&lt;br /&gt;
	var start = iniText.search(new RegExp(&amp;quot;^\\[&amp;quot; + sectionName.replace(/\W/g, &amp;quot;\\$&amp;amp;&amp;quot;) + &amp;quot;\\]$&amp;quot;, &amp;quot;m&amp;quot;));&lt;br /&gt;
	if(start &amp;gt;= 0){&lt;br /&gt;
		start = start + sectionName.length + 4;&lt;br /&gt;
		var end = iniText.indexOf(&amp;quot;\r\n[&amp;quot;, start);&lt;br /&gt;
		if(end &amp;lt; 0) end = iniText.length;&lt;br /&gt;
&lt;br /&gt;
		var rows = iniText.slice(start, end).split(&amp;quot;\r\n&amp;quot;);&lt;br /&gt;
		for(var i = 0; i &amp;lt; rows.length; i++){&lt;br /&gt;
			var keyEnd = rows[i].indexOf(&amp;quot;=&amp;quot;);&lt;br /&gt;
			if(keyEnd &amp;gt; 0){&lt;br /&gt;
				keys.push(rows[i].slice(0, keyEnd));&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return keys;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=GetKeyState.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=4078</id>
		<title>GetKeyState.exe(キー状態取得実行ファイル)</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=GetKeyState.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=4078"/>
		<updated>2019-04-12T04:10:30Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 実装例 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
修飾キーの押下状態を取得する実行ファイルです。&lt;br /&gt;
&lt;br /&gt;
Shift、Ctrl、Alt いずれかのキーの押下状態を取得できます。&lt;br /&gt;
マクロスクリプトからキー状態を取得し、状態に応じて動作をコントロールしたくて作成しました。&lt;br /&gt;
&lt;br /&gt;
作成されたマクロから利用できますので、ご自由にお使いください。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
zipファイルをダウンロードしたら、ファイルのプロパティ画面で「ブロックの解除」を行ってください。&lt;br /&gt;
(これをしないと実行時に警告が表示されることがあります)&lt;br /&gt;
&lt;br /&gt;
その後、zipファイルを展開して、マクロから実行されるフォルダーに配置してください。&lt;br /&gt;
(推奨は &#039;&#039;&#039;&amp;quot;Macros&amp;quot;フォルダー&#039;&#039;&#039;とします)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ダウンロード&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2019/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
2019/3/23 公開ページの変更(中身に変更はありません)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
コマンドライン引数で、&amp;quot;Shift&amp;quot; &amp;quot;Ctrl&amp;quot; &amp;quot;Alt&amp;quot; のいずれかを渡してください。&lt;br /&gt;
 GetKeyState.exe shift		// Shiftキーの押下状態を取得する場合&lt;br /&gt;
* 大文字小文字は区別しません&lt;br /&gt;
* 実は先頭の1文字しか判断していませんので、&amp;quot;s&amp;quot;のみとかでも大丈夫です&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
戻り値(終了コード)&lt;br /&gt;
* 1: キーが押されている&lt;br /&gt;
* 0: キーは押されていない&lt;br /&gt;
* -1: エラー(引数間違い、メッセージボックスを表示します)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
マクロにショートカットキーを割り当てる際は、該当する修飾キー &amp;quot;あり&amp;quot; と &amp;quot;なし&amp;quot; の両方を割り当ててください&lt;br /&gt;
* Shift+F8 / F8 など&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ツールバーにアイコン化しているマクロの場合は、&amp;quot;修飾キー＋クリック&amp;quot; か &amp;quot;ふつうの左クリック&amp;quot; かでマクロの動作を切り替えることができます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ツールバーの [マクロ] メニューや右クリックメニューから実行する際は、Shift または Ctrl キーを押しながら実行することができますが、Alt キーを押しながら実行することはできません（Alt キーでメニューのポップアップ表示がキャンセルされるため）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
起動までに若干のタイムラグがありますので、すばやく操作すると取りこぼすことがあります。&lt;br /&gt;
そういう意味では、ショートカットキーにはあまり向かないかもしれません。&lt;br /&gt;
私は、ツールバー起動で使っています。&lt;br /&gt;
&lt;br /&gt;
: ※マクロの処理が開始するか終了するまで修飾キーを押しつづければ、取りこぼしはなくなります。&amp;lt;br&amp;gt; また、マクロの処理が全体的に重い／長いソースコードの場合は、[[#実装例|実装例]] にあるような修飾キー取得コードの部分をソースコードの先頭に配置するとよいでしょう。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 実装例 =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;サンプルコード１&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;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;
// 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;
  if(shift == 1) window.Alert(&amp;quot;Shiftキーが押されています&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;サンプルコード２&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var wshShell = new ActiveXObject(&#039;WScript.Shell&#039;);&lt;br /&gt;
&lt;br /&gt;
// GetKeyState.exe のフルパス部分を &amp;quot; &amp;quot; で囲い、半角空白を付加する&lt;br /&gt;
var getKeyState = &#039;&amp;quot;&#039; + editor.FullName.replace( /mery\.exe$/i , &#039;Macros\\&#039; ) + &#039;GetKeyState.exe &amp;quot;&#039;;&lt;br /&gt;
&lt;br /&gt;
// コマンドライン引数をつけて GetKeyState を実行する&lt;br /&gt;
&lt;br /&gt;
// Ctrl キーの状態を取得&lt;br /&gt;
var ctrl = wshShell.Run( getKeyState + &#039;control&#039;, 0, true );&lt;br /&gt;
// Alt キーの状態を取得&lt;br /&gt;
var alt = WshShell.Run( getKeyState + &#039;alt&#039; , 0, true );&lt;br /&gt;
&lt;br /&gt;
// 修飾キーによる動作の切り替え&lt;br /&gt;
if ( ctrl &amp;gt; 0 )&lt;br /&gt;
  window.Alert( &amp;quot;Ctrlキーが押されています&amp;quot; );&lt;br /&gt;
else if ( Alt &amp;gt; 0 )&lt;br /&gt;
  window.Alert( &amp;quot;Altキーが押されています&amp;quot; );&lt;br /&gt;
else&lt;br /&gt;
  window.Alert( &amp;quot;修飾キーは押されていません&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= その他 =&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
(こちらは通常ダウンロードの必要はありません)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
※ 著作権は放棄します、悪意のない公序良俗の範囲内でしたら、ソースを含めご自由にお使いください&lt;br /&gt;
(そのかわり、一切の責任も放棄します...まぁ、こんなもので誤動作もあったもんじゃないですが、派生版まで責任が持てないので)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* 「[[カッコをはずす#カッコを追加／削除|カッコを追加／削除]]」マクロに使わせていただきました (2019/03/19 sukemaru)&lt;br /&gt;
* ページ内の説明文に加筆させていただきました (2019/03/23 sukemaru)&lt;br /&gt;
* 「[[コメントマーク付け外し#sukemaru 版|行コメント]]」マクロに使わせていただきました (2019/03/25 sukemaru)&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<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=4077</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=4077"/>
		<updated>2019-04-12T04:09:14Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* プログラミング補助 */&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 2017/05/27&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, sukemaru) update 2018/11/18&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;
*[[行を複製 (複数行可)]] (sukemaru) update 2019/03/29&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 2018/08/04&lt;br /&gt;
*[[字下げ・字上げ]](インデント・逆インデント) (masme, sukemaru) 2014/02/09, update 2019/04/07&lt;br /&gt;
:「[[字下げ・字上げ#インデント|インデント／逆インデント]]」を追加&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;
*[[引用符／コメント]] (※旧「引用の追加」マクロを増補改訂)　(sukemaru) 2019/04/07&lt;br /&gt;
*[[カッコで囲う]] (ポップアップメニューあり)　(sukemaru) last modified 2019/04/07&lt;br /&gt;
:「カッコで囲う (簡易版 ポップアップメニューなし)」&amp;lt;br&amp;gt; 「引用符を追加／削除」トグル&lt;br /&gt;
*[[カッコをはずす]] ＆ [[カッコをはずす#カッコを削除／追加|カッコを削除／追加]] ＆ [[カッコをはずす#カッコを追加／削除|カッコを追加／削除]] (sukemaru)  2019/03/14 - 2019/04/07&lt;br /&gt;
*[[定型文を挿入]] (sukemaru) 2018/12/03&lt;br /&gt;
*[[何年生で習う漢字？]] (シリル) 2019/03/10&lt;br /&gt;
&lt;br /&gt;
== ファイル操作補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[ファイルのプロパティ]] (sukemaru) 2018/12/18&lt;br /&gt;
*[[文字列中のパス起動]] (ks)&lt;br /&gt;
:[[選択範囲のURL・パスを開く|ひらけゴマ！]] (sukemaru) update 2019/04/07 ※「選択範囲のURL・パスを開く」&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/04/08&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;
*[[編集モードの自動選択]] または &#039;&#039;&#039;書き換え禁止で開く&#039;&#039;&#039; (sukemaru, Bleat) update 2019/04/06&lt;br /&gt;
*[[書き換え禁止モード色反転]] (Bleat)&lt;br /&gt;
*[[特定のフォルダで「ファイルを開く」ダイアログ]] (sukemaru) fixed 2018/12/19&lt;br /&gt;
*[[すべて閉じる]]マクロ集 (sukemaru) 2018/12/19&lt;br /&gt;
*[[文書が変更されていなければ変更マークを消す]] (Noah)&lt;br /&gt;
*[[変更なしのタブをすべて閉じる]] (Noah)&lt;br /&gt;
*[[ファイルを読み直す・開きなおす]] ＋&#039;&#039;&#039;エンコード指定&#039;&#039;&#039;で読み直し・&#039;&#039;&#039;読み取り専用属性&#039;&#039;&#039;の変更・&#039;&#039;&#039;編集モード&#039;&#039;&#039;の変更 (sukemaru) update 2019/04/08&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;
*[[ブックマーク系コマンド集]] (ks)&lt;br /&gt;
*[[テキスト変換]] (ks)&lt;br /&gt;
**[[テキスト整形]] (masme) 2013/09/15, update 2018/01/15&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 2018/04/15&lt;br /&gt;
*[[連番を挿入]] (masme) 2013/08/25&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;を切り替える」&lt;br /&gt;
*[[基数変換10_16]] (シリル) 2019/02/10&lt;br /&gt;
*[[スネークケース ⇔ キャメルケースの変換]] (Noah)&lt;br /&gt;
*[[罫線変換]] (シリル) 2019/03/09&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/07&lt;br /&gt;
*[[検索(SJIS以外)]] + 検索強調を解除 (masme) 2014/09/16, update 2017/06/26&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;
*[[任意の検索エンジンで検索]] (Noah)&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;
&lt;br /&gt;
== プログラミング補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[Eclipse風コメントアウト]] (ks)&lt;br /&gt;
*[[Eclipse風コメントアウト(改)]] (pizz) 2019/04/12&lt;br /&gt;
*[[コメントマーク付け外し]] (手石, masme, sukemaru) last update 2019/04/07&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) 2016/12/11更新&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)&lt;br /&gt;
*[[メール送信]] (ks)&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
&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) 2019/03/10&lt;br /&gt;
*[[ブックマークを復元（Mery_2.7用）]] (sukemaru) 2019/04/07&lt;br /&gt;
----&lt;br /&gt;
*[[キーアサイン集]] (ks, masme, 有志) last update 2018/10/08&lt;br /&gt;
*[[マテリアルデザインっぽいアイコンと『小マクロ集』]] (sukemaru) last update 2019/04/06&lt;br /&gt;
*[[includeライブラリ]] (ks)&lt;br /&gt;
*[[GetKeyState.exe(キー状態取得実行ファイル)]] (pizz) 2019/03/23&lt;br /&gt;
*[[マクロ覚え書き（開発者向け）]](ks)&lt;/div&gt;</summary>
		<author><name>Pizz</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=4076</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=4076"/>
		<updated>2019-04-12T04:08:27Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 更新履歴 */&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;
&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>Pizz</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=4075</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=4075"/>
		<updated>2019-04-12T04:08:09Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 更新履歴 */&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;
2019/4/12 window.Quit() メソッドの使用排除&lt;br /&gt;
&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>Pizz</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=4074</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=4074"/>
		<updated>2019-04-12T04:07:18Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* コード */&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;
= コード =&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>Pizz</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=3860</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=3860"/>
		<updated>2019-03-24T07:32:06Z</updated>

		<summary type="html">&lt;p&gt;Pizz: &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;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=GetKeyState.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=3853</id>
		<title>GetKeyState.exe(キー状態取得実行ファイル)</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=GetKeyState.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=3853"/>
		<updated>2019-03-23T04:34:00Z</updated>

		<summary type="html">&lt;p&gt;Pizz: ページの作成:「= 概要 = キー押下状態を取得する実行ファイルです。  Shift、Ctrl、Alt いずれかのキーの押下状態を取得できます。 マクロスク...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
キー押下状態を取得する実行ファイルです。&lt;br /&gt;
&lt;br /&gt;
Shift、Ctrl、Alt いずれかのキーの押下状態を取得できます。&lt;br /&gt;
マクロスクリプトからキー状態を取得し、状態に応じて動作をコントロールしたくて作成しました。&lt;br /&gt;
&lt;br /&gt;
作成されたマクロから利用できますので、ご自由にお使いください。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
zipファイルをダウンロードしたら、ファイルのプロパティ画面で「ブロックの解除」を行ってください。&lt;br /&gt;
(これをしないと実行時に警告が表示されることがあります)&lt;br /&gt;
&lt;br /&gt;
その後、zipファイルを展開して、マクロから実行されるフォルダーに配置してください。&lt;br /&gt;
(推奨は &amp;quot;Macros&amp;quot;フォルダーとします)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2019/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
2019/3/23 公開ページの変更(中身に変更はありません)&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
コマンドライン引数で、&amp;quot;Shift&amp;quot; &amp;quot;Ctrl&amp;quot; &amp;quot;Alt&amp;quot; のいずれかを渡してください。&lt;br /&gt;
* 大文字小文字は区別しません&lt;br /&gt;
* 実は先頭の1文字しか判断していませんので、&amp;quot;s&amp;quot;のみとかでも大丈夫です&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
戻り値(終了コード)&lt;br /&gt;
* 1: キーが押されている&lt;br /&gt;
* 0: キーは押されていない&lt;br /&gt;
* -1: エラー(引数間違い、メッセージボックスを表示します)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
マクロにショートカットキーを割り当てる際は、該当キーありとなしの両方を割り当ててください&lt;br /&gt;
* Shift+F8 / F8 など&lt;br /&gt;
&lt;br /&gt;
起動までに若干のタイムラグがありますので、すばやく操作すると取りこぼすことがあります。&lt;br /&gt;
そういう意味では、ショートカットキーにはあまり向かないかもしれません。&lt;br /&gt;
私は、ツールバー起動で使っています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 実装例 =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;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;
// SHIFTキー状態を取得&lt;br /&gt;
var shift = wshShell.Run(&amp;quot;GetKeyState.exe shift&amp;quot;, 0, true);&lt;br /&gt;
if(shift == -1) window.Quit();&lt;br /&gt;
if(shift == 1) window.Alert(&amp;quot;Shiftキーが押されています&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
(こちらは通常ダウンロードの必要はありません)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<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=3852</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=3852"/>
		<updated>2019-03-23T04:33:42Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* その他 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mery で使用できるマクロを集めたライブラリです。&lt;br /&gt;
&lt;br /&gt;
スクリプトを拡張子「js」 (JavaScript、JScript の場合) にして「My 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 2017/05/27&lt;br /&gt;
*[[選択文字列を強調]] (Kuro)&lt;br /&gt;
*[[行頭に移動]] (Kuro, 他) update 2014/03/15&lt;br /&gt;
*[[バイト数]] (Kuro, ks, sukemaru) update 2018/11/18 文書全体の文字数・行数表示にも対応&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;
*[[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 2018/08/04&lt;br /&gt;
*[[字下げ・字上げ]](インデント・逆インデント) (masme, sukemaru) 2014/02/09, update 2018/11/16&lt;br /&gt;
:*「[[字下げ・字上げ#インデント|インデント／逆インデント]]」を追加&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;
*[[文章で使用されている文字をユニーク抽出]] (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;
*[[行を複製 (複数行可)]] (sukemaru) 2018/08/24&lt;br /&gt;
*[[行の先頭に貼り付け]] (sukemaru) 2018/08/24&lt;br /&gt;
*[[カッコで囲う]] (ポップアップメニューあり)　(sukemaru) last modified 2018/11/19&lt;br /&gt;
: ・簡易版「カッコで囲う (ポップアップメニューなし)」&amp;lt;br&amp;gt;・「引用符を追加／削除」&amp;lt;br&amp;gt;・人柱版 追加コード「行頭/行末から任意の 文字数／文字列 を削除」&lt;br /&gt;
*[[カッコをはずす]] ＆ [[カッコをはずす#カッコを削除／追加|カッコを削除／追加]] ＆ [[カッコをはずす#カッコを追加／削除|カッコを追加／削除]] (sukemaru)  2019/03/14 - 2019/03/19&lt;br /&gt;
*[[引用符／コメント]] (※旧「引用の追加」マクロを増補改訂)　(sukemaru) 2018/10/28&lt;br /&gt;
*[[行頭か行末 または 選択範囲の始点か終点]] (sukemaru) 2018/12/03&lt;br /&gt;
*[[文書の先頭か末尾]] (sukemaru) 2019/03/10&lt;br /&gt;
*[[定型文を挿入]] (sukemaru) 2018/12/03&lt;br /&gt;
*[[何年生で習う漢字？]] (シリル) 2019/03/10&lt;br /&gt;
&lt;br /&gt;
== ファイル操作補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[文字列中のパス起動]] (ks)&lt;br /&gt;
:*[[選択範囲のURL・パスを開く|ひらけゴマ！]] (sukemaru) update 2019/03/15 ※「選択範囲のURL・パスを開く」&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) update 2012/09/24&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;
*[[編集モードの自動選択]] または &#039;&#039;&#039;書き換え禁止で開く&#039;&#039;&#039; (sukemaru, Bleat) Update 2019/02/15&lt;br /&gt;
*[[書き換え禁止モード色反転]] (Bleat)&lt;br /&gt;
*[[特定のフォルダで「ファイルを開く」ダイアログ]] (sukemaru) fixed 2018/12/19&lt;br /&gt;
*[[ファイルのプロパティ]] (sukemaru) 2018/12/18&lt;br /&gt;
*[[すべて閉じる]] (sukemaru) 2018/12/19&lt;br /&gt;
*[[文書が変更されていなければ変更マークを消す]] (Noah)&lt;br /&gt;
*[[変更なしのタブをすべて閉じる]] (Noah)&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;
*[[ブックマーク系コマンド集]] (ks)&lt;br /&gt;
*[[テキスト変換]] (ks)&lt;br /&gt;
**[[テキスト整形]] (masme) 2013/09/15, update 2018/01/15&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 2018/04/15&lt;br /&gt;
*[[連番を挿入]] (masme) 2013/08/25&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;を切り替える」&lt;br /&gt;
*[[基数変換10_16]] (シリル) 2019/02/10&lt;br /&gt;
*[[スネークケース ⇔ キャメルケースの変換]] (Noah)&lt;br /&gt;
*[[罫線変換]] (シリル) 2019/03/09&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/03/13&lt;br /&gt;
*[[検索(SJIS以外)]] + 検索強調を解除 (masme) 2014/09/16, update 2017/06/26&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;
*[[任意の検索エンジンで検索]] (Noah)&lt;br /&gt;
*[[デフォルトの検索フラグを設定して検索ウィンドウ表示]] (yuko)&lt;br /&gt;
*[[簡易検索一覧]] (シリル) 2018/12/24&lt;br /&gt;
*[[簡易検索一覧などをアウトプット]] (シリル) 2018/12/31&lt;br /&gt;
*[[複数置換]] (Noah)&lt;br /&gt;
&lt;br /&gt;
== プログラミング補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[Eclipse風コメントアウト]] (ks)&lt;br /&gt;
*[[Eclipse風コメントアウト(改)]] (pizz) 2019/03/04&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;
*[[コメントマーク付け外し]] (手石, masme, sukemaru) last update 2018/11/19 ※sukemaru版に「人柱用 追加コード」&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) 2016/12/11更新&lt;br /&gt;
&lt;br /&gt;
== おもしろ ==&lt;br /&gt;
&lt;br /&gt;
*[[テキストブラウザ]] (Kuro)&lt;br /&gt;
*[[Yahoo!天気情報]] (Kuro)&lt;br /&gt;
*[[メール送信]] (ks)&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
&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) 2019/03/10&lt;br /&gt;
----&lt;br /&gt;
*[[キーアサイン集]] (ks, masme, 有志) last update 2018/10/08&lt;br /&gt;
*[[マテリアルデザインっぽいアイコンと『小マクロ集』]] (sukemaru) last update 2018/12/04&lt;br /&gt;
*[[includeライブラリ]] (ks)&lt;br /&gt;
*[[GetKeyState.exe(キー状態取得実行ファイル)]] (pizz) 2019/03/23&lt;br /&gt;
*[[マクロ覚え書き（開発者向け）]](ks)&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=GetKeySatate.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=3851</id>
		<title>GetKeySatate.exe(キー状態取得実行ファイル)</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=GetKeySatate.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=3851"/>
		<updated>2019-03-23T04:33:11Z</updated>

		<summary type="html">&lt;p&gt;Pizz: ページの白紙化&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Pizz</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=3850</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=3850"/>
		<updated>2019-03-23T04:22:18Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 概要 */&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キーの状態を取得するために、[[GetKeySatate.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;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=GetKeySatate.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=3849</id>
		<title>GetKeySatate.exe(キー状態取得実行ファイル)</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=GetKeySatate.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=3849"/>
		<updated>2019-03-23T04:19:33Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 更新履歴 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
キー押下状態を取得する実行ファイルです。&lt;br /&gt;
&lt;br /&gt;
Shift、Ctrl、Alt いずれかのキーの押下状態を取得できます。&lt;br /&gt;
マクロスクリプトからキー状態を取得し、状態に応じて動作をコントロールしたくて作成しました。&lt;br /&gt;
&lt;br /&gt;
作成されたマクロから利用できますので、ご自由にお使いください。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
zipファイルをダウンロードしたら、ファイルのプロパティ画面で「ブロックの解除」を行ってください。&lt;br /&gt;
(これをしないと実行時に警告が表示されることがあります)&lt;br /&gt;
&lt;br /&gt;
その後、zipファイルを展開して、マクロから実行されるフォルダーに配置してください。&lt;br /&gt;
(推奨は &amp;quot;Macros&amp;quot;フォルダーとします)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2019/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
2019/3/23 公開ページの変更(中身に変更はありません)&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
コマンドライン引数で、&amp;quot;Shift&amp;quot; &amp;quot;Ctrl&amp;quot; &amp;quot;Alt&amp;quot; のいずれかを渡してください。&lt;br /&gt;
* 大文字小文字は区別しません&lt;br /&gt;
* 実は先頭の1文字しか判断していませんので、&amp;quot;s&amp;quot;のみとかでも大丈夫です&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
戻り値(終了コード)&lt;br /&gt;
* 1: キーが押されている&lt;br /&gt;
* 0: キーは押されていない&lt;br /&gt;
* -1: エラー(引数間違い、メッセージボックスを表示します)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
マクロにショートカットキーを割り当てる際は、該当キーありとなしの両方を割り当ててください&lt;br /&gt;
* Shift+F8 / F8 など&lt;br /&gt;
&lt;br /&gt;
起動までに若干のタイムラグがありますので、すばやく操作すると取りこぼすことがあります。&lt;br /&gt;
そういう意味では、ショートカットキーにはあまり向かないかもしれません。&lt;br /&gt;
私は、ツールバー起動で使っています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 実装例 =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;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;
// SHIFTキー状態を取得&lt;br /&gt;
var shift = wshShell.Run(&amp;quot;GetKeyState.exe shift&amp;quot;, 0, true);&lt;br /&gt;
if(shift == -1) window.Quit();&lt;br /&gt;
if(shift == 1) window.Alert(&amp;quot;Shiftキーが押されています&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
(こちらは通常ダウンロードの必要はありません)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=GetKeySatate.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=3848</id>
		<title>GetKeySatate.exe(キー状態取得実行ファイル)</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=GetKeySatate.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=3848"/>
		<updated>2019-03-23T04:19:22Z</updated>

		<summary type="html">&lt;p&gt;Pizz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
キー押下状態を取得する実行ファイルです。&lt;br /&gt;
&lt;br /&gt;
Shift、Ctrl、Alt いずれかのキーの押下状態を取得できます。&lt;br /&gt;
マクロスクリプトからキー状態を取得し、状態に応じて動作をコントロールしたくて作成しました。&lt;br /&gt;
&lt;br /&gt;
作成されたマクロから利用できますので、ご自由にお使いください。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
zipファイルをダウンロードしたら、ファイルのプロパティ画面で「ブロックの解除」を行ってください。&lt;br /&gt;
(これをしないと実行時に警告が表示されることがあります)&lt;br /&gt;
&lt;br /&gt;
その後、zipファイルを展開して、マクロから実行されるフォルダーに配置してください。&lt;br /&gt;
(推奨は &amp;quot;Macros&amp;quot;フォルダーとします)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2019/3/4 新規作成&lt;br /&gt;
2019/3/23 公開ページの変更(中身に変更はありません)&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
コマンドライン引数で、&amp;quot;Shift&amp;quot; &amp;quot;Ctrl&amp;quot; &amp;quot;Alt&amp;quot; のいずれかを渡してください。&lt;br /&gt;
* 大文字小文字は区別しません&lt;br /&gt;
* 実は先頭の1文字しか判断していませんので、&amp;quot;s&amp;quot;のみとかでも大丈夫です&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
戻り値(終了コード)&lt;br /&gt;
* 1: キーが押されている&lt;br /&gt;
* 0: キーは押されていない&lt;br /&gt;
* -1: エラー(引数間違い、メッセージボックスを表示します)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
マクロにショートカットキーを割り当てる際は、該当キーありとなしの両方を割り当ててください&lt;br /&gt;
* Shift+F8 / F8 など&lt;br /&gt;
&lt;br /&gt;
起動までに若干のタイムラグがありますので、すばやく操作すると取りこぼすことがあります。&lt;br /&gt;
そういう意味では、ショートカットキーにはあまり向かないかもしれません。&lt;br /&gt;
私は、ツールバー起動で使っています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 実装例 =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;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;
// SHIFTキー状態を取得&lt;br /&gt;
var shift = wshShell.Run(&amp;quot;GetKeyState.exe shift&amp;quot;, 0, true);&lt;br /&gt;
if(shift == -1) window.Quit();&lt;br /&gt;
if(shift == 1) window.Alert(&amp;quot;Shiftキーが押されています&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
(こちらは通常ダウンロードの必要はありません)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=GetKeySatate.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=3847</id>
		<title>GetKeySatate.exe(キー状態取得実行ファイル)</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=GetKeySatate.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)&amp;diff=3847"/>
		<updated>2019-03-23T04:13:13Z</updated>

		<summary type="html">&lt;p&gt;Pizz: ページの作成:「= 概要 = キー押下状態を取得する実行ファイルです。  Shift、Ctrl、Alt いずれかのキーの押下状態を取得できます。 マクロスク...」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
キー押下状態を取得する実行ファイルです。&lt;br /&gt;
&lt;br /&gt;
Shift、Ctrl、Alt いずれかのキーの押下状態を取得できます。&lt;br /&gt;
マクロスクリプトからキー状態を取得し、状態に応じて動作をコントロールしたくて作成しました。&lt;br /&gt;
&lt;br /&gt;
作成されたマクロから利用できますので、ご自由にお使いください。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
zipファイルをダウンロードしたら、ファイルのプロパティ画面で「ブロックの解除」を行ってください。&lt;br /&gt;
(これをしないと実行時に警告が表示されることがあります)&lt;br /&gt;
&lt;br /&gt;
その後、zipファイルを展開して、マクロから実行されるフォルダーに配置してください。&lt;br /&gt;
(推奨は &amp;quot;Macros&amp;quot;フォルダーとします)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
コマンドライン引数で、&amp;quot;Shift&amp;quot; &amp;quot;Ctrl&amp;quot; &amp;quot;Alt&amp;quot; のいずれかを渡してください。&lt;br /&gt;
* 大文字小文字は区別しません&lt;br /&gt;
* 実は先頭の1文字しか判断していませんので、&amp;quot;s&amp;quot;のみとかでも大丈夫です&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
戻り値(終了コード)&lt;br /&gt;
* 1: キーが押されている&lt;br /&gt;
* 0: キーは押されていない&lt;br /&gt;
* -1: エラー(引数間違い、メッセージボックスを表示します)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
マクロにショートカットキーを割り当てる際は、該当キーありとなしの両方を割り当ててください&lt;br /&gt;
* Shift+F8 / F8 など&lt;br /&gt;
&lt;br /&gt;
起動までに若干のタイムラグがありますので、すばやく操作すると取りこぼすことがあります。&lt;br /&gt;
そういう意味では、ショートカットキーにはあまり向かないかもしれません。&lt;br /&gt;
私は、ツールバー起動で使っています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 実装例 =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;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;
// SHIFTキー状態を取得&lt;br /&gt;
var shift = wshShell.Run(&amp;quot;GetKeyState.exe shift&amp;quot;, 0, true);&lt;br /&gt;
if(shift == -1) window.Quit();&lt;br /&gt;
if(shift == 1) window.Alert(&amp;quot;Shiftキーが押されています&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
(こちらは通常ダウンロードの必要はありません)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<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=3798</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=3798"/>
		<updated>2019-03-11T04:10:42Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* プログラミング補助 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mery で使用できるマクロを集めたライブラリです。&lt;br /&gt;
&lt;br /&gt;
スクリプトを拡張子「js」 (JavaScript、JScript の場合) にして「My 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 2017/05/27&lt;br /&gt;
*[[選択文字列を強調]] (Kuro)&lt;br /&gt;
*[[行頭に移動]] (Kuro, 他) update 2014/03/15&lt;br /&gt;
*[[バイト数]] (Kuro, ks, sukemaru) update 2018/11/18 文書全体の文字数・行数表示にも対応&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;
*[[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 2018/08/04&lt;br /&gt;
*[[字下げ・字上げ]](インデント・逆インデント) (masme, sukemaru) 2014/02/09, update 2018/11/16&lt;br /&gt;
:*「[[字下げ・字上げ#インデント|インデント／逆インデント]]」を追加&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;
*[[文章で使用されている文字をユニーク抽出]] (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;
*[[行を複製 (複数行可)]] (sukemaru) 2018/08/24&lt;br /&gt;
*[[行の先頭に貼り付け]] (sukemaru) 2018/08/24&lt;br /&gt;
*[[カッコで囲う]] (ポップアップメニューあり)　(sukemaru) last modified 2018/11/19&lt;br /&gt;
: ・簡易版「カッコで囲う (ポップアップメニューなし)」&amp;lt;br&amp;gt;・「引用符を追加／削除」&amp;lt;br&amp;gt;・人柱版 追加コード「行頭/行末から任意の 文字数／文字列 を削除」&lt;br /&gt;
*[[引用符／コメント]] (※旧「引用の追加」マクロを増補改訂)　(sukemaru) 2018/10/28&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;を切り替える」&lt;br /&gt;
*[[行頭か行末 または 選択範囲の始点か終点]] (sukemaru) 2018/12/03&lt;br /&gt;
*[[文書の先頭か末尾]] (sukemaru) 2019/03/10&lt;br /&gt;
*[[定型文を挿入]] (sukemaru) 2018/12/03&lt;br /&gt;
*[[何年生で習う漢字？]] (シリル) 2019/03/10&lt;br /&gt;
&lt;br /&gt;
== ファイル操作補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[文字列中のパス起動]] (ks)&lt;br /&gt;
:*[[選択範囲のURL・パスを開く|ひらけゴマ！]] (sukemaru) update 2018/12/05 ※「選択範囲のURL・パスを開く」&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) update 2012/09/24&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;
*[[編集モードの自動選択]] または &#039;&#039;&#039;書き換え禁止で開く&#039;&#039;&#039; (sukemaru, Bleat) Update 2019/02/15&lt;br /&gt;
*[[書き換え禁止モード色反転]] (Bleat)&lt;br /&gt;
*[[特定のフォルダで「ファイルを開く」ダイアログ]] (sukemaru) fixed 2018/12/19&lt;br /&gt;
*[[ファイルのプロパティ]] (sukemaru) 2018/12/18&lt;br /&gt;
*[[すべて閉じる]] (sukemaru) 2018/12/19&lt;br /&gt;
*[[文書が変更されていなければ変更マークを消す]] (Noah)&lt;br /&gt;
*[[変更なしのタブをすべて閉じる]] (Noah)&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;
*[[ブックマーク系コマンド集]] (ks)&lt;br /&gt;
*[[テキスト変換]] (ks)&lt;br /&gt;
**[[テキスト整形]] (masme) 2013/09/15, update 2018/01/15&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 2018/04/15&lt;br /&gt;
*[[連番を挿入]] (masme) 2013/08/25&lt;br /&gt;
*[[GFMをHTMLに変換]] (noonworks) 2014/03/09&lt;br /&gt;
*[[基数変換10_16]] (シリル) 2019/02/10&lt;br /&gt;
*[[スネークケース ⇔ キャメルケースの変換]] (Noah)&lt;br /&gt;
*[[罫線変換]] (シリル) 2019/03/09&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 2018/12/20&lt;br /&gt;
*[[検索(SJIS以外)]] + 検索強調を解除 (masme) 2014/09/16, update 2017/06/26&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;
*[[任意の検索エンジンで検索]] (Noah)&lt;br /&gt;
*[[デフォルトの検索フラグを設定して検索ウィンドウ表示]] (yuko)&lt;br /&gt;
*[[簡易検索一覧]] (シリル) 2018/12/24&lt;br /&gt;
*[[簡易検索一覧などをアウトプット]] (シリル) 2018/12/31&lt;br /&gt;
*[[複数置換]] (Noah)&lt;br /&gt;
&lt;br /&gt;
== プログラミング補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[Eclipse風コメントアウト]] (ks)&lt;br /&gt;
*[[Eclipse風コメントアウト(改)]] (pizz) 2019/03/04&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;
*[[コメントマーク付け外し]] (手石, masme, sukemaru) last update 2018/11/19 ※sukemaru版に「人柱用 追加コード」&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) 2016/12/11更新&lt;br /&gt;
&lt;br /&gt;
== おもしろ ==&lt;br /&gt;
&lt;br /&gt;
*[[テキストブラウザ]] (Kuro)&lt;br /&gt;
*[[Yahoo!天気情報]] (Kuro)&lt;br /&gt;
*[[メール送信]] (ks)&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
&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) 2019/03/10&lt;br /&gt;
----&lt;br /&gt;
*[[キーアサイン集]] (ks, masme, 有志) last update 2018/10/08&lt;br /&gt;
*[[マテリアルデザインっぽいアイコンと『小マクロ集』]] (sukemaru) last update 2018/12/04&lt;br /&gt;
*[[includeライブラリ]] (ks)&lt;br /&gt;
*[[マクロ覚え書き（開発者向け）]](ks)&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<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=3797</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=3797"/>
		<updated>2019-03-11T04:10:24Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* プログラミング補助 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mery で使用できるマクロを集めたライブラリです。&lt;br /&gt;
&lt;br /&gt;
スクリプトを拡張子「js」 (JavaScript、JScript の場合) にして「My 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 2017/05/27&lt;br /&gt;
*[[選択文字列を強調]] (Kuro)&lt;br /&gt;
*[[行頭に移動]] (Kuro, 他) update 2014/03/15&lt;br /&gt;
*[[バイト数]] (Kuro, ks, sukemaru) update 2018/11/18 文書全体の文字数・行数表示にも対応&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;
*[[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 2018/08/04&lt;br /&gt;
*[[字下げ・字上げ]](インデント・逆インデント) (masme, sukemaru) 2014/02/09, update 2018/11/16&lt;br /&gt;
:*「[[字下げ・字上げ#インデント|インデント／逆インデント]]」を追加&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;
*[[文章で使用されている文字をユニーク抽出]] (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;
*[[行を複製 (複数行可)]] (sukemaru) 2018/08/24&lt;br /&gt;
*[[行の先頭に貼り付け]] (sukemaru) 2018/08/24&lt;br /&gt;
*[[カッコで囲う]] (ポップアップメニューあり)　(sukemaru) last modified 2018/11/19&lt;br /&gt;
: ・簡易版「カッコで囲う (ポップアップメニューなし)」&amp;lt;br&amp;gt;・「引用符を追加／削除」&amp;lt;br&amp;gt;・人柱版 追加コード「行頭/行末から任意の 文字数／文字列 を削除」&lt;br /&gt;
*[[引用符／コメント]] (※旧「引用の追加」マクロを増補改訂)　(sukemaru) 2018/10/28&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;を切り替える」&lt;br /&gt;
*[[行頭か行末 または 選択範囲の始点か終点]] (sukemaru) 2018/12/03&lt;br /&gt;
*[[文書の先頭か末尾]] (sukemaru) 2019/03/10&lt;br /&gt;
*[[定型文を挿入]] (sukemaru) 2018/12/03&lt;br /&gt;
*[[何年生で習う漢字？]] (シリル) 2019/03/10&lt;br /&gt;
&lt;br /&gt;
== ファイル操作補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[文字列中のパス起動]] (ks)&lt;br /&gt;
:*[[選択範囲のURL・パスを開く|ひらけゴマ！]] (sukemaru) update 2018/12/05 ※「選択範囲のURL・パスを開く」&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) update 2012/09/24&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;
*[[編集モードの自動選択]] または &#039;&#039;&#039;書き換え禁止で開く&#039;&#039;&#039; (sukemaru, Bleat) Update 2019/02/15&lt;br /&gt;
*[[書き換え禁止モード色反転]] (Bleat)&lt;br /&gt;
*[[特定のフォルダで「ファイルを開く」ダイアログ]] (sukemaru) fixed 2018/12/19&lt;br /&gt;
*[[ファイルのプロパティ]] (sukemaru) 2018/12/18&lt;br /&gt;
*[[すべて閉じる]] (sukemaru) 2018/12/19&lt;br /&gt;
*[[文書が変更されていなければ変更マークを消す]] (Noah)&lt;br /&gt;
*[[変更なしのタブをすべて閉じる]] (Noah)&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;
*[[ブックマーク系コマンド集]] (ks)&lt;br /&gt;
*[[テキスト変換]] (ks)&lt;br /&gt;
**[[テキスト整形]] (masme) 2013/09/15, update 2018/01/15&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 2018/04/15&lt;br /&gt;
*[[連番を挿入]] (masme) 2013/08/25&lt;br /&gt;
*[[GFMをHTMLに変換]] (noonworks) 2014/03/09&lt;br /&gt;
*[[基数変換10_16]] (シリル) 2019/02/10&lt;br /&gt;
*[[スネークケース ⇔ キャメルケースの変換]] (Noah)&lt;br /&gt;
*[[罫線変換]] (シリル) 2019/03/09&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 2018/12/20&lt;br /&gt;
*[[検索(SJIS以外)]] + 検索強調を解除 (masme) 2014/09/16, update 2017/06/26&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;
*[[任意の検索エンジンで検索]] (Noah)&lt;br /&gt;
*[[デフォルトの検索フラグを設定して検索ウィンドウ表示]] (yuko)&lt;br /&gt;
*[[簡易検索一覧]] (シリル) 2018/12/24&lt;br /&gt;
*[[簡易検索一覧などをアウトプット]] (シリル) 2018/12/31&lt;br /&gt;
*[[複数置換]] (Noah)&lt;br /&gt;
&lt;br /&gt;
== プログラミング補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[Eclipse風コメントアウト]] (ks)&lt;br /&gt;
*[[Eclipse風コメントアウト(改)]] (pizz) 2019/3/4&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;
*[[コメントマーク付け外し]] (手石, masme, sukemaru) last update 2018/11/19 ※sukemaru版に「人柱用 追加コード」&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) 2016/12/11更新&lt;br /&gt;
&lt;br /&gt;
== おもしろ ==&lt;br /&gt;
&lt;br /&gt;
*[[テキストブラウザ]] (Kuro)&lt;br /&gt;
*[[Yahoo!天気情報]] (Kuro)&lt;br /&gt;
*[[メール送信]] (ks)&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
&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) 2019/03/10&lt;br /&gt;
----&lt;br /&gt;
*[[キーアサイン集]] (ks, masme, 有志) last update 2018/10/08&lt;br /&gt;
*[[マテリアルデザインっぽいアイコンと『小マクロ集』]] (sukemaru) last update 2018/12/04&lt;br /&gt;
*[[includeライブラリ]] (ks)&lt;br /&gt;
*[[マクロ覚え書き（開発者向け）]](ks)&lt;/div&gt;</summary>
		<author><name>Pizz</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=3796</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=3796"/>
		<updated>2019-03-11T04:10:05Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 更新履歴 */&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キーの状態を取得したかったのですが、スクリプトからは難しかったので、本体とは別に実行ファイルを作成しました。&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;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
(こちらはダウンロードの必要はありません)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2019/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</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=3767</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=3767"/>
		<updated>2019-03-05T06:39:56Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 概要 */&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キーの状態を取得したかったのですが、スクリプトからは難しかったので、本体とは別に実行ファイルを作成しました。&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;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
(こちらはダウンロードの必要はありません)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2018/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</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=3766</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=3766"/>
		<updated>2019-03-04T08:23:31Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 概要 */&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キーの状態を取得したかったのですが、スクリプトからは難しかったので、本体とは別に実行ファイルを作成しました。&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;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
(こちらはダウンロードの必要はありません)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2018/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</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=3765</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=3765"/>
		<updated>2019-03-04T08:23:10Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 概要 */&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キーの状態を取得したかったのですが、スクリプトからは難しかったので、本体とは別に実行ファイルを作成しました。&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;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
(こちらはダウンロードの必要はありません)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2018/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</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=3764</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=3764"/>
		<updated>2019-03-04T08:21:47Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 概要 */&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キーの状態を取得したかったのですが、スクリプトからは難しかったので、本体とは別に実行ファイルを作成しました。&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;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2018/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</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=3763</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=3763"/>
		<updated>2019-03-04T08:11:19Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 概要 */&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キーの状態を取得したかったのですが、スクリプトからは難しかったので、本体とは別に実行ファイルを作成しました。&lt;br /&gt;
&lt;br /&gt;
zipファイルを展開して、Macrosフォルダーに以下のファイルも配置してください。&lt;br /&gt;
&lt;br /&gt;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2018/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</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=3762</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=3762"/>
		<updated>2019-03-04T08:09:58Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 概要 */&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キーの状態を取得したかったのですが、スクリプトからは難しかったので、本体とは別に別途実行ファイルを作成しました。&lt;br /&gt;
&lt;br /&gt;
zipファイルを展開して、Macrosフォルダーに以下のファイルも配置してください。&lt;br /&gt;
&lt;br /&gt;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2018/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</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=3761</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=3761"/>
		<updated>2019-03-04T08:08:52Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 概要 */&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キーの状態を取得したかったのですが、スクリプトからは難しかったので、別途実行ファイルを作成しました。&lt;br /&gt;
&lt;br /&gt;
zipファイルを展開して、Macrosフォルダーに配置してください。&lt;br /&gt;
&lt;br /&gt;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2018/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:GetKeyStateSrc.zip&amp;diff=3760</id>
		<title>ファイル:GetKeyStateSrc.zip</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:GetKeyStateSrc.zip&amp;diff=3760"/>
		<updated>2019-03-04T08:07:59Z</updated>

		<summary type="html">&lt;p&gt;Pizz: マクロからキーボードの状態を取得するための実行ファイルのソースです(VS2005 C++)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;マクロからキーボードの状態を取得するための実行ファイルのソースです(VS2005 C++)&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<entry>
		<id>https://www.haijin-boys.com/wiki/index.php?title=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:GetKeyState.zip&amp;diff=3759</id>
		<title>ファイル:GetKeyState.zip</title>
		<link rel="alternate" type="text/html" href="https://www.haijin-boys.com/wiki/index.php?title=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:GetKeyState.zip&amp;diff=3759"/>
		<updated>2019-03-04T08:07:13Z</updated>

		<summary type="html">&lt;p&gt;Pizz: マクロからキーボードの状態を取得するための実行ファイルです&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;マクロからキーボードの状態を取得するための実行ファイルです&lt;/div&gt;</summary>
		<author><name>Pizz</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=3758</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=3758"/>
		<updated>2019-03-04T08:06:05Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 概要 */&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;
ksさんに感謝するとともに、せっかく作成したので、ここに公開します。&lt;br /&gt;
&lt;br /&gt;
なお、SHIFTキーの状態を取得したかったのですが、スクリプトからは難しかったので、別途実行ファイルを作成しました。&lt;br /&gt;
zipファイルを展開して、Macrosフォルダーに配置してください。&lt;br /&gt;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2018/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</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=3757</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=3757"/>
		<updated>2019-03-04T08:05:56Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 概要 */&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;
ksさんに感謝するとともに、せっかく作成したので、ここに公開します。&lt;br /&gt;
&lt;br /&gt;
なお、SHIFTキーの状態を取得したかったのですが、スクリプトからは難しかったので、別途実行ファイルを作成しました。&lt;br /&gt;
zipファイルを展開して、Macrosフォルダーに配置してください。&lt;br /&gt;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2018/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</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=3756</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=3756"/>
		<updated>2019-03-04T08:05:39Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* 更新履歴 */&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;
ksさんに感謝するとともに、せっかく作成したので、ここに公開します。&lt;br /&gt;
&lt;br /&gt;
なお、SHIFTキーの状態を取得したかったのですが、スクリプトからは難しかったので、別途実行ファイルを作成しました。&lt;br /&gt;
zipファイルを展開して、Macrosフォルダーに配置してください。&lt;br /&gt;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2018/3/4 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</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=3755</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=3755"/>
		<updated>2019-03-04T08:05:25Z</updated>

		<summary type="html">&lt;p&gt;Pizz: ページの作成:「= 概要 = Eclipse風なコメントアウト &amp;lt;=&amp;gt; コメントの除去を行います。  ksさんの作成された、Eclipse風コメントアウトは、私にと...」&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;
ksさんに感謝するとともに、せっかく作成したので、ここに公開します。&lt;br /&gt;
&lt;br /&gt;
なお、SHIFTキーの状態を取得したかったのですが、スクリプトからは難しかったので、別途実行ファイルを作成しました。&lt;br /&gt;
zipファイルを展開して、Macrosフォルダーに配置してください。&lt;br /&gt;
コマンドライン引数で、&amp;quot;shift&amp;quot; &amp;quot;ctrl&amp;quot; &amp;quot;alt&amp;quot; を指定すると、そのキーの押下状態を取得できるので、他のマクロからもご利用いただけます。&lt;br /&gt;
[[ファイル:GetKeyState.zip]]&lt;br /&gt;
&lt;br /&gt;
ソースも置いときます(VS2005 C++)&lt;br /&gt;
[[ファイル:GetKeyStateSrc.zip]]&lt;br /&gt;
&lt;br /&gt;
= 更新履歴 =&lt;br /&gt;
2018/3/1 新規作成&lt;br /&gt;
&lt;br /&gt;
= コード =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&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 == &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;
if(shift == -1) window.Quit();&lt;br /&gt;
&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;) window.Quit();&lt;br /&gt;
&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;
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;
// コメント文字設定をファイルから読み込み&lt;br /&gt;
function LoadDocSetting()&lt;br /&gt;
{&lt;br /&gt;
  var dic = LoadDocSettingDataListWithOpend();&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;
  dic[window.document.FullName.toLowerCase()] = comStr;&lt;br /&gt;
  SaveDocSettingDataListWithOpend(dic);&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;
  var dic = {};&lt;br /&gt;
&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;
  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;
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;
    window.Quit();&lt;br /&gt;
  }&lt;br /&gt;
  return settingPath;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
	<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=3754</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=3754"/>
		<updated>2019-03-04T08:04:58Z</updated>

		<summary type="html">&lt;p&gt;Pizz: /* プログラミング補助 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mery で使用できるマクロを集めたライブラリです。&lt;br /&gt;
&lt;br /&gt;
スクリプトを拡張子「js」 (JavaScript、JScript の場合) にして「My 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 2017/05/27&lt;br /&gt;
*[[選択文字列を強調]] (Kuro)&lt;br /&gt;
*[[行頭に移動]] (Kuro, 他) update 2014/03/15&lt;br /&gt;
*[[バイト数]] (Kuro, ks, sukemaru) update 2018/11/18 文書全体の文字数・行数表示にも対応&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;
*[[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 2018/08/04&lt;br /&gt;
*[[字下げ・字上げ]](インデント・逆インデント) (masme, sukemaru) 2014/02/09, update 2018/11/16&lt;br /&gt;
:*「[[字下げ・字上げ#インデント|インデント／逆インデント]]」を追加&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;
*[[文章で使用されている文字をユニーク抽出]] (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;
*[[行を複製 (複数行可)]] (sukemaru) 2018/08/24&lt;br /&gt;
*[[行の先頭に貼り付け]] (sukemaru) 2018/08/24&lt;br /&gt;
*[[カッコで囲う]] (ポップアップメニューあり)　(sukemaru) last modified 2018/11/19&lt;br /&gt;
: ・簡易版「カッコで囲う (ポップアップメニューなし)」&amp;lt;br&amp;gt;・「引用符を追加／削除」&amp;lt;br&amp;gt;・人柱版 追加コード「行頭/行末から任意の 文字数／文字列 を削除」&lt;br /&gt;
*[[引用符／コメント]] (※旧「引用の追加」マクロを増補改訂)　(sukemaru) 2018/10/28&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;を切り替える」&lt;br /&gt;
*[[行頭か行末 または 選択範囲の始点か終点]] (sukemaru) 2018/12/03&lt;br /&gt;
*[[定型文を挿入]] (sukemaru) 2018/12/03&lt;br /&gt;
&lt;br /&gt;
== ファイル操作補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[文字列中のパス起動]] (ks)&lt;br /&gt;
:*[[選択範囲のURL・パスを開く|ひらけゴマ！]] (sukemaru) update 2018/12/05 ※「選択範囲のURL・パスを開く」&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) update 2012/09/24&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;
*[[編集モードの自動選択]] または &#039;&#039;&#039;書き換え禁止で開く&#039;&#039;&#039; (sukemaru, Bleat) Update 2019/02/15&lt;br /&gt;
*[[書き換え禁止モード色反転]] (Bleat)&lt;br /&gt;
*[[特定のフォルダで「ファイルを開く」ダイアログ]] (sukemaru) fixed 2018/12/19&lt;br /&gt;
*[[ファイルのプロパティ]] (sukemaru) 2018/12/18&lt;br /&gt;
*[[すべて閉じる]] (sukemaru) 2018/12/19&lt;br /&gt;
*[[文書が変更されていなければ変更マークを消す]] (Noah)&lt;br /&gt;
*[[変更なしのタブをすべて閉じる]] (Noah)&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;
*[[ブックマーク系コマンド集]] (ks)&lt;br /&gt;
*[[テキスト変換]] (ks)&lt;br /&gt;
**[[テキスト整形]] (masme) 2013/09/15, update 2018/01/15&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 2018/04/15&lt;br /&gt;
*[[連番を挿入]] (masme) 2013/08/25&lt;br /&gt;
*[[GFMをHTMLに変換]] (noonworks) 2014/03/09&lt;br /&gt;
*[[基数変換10_16]] (シリル) 2019/02/10&lt;br /&gt;
*[[スネークケース ⇔ キャメルケースの変換]] (Noah)&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 2018/12/20&lt;br /&gt;
*[[検索(SJIS以外)]] + 検索強調を解除 (masme) 2014/09/16, update 2017/06/26&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;
*[[任意の検索エンジンで検索]] (Noah)&lt;br /&gt;
*[[デフォルトの検索フラグを設定して検索ウィンドウ表示]] (yuko)&lt;br /&gt;
*[[簡易検索一覧]] (シリル) 2018/12/24&lt;br /&gt;
*[[簡易検索一覧などをアウトプット]] (シリル) 2018/12/31&lt;br /&gt;
*[[複数置換]] (Noah)&lt;br /&gt;
&lt;br /&gt;
== プログラミング補助 ==&lt;br /&gt;
&lt;br /&gt;
*[[Eclipse風コメントアウト]] (ks)&lt;br /&gt;
*[[Eclipse風コメントアウト(改)]] (pizz)&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;
*[[コメントマーク付け外し]] (手石, masme, sukemaru) last update 2018/11/19 ※sukemaru版に「人柱用 追加コード」&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) 2016/12/11更新&lt;br /&gt;
&lt;br /&gt;
== おもしろ ==&lt;br /&gt;
&lt;br /&gt;
*[[テキストブラウザ]] (Kuro)&lt;br /&gt;
*[[Yahoo!天気情報]] (Kuro)&lt;br /&gt;
*[[メール送信]] (ks)&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
&lt;br /&gt;
*[[最新版を確認]] (diaphragm)&lt;br /&gt;
*[[キーアサイン集]] (ks, masme, 有志) last update 2018/10/08&lt;br /&gt;
*[[マテリアルデザインっぽいアイコンと『小マクロ集』]] (sukemaru) last update 2018/12/04&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;
*[[includeライブラリ]] (ks)&lt;br /&gt;
*[[マクロ覚え書き（開発者向け）]](ks)&lt;br /&gt;
*[[Editor.OpenFile()のポリフィル]](kazy)&lt;br /&gt;
*[[折り返しトグル切り替え]] (Bleat, sukemaru) update 2019/02/19&lt;/div&gt;</summary>
		<author><name>Pizz</name></author>
	</entry>
</feed>