FGALDC 15 HTMLタグ間ジャンプ みなさん、こんにちは。 ここも寂しいので、ちょっとネタ振り。 Vzには #58 という対応する括弧へジャンプするコマンドがあります。 これと似たような感じで、HTMLの開始タグと終了タグの間で相互にジャンプ するマクロを作ってみました。 タブ・空白変換をしていないので申し訳ありませんが。 = complement tag a:タグカウンタ b:カーソル位置テンポラリ * M 80 ^QG "対応するHTMLタグ" ?. &s &#M(3) b=ky, (cd=='>')?{#58} ;タグ閉じ括弧なら開き括弧にジャンプ :a (cd=='<')?{>b} ;タグ開き括弧なら処理 (cd=='>')?{>e} ;タグの外にいた時は終了 #s (r)?{>e}?{>a} ;開き括弧に到着するまでまわる :b #d a0, ;カウンタ0クリア (cd=='/')?{ ;終了タグなら #d #G ;要素名取得し :c #r ;開始タグ検索 (r)?{>y} ;見つからなかった時は終了 #s ;見つけたものが (cd=='<')?{ ;本当に開始タグなら (a==0)?{>z} ;カウンタが0ならそれで終了 (a!=0)?{a--, >c};そうでなければ入れ子になってるので } ;カウンタデクリメントし再検索 (cd=='/')?{ ;終了タグらしきものの場合 #s ;本当に終了タグなら (cd=='<')?{a++,};カウンタインクリメントし再検索 } >c ;タグでなかった場合も再検索 }?{ ;開始タグなら #G ;要素名取得し :d #c ;終了タグ検索 (r)?{>y} ;見つからなかった時は終了 #s ;見つけたものが (cd=='/')?{ ;終了タグらしきものの場合 #s (cd=='<')?{ ;本当に終了タグなら (a==0)?{>z} ;カウンタが0ならそれで終了 (a!=0)?{a--,} ;そうでなければ入れ子になって } ;いるのでカウンタデクリメント #d#d >d ;タグでなかった場合も含め再検索 } (cd=='<')?{a++,} ;開始タグならカウンタインクリメント #d >d ;再検索 } :y &m("対応するタグが見つかりません") :e &#U(3) ky=b, :z &d . * さて、このマクロで、私としてはだいたい満足できています。 が、いくつか改善したいところがあるのも確かです。 例えば、p と pre みたいに、要素名の短いタグでジャンプさせたいのに、長い方 の要素名でも引っかかってしまってうまくジャンプできない可能性があったりし ます。まぁ、きちんと終了タグを書いていればほとんど問題はないはずなのです が、i と img とか、b と br みたいに、そもそも終了タグがないものがあったり すると、途端に破綻します。 もしかしたら、要素名取得のところで #G #F #e "[^a-zA-Z0-9]" #m とかするだけでもうまく行くかもしれませんが、全く試していません。 あと、今はそういうニーズはないのですが、例えば
みたいなタグにも対 応しておけば、もしかしたら少しは将来性があるのかもしれません。 ほんとは開始タグと終了タグを同時にOR検索できるとうれしいのですが、例の vwx のバグに引っかかってしまって、うまくできませんでした。もし、うまくこ の制限を回避して同時に検索する方法とか、あるいは全く別のロジックを思いつ かれた方がいらっしゃいましたら、ぜひご教示いただけると幸いです。 あと、簡単そうなところとしては、検索文字列を汚さないようにするとか、カー ソル位置の保存法を変える、なんていうところがあるかと思います。 ぜひ、皆様のアイディアで、このマクロをいじってやってください。                                  としき