Tagging a text

Text Object の [cci]it[/cci] および [cci]at[/cci] を Range Symbols へ持ってくる。

これは何かといえば、カーソル位置の前後のタグを認識する処理だ。つまり単純に考えれば、[cci]<[/cci] で始まり [cci]>[/cci] で終わっているのがタグである。そして 2 文字目が [cci]/[/cci] であれば終了タグであり、そうでなければ開始タグだ。これを利用しつつ、開始タグと内容と終了タグの全体を選択するのが [cci]at[/cci] であり、内容だけを選択するのが [cci]it[/cci] だ。

もちろん実際にはそう単純ではなく、

  • カウントが指定された場合は、カウントの分だけいわゆる parentNode を辿った先の要素のタグを対象にする
  • タグの内部は改行も含まれることを意識しないといけない
  • vim は短縮タグ([cci]
    [/cci] みたいなの)は、タグとみなさない
  • 対応する終了タグが見つからない開始タグは、タグとみなさない。これはなかなかヒューリスティックに働く。vim の該当処理は XML 宣言も SGML の注釈宣言も知らないが、このルールにより結果的になんとなくうまく動く。
  • 走査の結果出た選択領域が、走査前と同一であった場合は親のノードを対象に再度やり直すといったつじつま合わせが必要。この処理は visual モードで連続して [cci]it[/cci] した場合に実行される

といった感じのことを念頭に置く必要がある。

念の為書いておくが、毎度書いてる気がするが、こういったことは本来 SGML なり XML なり HTML のパーサが保持しているノードの木構造を参照すべきことなのであって、テキストベースでカーソル位置の前後をチラ見してどうこうする vim の手法は根本的に間違っているのだが、まあ仕方がないのです。

* * *

作った。

Leave a Reply

Your email address will not be published. Required fields are marked *