« 日付と時間を挿入するショートカットキーを実現する秀丸マクロ | メイン | サーバーメンテナンスのお知らせ »

2010/05/15
EclipseのようなIDEのように選択範囲をコメント化/解除する秀丸マクロ

なぜかちょっとだけマイブームの秀丸マクロで選択範囲を"//"でコメント化とコメント化解除するマクロを作ってみました。
探せばありそうな気がとてもしたけど、気にせず作っちゃいました。
タイトルはEclipseのようなと書きましたが、動きはZend Development Environmentに合わせました。
選択範囲の最初の行の先頭が"//"以外の場合は選択範囲全てをコメント化します。
選択範囲の最初の行の先頭が"//"の場合は、選択範囲の行の先頭の"//"を削除します。

マクロを登録し、Ctrl + / のショートカットキーを割り当てるとIDEと同じ操作でコメント化できます。

comment1.mac(1.8kb)

//EclipseなどのIDEのように、単一行もしくは複数行をコメント化・コメント解除するマクロ


//範囲選択中の場合は、選択範囲の行すべてコメント化する。
if(selecting) {
	//現在の選択範囲を退避
	#tmp_seltopx = seltopx;
	#tmp_seltopy = seltopy;
	#tmp_selendx = selendx;
	#tmp_selendy = selendy;
	
	//一旦選択範囲を解除
	escape;
	
	//選択範囲の開始行から終了行までコメントにしていく
	#i = #tmp_seltopy;
	
	//行の先頭へ移動
	moveto 0, #i;
	//先頭行がコメント("//")かどうかのフラグ
	#comment_flag = false;
	//選択範囲を再設定する際のカーソルオフセット
	#offset = 2;
	if(code == 0x2F) { //0x2Fは"/"の文字コード
		right;
		if(code == 0x2F) {
			#comment_flag = true;
			#offset = -2;
		}
	}
	while(#i <= #tmp_selendy) {
		moveto 0, #i;
		//先頭行がコメントの場合は、選択範囲のコメント行を解除していく。
		if(#comment_flag == true) {
			//先頭の文字が"/"の場合
			if(code == 0x2F) {
				//右へ1文字移動
				right;
				//次の文字も"/"の場合、BSを2回発行してコメント化を解除する。
				if(code == 0x2F) {
					right;
					backspace;
					backspace;
				}
			}
		//先頭行がコメントではない場合は、選択範囲の行すべてをコメント化していく。
		} else {
			insert "//";
		}
		#i = #i + 1;
	}
	
	//カーソルを選択範囲開始位置に移動
	moveto #tmp_seltopx + #offset, #tmp_seltopy;
	
	//選択範囲を元に戻す
	beginsel;
	moveto #tmp_selendx + #offset, #tmp_selendy;
	endsel;

//範囲選択中ではない場合
} else {
	//現在のカーソル位置を退避
	#tmp_x = x;
	#tmp_y = y;
	//行頭に移動
	golinetop2;
	//先頭の文字が"/"の場合
	if(code == 0x2F) {
		//右へ1文字移動
		right;
		//次の文字も"/"の場合、BSを2回発行してコメント化を解除する。
		if(code == 0x2F) {
			right;
			backspace;
			backspace;
		}
		#tmp_x = #tmp_x - 2;
		if(#tmp_x < 0) {
			#tmp_x = 0;
		}
	} else {
		insert "//";
		#tmp_x = #tmp_x + 2;
	}
	moveto #tmp_x, #tmp_y;
}

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)