Motions and operators に

http://d.hatena.ne.jp/janus_wel/20100808/1281285821 の続き。範囲指定のハナシ。

  • linewise, characterwise
    • 行をまたぐ motion が指定された場合は行単位に操作を行う linewise となって、 1 行以内におさまる motion が指定された場合文字単位に操作を行う characterwise になるということだけど文字だけの説明じゃちょっとわかりにくいな。手を動かすの推奨。
    • あとあくまで motion によってここらへんが決まるのであって operator だけではわからないというわけだね。
  • exclusive, inclusive
    • で、文字単位での motion の場合 ( characterwise と書いてないのは何か意味があるのかな ) さらに exclusive か inclusive かのどっちかになるよ、と。
      • inclusive は始点と終点の間にある text を operation の対象とするということでこれを日本語でというか英語でも一言で表現する語はないので inclusive という語にこういう意味を持たせたわけだ。
      • exclusive は inclusive の範囲から buffer の終端方向の一文字を取り除いた範囲にあたるみたい。これも同様に exclusive という語にこういう意味を付加しますよ、と読んでおけばいい。
    • linewise は常に始点も終点も含むのでこういう概念はないというようなことが書かれている。
    • ちなみに motion に ex-command を使う場合は exclusive になるぽい ( d:call search("foo") は exclusive だった ) ?
    • ここらへんの記述てつまり linewise, characterwise, exclusive, inclusive ていう言葉が出てくる文脈は operator + motion のハナシだよと言ってるわけだよな。
  • 例外
    • 上記までが一般的な規則。で、規則には例外があるのが常なんだけどこれらの例外事項は linewise であるときに限定されるみたい。
    • ひとつめ。 exclusive かつ終点が 1 列目になる motion を inclusive かつ終点をひとつ上の行の最後の文字にするという風に扱う規則。例に d} があがってるんだけど ( :help } ) これをこの例外規則なしに実行すると段落の次の空行も一緒に delete してしまうわけだね。
    • ふたつめ。 motion が exclusive であるとき、終点が 1 列目かつ始点がその行の最初の非 blank 文字 ( space と tab 以外 ) かそれより前の場合、 linewise として扱う、というもの。正直文字だけで説明するのはアレだと思ったので画像で。
      • の cursor 位置で d} を打つと になるんだけどこれはここの例外が働いた場合。
      • で、 の場合は例外の前提から外れる ( 最初の非 blank 文字じゃない ) ので のようになる。
  • o_v, o_V, o_CTRL-V
    • operator を打った直後に vV<C-v> を打つと linewise を exclusive に、とか exclusive を inclusive に、それらの逆とか、いろいろ挙動を変えられるみたい。
    • めんどくさいので以下 command と画像でお送りします。もとの buffer が という前提ね。
      • linewise のまま。 dj ->
      • linewise を exclusive に。 dvj ->
      • linewise を blockwise に。 d<C-v>j ->
      • exclusive を inclusive に。 dvgj ->
      • exclusive を linewise に。 dVl ->
    • ただここらへんを使えてうれしい場面がわからない。慣れの問題 ?

それぞれの motion が linewise か exclusive か inclusive かくらいは覚えておくといいよという結論に落ち着いた。おぼえるつっても category ごとに決まってるような感じなのでそんなに苦ではない感じ。