Surround the world #7


{
abc
def
}

という感じのブロックがあったとして、カーソルが波括弧の内部、つまり [cci]{[/cci] と [cci]}[/cci] の中にあったとき、

  1. [cci]ds{[/cci]
  2. [cci]ds}[/cci]

したとき微妙に動作が異なり、またそれがいまいち文書化されてない件。

1. の場合、バッファの内容に関しては何も起こらない。ただ、カーソル位置が [cci]{[/cci] の直前行に何故か飛ぶ。
2. の場合、期待したような動作をする。特に、[cci]{[/cci] および [cci]}[/cci] がそれ自身だけで構成されるような行であった場合、行自体が削除される

この違いって、どういう意図があってそうなっているのかよくわからないのだけど。

* * *

今試してみたら、なんか、同じ動作をした。…!? どういうことなの…。どうも、その時々のファイルタイプやカーソル位置やその他諸々の理由によって動作が安定しない感じがしないでもない。

うーんまあそれはそれとして、複数行のブロックの surrounding の削除を考えるとき、

  • 左側の包囲文字列のインデント量
  • 左側の包囲文字列が orphan であるかどうか。つまり、[cci]^\s*\{\s*$[/cci] みたいな状態であるかどうか。orphan であれば、行自体を削除できる。orphan でなければ、左側の包囲文字列と、その直後に並ぶ空白文字列を削除する
  • 右側の包囲文字列が orphan であるかどうか。orphan であれば、行自体を削除できる。orphan でなければ、右側の包囲文字列およびその直前に並ぶ空白文字列を削除する
  • 包囲されている内容のインデント。内容の各行について、左側の包囲文字列のインデント量で強制的に上書きする

といった点に気をつける必要がある。あるというか、surround.vim がそういう動作をするようになっている。

この中で不可思議なのは内容のインデント操作だ。というのは、包囲文字列を挿入する場合は、内容について右シフトを行うのである。そうすると、対応する削除の場合は左シフトじゃないの? と思うのだけど、そうではないのである。なんでだろうか。

Leave a Reply

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