web404

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

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

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

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


ダウンロード

line_content.zip


更新履歴

Version 1.20 (2025/2/17)
マクロ名の変更
サブルーチンの修正
探索を左方向と右方向で分けた
ソースコードの整理
過去の履歴
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;
disabledraw;

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

call SeekLeft;
call SeekRight;

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

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

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

goto End;

SeekLeft:	//左方向にタグを探索
	while (column) {
		left;
		if (code == '<') {
			right;
			if ((code >= 'a' && code <= 'z') || (code >= 'A' && code <= 'Z')
			 || code == '!' || code == '/' || code == '?') {
				left;
				break;
			}
			left;
		} else if (code == '>') {
			if (!column) break;
			left;
			if (!(code == 32 || code == '-'
			 || code == '<' || code == '=' || code == '>')) {
				right 2;
				break;
			} else if (code == '-') {
				if (!column) break;
				left;
				if (code == '-') {
					right 3;
					break;
				}
				right;
			}
			right;
		}
	}
	return;

SeekRight:	//右方向に行の内容及びタグの間を探索
	if (!column) while (code == 9 || code == 32) right;	//論理行頭のタブ、半角スペースを無視
	call SkipTag;
	#ct = column;
	
	while (code != 13 && code != -1) {
		if (code == '<') {
			right;
			if ((code >= 'a' && code <= 'z') || (code >= 'A' && code <= 'Z')
			 || code == '!' || code == '/' || code == '?') {
				left;
				break;
			}
			left;
		} else if (column && code == '>') {
			left;
			if (!(code == 32 || code == '-'
			 || code == '<' || code == '=' || code == '>')) {
				right 2;
				call SkipTag;
				#ct = column;
				continue;
			} else if (code == '-') {
				if (!column) {
					right 2;
					continue;
				}
				left;
				if (code == '-') {
					right 3;
					call SkipTag;
					#ct = column;
					continue;
				}
				right;
			}
			right;
		}
		right;
	}
	#ce = column;
	
	return;

SkipTag:	//連続するタグを無視
	while (code == '<') {
		right;
		if (!((code >= 'a' && code <= 'z') || (code >= 'A' && code <= 'Z')
		 || code == '!' || code == '/' || code == '?')) {
			left;
			break;
		}
		left;
		$$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;

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

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

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