web404

行の内容及びHTMLタグの間を順次選択するマクロ

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

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

ちょっと特殊な挙動のマクロですが、個人的に使用頻度が高かったので公開しました。


ダウンロード

line_content.zip


更新履歴

Version 1.11 (2024/1/10)
コメント、PHPタグに関する修正
Version 1.10 (2023/11/25)
ソースコード全体の書き直し
汎用性の向上
Version 1.00 (2023/10/7)
公開

ソースコード

setcompatiblemode 0x20200;
disabledraw;

if (selecting && code == 13) moveto2 0, lineno + 1;	//連続実行時の処理

call LineContent;

while (code == 13 && gettext(seltopx, seltopy, x, y, 1) == "") {	//行末の処理
	moveto2 0, lineno + 1;
	call LineContent;
}

enabledraw;
endmacro;

LineContent:	//行の内容及びHTMLタグの間を選択
	if (selecting) escape;
	call SkipTag;
	
	while (1) {	//左方向にタグを探索
		if (!column) {
			while (code == 9 || code == 32) right;	//行頭のタブ、半角スペースを無視
			break;
		}
		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;
		}
	}
	call SkipTag;
	##cb = 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 (code == '>') {
			if (!column) {
				right;
				continue;
			}
			left;
			if (!(code == 32 || code == '-' || code == '<' || code == '=' || code == '>')) {
				right 2;
				call SkipTag;
				##cb = column;
				continue;
			} else if (code == '-') {
				if (!column) {
					right 2;
					continue;
				}
				left;
				if (code == '-') {
					right 3;
					call SkipTag;
					##cb = column;
					continue;
				}
				right;
			}
			right;
		}
		right;
	}
	##ce = column;
	
	moveto2 ##cb, lineno;
	beginsel;
	moveto2 ##ce, lineno;
	endsel;
	return;

SkipTag:	//連続するタグを無視
	while (code == '<') {
		right;
		if ((code >= 'a' && code <= 'z') || (code >= 'A' && code <= 'Z') || code == '!' || code == '/' || code == '?') {
			left;
			$$str = gettext2(column, lineno, column + 4, lineno);
			if (!strstr($$str, "<!--")) searchdown "-->";
			else if (!strstr($$str, "<?")) searchdown "?>";
			else searchdown "[^ <=>?-]>", regular;
			if (!result) break;
			moveto selendx, selendy;
			continue;
		}
		left;
		break;
	}
	return;

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

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