行の内容及びHTMLタグの間を順次選択するマクロ
カーソル行の内容を選択します。
行頭のタブや半角スペース、行末の改行を除いて、テキストとして意味のある部分を選択します。
連続して実行すると、次の行の内容を選択します。
空行は飛ばします。
HTMLタグがある場合は、タグの間にあるテキストを選択します。
連続して実行すると、次のタグの間にあるテキストを選択します。
コメントやPHPのタグも、タグとみなします。
ちょっと特殊な挙動のマクロですが、個人的に使用頻度が高かったので公開しました。
ダウンロード
更新履歴
- 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タグのような記述があると、行選択するつもりが部分選択になってしまう場合があります。
一応、演算子のような記述は検出しないようにしてあります。