rhysd/vim-operator-surround — pull request #15 by machakann (2014-12-13 15:27:01+00:00)
Title: 矩形選択時に "$" コマンドが使われた場合に選択範囲を行末まで拡張する

矩形選択の選択範囲は基本的には矩形なのですが、 組み込みオペレータは "$" コマンドが使われた場合各行の行末まで対象範囲を広げます。例えば次のようなバッファを考えます。
```
aaa
bbbb
cc
```
このバッファで`gg2j$d`と入力するとバッファは三行の空行をとなります。このように、キー入力`gg2j$(operator-surround-append)'`で次のような状態にするのが目的です。
```
'aaa'
'bbbb'
'cc'
```

補足として、コード中の
```vim
let is_extend = winsaveview().curswant == 1/0
```
この行が肝で、`winsaveview()`関数の返す辞書の`curswant`キーの値が整数の最大値をとる時に上記の機能が発動することになります。`winsaveview()`関数のこの挙動についてはhelpにないのですが、vim-jpのissues https://github.com/vim-jp/issues/issues/604 にて意図された挙動であるとお聞きしたので大丈夫だと思います。バージョンの新しいVimでは`getcurpos()`関数でも`curswant`の値を取得できるのですが、先のissueにあるように将来的には解消されてほしい問題があるので今回は使用を避けました。
この行の前に
```vim
if getpos("'[")[0:2] == getpos("'<")[0:2] && getpos("']")[0:2] == getpos("'>")[0:2]
```
のような判定を置いているのは、ヴィジュアルモード以外にも`o_CTRL-V`やユーザー定義テキストオブジェクトを使うことでノーマルモードから`s:surround_blocks()`,`s:delete_surrounds_in_block()`関数を呼ぶことができるためです。ノーマルモードからはこの機能は発動してほしくないので、誤爆を防ぐ意味でおいています。