web404

HTMLのテキスト部分を順次選択するマクロ

カーソル位置の論理行の内容を選択します。
論理行頭のタブや半角スペース、論理行末の改行は除いて、テキストとして意味のある部分を選択します。
連続して実行すると、次の論理行の内容を選択します。
空行は飛ばします。

HTMLタグがある場合は、タグの間にあるテキストを選択します。
連続して実行すると、次のタグの間にあるテキストを選択します。
コメントやPHPのタグも、タグとみなします。

HTML以外でも、行の内容を順次選択するマクロとして使えます。


ダウンロード

line_content.zip


更新履歴

Version 1.20 (2025/2/21)
マクロ名の変更
サブルーチンの修正
探索を左方向と右方向で分けた
不要な処理の削除
ソースコードの整理
過去の履歴
Version 1.12 (2025/1/28)
範囲選択に関する修正
タグの先頭における動作の修正
対象がなければ警告音で終了するようにした
Version 1.11 (2024/1/10)
コメント、PHPタグに関する修正
Version 1.10 (2023/11/25)
ソースコード全体の書き直し
colorcodeの使用を廃止
汎用性の向上
Version 1.00 (2023/10/7)
公開

ソースコード

setcompatiblemode 0x20200;
#x = x; #y = y;
#cont = 0;
disabledraw;

if (selecting) {
	escape;
	if (code == 13) moveto2 0, lineno + 1;	//連続実行時の処理
	else if (code == -1) {
		beep;
		goto End;
	}
	call CheckTagTop;
	if (##return) #cont = 1;
}

if (column && (!#cont)) call SeekLeft;
call SeekRight;

while (code == 13 && #ct == #ce) {	//論理行末の処理
	moveto2 0, lineno + 1;
	call SeekRight;
}

if (#ct == #ce) {	//対象がなければ警告音で終了
	moveto #x, #y;
	beep;
	goto End;
}

moveto2 #ct, lineno;
beginsel;
moveto2 #ce, lineno;
endsel;

goto End;

SeekLeft:	//左方向にタグを探索
	while (column) {
		left;
		call CheckTagTop;
		if (##return) break;
		call CheckTagEnd;
		if (##return) {
			right;
			break;
		}
	}
	return;

SeekRight:	//右方向に行の内容及びタグの間を探索
	if (!column) while (code == 9 || code == 32) right;	//論理行頭のタブ、半角スペースを無視
	call SkipTag;
	#ct = column;
	
	while (code != 13 && code != -1) {
		call CheckTagTop;
		if (##return) break;
		call CheckTagEnd;
		if (##return) #ct = column + 1;
		right;
	}
	#ce = column;
	
	return;

SkipTag:	//連続するタグを無視
	while (1) {
		call CheckTagTop;
		if (!##return) break;
		$$str = gettext2(column, lineno, column + 4, lineno);
		if (!strstr($$str, "<!--")) searchdown "-->";
		else if (!strstr($$str, "<?")) searchdown "?>";
		else searchdown "[^ <=>?-]>", regular;
		if (result) moveto selendx, selendy;
		else break;
	}
	return;

CheckTagTop:	//カーソル位置がタグの先頭かを調べる
	##r = 0;
	if (code == '<') {
		right;
		if ((code >= 'a' && code <= 'z') || (code >= 'A' && code <= 'Z')
		 || code == '!' || code == '/' || code == '?') ##r = 1;
		left;
	}
	return ##r;

CheckTagEnd:	//カーソル位置がタグの末尾かを調べる
	##r = 0;
	if (column && code == '>') {
		left;
		if (!(code == 32 || code == '-'
		 || code == '<' || code == '=' || code == '>')) ##r = 1;
		else if (column && code == '-') {
			left;
			if (code == '-') ##r = 1;
			right;
		}
		right;
	}
	return ##r;

End:	//終了処理
	enabledraw;
	endmacro;

colorcodeを使えばもっと簡単に書けますし、最初はそうしていたんですが、「ファイルタイプ別の設定」に依存するので、汎用性を持たせるために全体を書き直しました。
これにより、HTML以外のファイルでも使いやすくなっています。

ただし、あくまでもHTMLを優先しているので、HTMLタグのような記述があると、行選択するつもりが部分選択になってしまう場合があります。
一応、演算子のような記述は検出しないようにしてあります。