新年度から使いたい Vim プラグイン：textobj プラグイン編

[ブログ記事](http://secret-garden.hatenablog.com/entry/2015/04/11/235802)からの転載です。

#### 前回

* [新年度から使いたい Vim プラグイン：自作プラグイン編 - Secret Garden(Instrumental)](http://secret-garden.hatenablog.com/entry/2015/04/06/235038)
* [新年度から使いたい Vim プラグイン：自作以外のプラグイン編 - Secret Garden(Instrumental)](http://secret-garden.hatenablog.com/entry/2015/04/08/234634)
<br>
<br>
さて、今回は Vim の特徴的な機能である textobj を拡張するプラグインを紹介したいと思います。  
Vim は textobj（と operator ）を理解するかで Vim の使い勝手が全然変わるのでよくわからない人もこの機会に調べてみるとよいと思います。  

* [Vim Advent Calendar 2013 97日目:モモンガでもわかるテキストオブジェクトとオペレータ - C++でゲームプログラミング](http://d.hatena.ne.jp/osyo-manga/20140307/1394204974)

## はじめに : Vim プラグインを管理するプラグイン

プラグインを導入する前にプラグインを管理するプラグインを入れましょう。

* __[Shougo/neobundle.vim](https://github.com/Shougo/neobundle.vim)__

使い方などはドキュメントや__[ここら辺](http://kaworu.jpn.org/vim/NeoBundle)__を参考にするとよいでしょう。
また、他のプラグイン管理プラグインには以下のようなものもあります。

* __[junegunn/vim-plug](https://github.com/junegunn/vim-plug)__
* __[tpope/vim-pathogen](https://github.com/tpope/vim-pathogen)__

neobundle.vim があわないと感じたらこの2つも試してみるとよいと思います。  
特に vim-pathogen は単純な管理システムで git に依存しないので git を使いたくない方は vim-pathogen を使うとよいでしょう。
<br>
<br>
あと今回は紹介するプラグインのほとんどが以下のプラグインに依存しているので、予め導入しておくとよいでしょう。

```vim
NeoBundle 'kana/vim-textobj-user'
```

## __[osyo-manga/vim-textobj-multiblock](https://github.com/osyo-manga/vim-textobj-multiblock)__

textobj-multiblock は `i(` や `i"`、`i[` などを統一の textobj として扱う事ができる textobj です。  
デフォルトでは `isb` と `asb` にキーマッピングが割り当てられています。  
<br>
Vim の textobj で括弧内を指定する場合、`()` 内なら `i(`、`""` 内なら `i"` と使い分ける必要があります。  
しかし、textobj-multiblock を利用すると `isb` でカーソル位置から一番近い `(` や `"`、`[` などが対象となり、`i(` や `i"` などを使い分ける必要がなくなります。  
ハマるとかなり便利な textobj なので、ぜひ 1度試してみるとよと思います。  
その他、設定方法などは以下のサイトを参照してください。

#### 参照

* [textobj-multiblock つくった - C++でゲームプログラミング](http://d.hatena.ne.jp/osyo-manga/20130329/1364569153)

## __[osyo-manga/vim-textobj-from_regexp](https://github.com/osyo-manga/vim-textobj-from_regexp)__

```vim
NeoBundle 'osyo-manga/vim-textobj-from_regexp'
```

vim-textobj-from_regexp は任意の正規表現パターンにマッチする範囲を対象とする textobj です。  
どういうことかというと、例えば `yin` でカーソル下の数値をヤンクできるようにしたい場合に、

```vim
omap <expr> in textobj#from_regexp#mapexpr('\d\+')
```

と設定するとカーソル下の数値（`\d\+` にマッチするテキスト）を対象とした textobj となります。  
これを設定しておけば operator + `in` でカーソル下の数値を対象とした操作を行う事ができます。  
<br>
こんな感じに正規表現で手軽に textobj を定義することができます。  
わたしは以下のようなマッピングを行ない `iw` と差別化を行っています。

```vim
" 設定例
" 英数字 + _ を対象とした textobj
omap <expr> i<C-w> textobj#from_regexp#mapexpr('\w\+')
xmap <expr> i<C-w> textobj#from_regexp#mapexpr('\w\+')

" 英数字のみを対象とした textobj
omap <expr> i<A-w> textobj#from_regexp#mapexpr('[A-Za-z0-9]\+')
xmap <expr> i<A-w> textobj#from_regexp#mapexpr('[A-Za-z0-9]\+')
```

##### 参照

* [Vim Advent Calendar 2013 167日目: 任意の正規表現パターンにマッチする textobj を書いた - C++でゲームプログラミング](http://d.hatena.ne.jp/osyo-manga/20140516/1400251726)


## __[sgur/vim-textobj-parameter](https://github.com/sgur/vim-textobj-parameter)__

```vim
NeoBundle 'sgur/vim-textobj-parameter'
```

textobj-parameter は関数の引数を対象とした textobj です。  
デフォルトでは `i,` と `a,` にキーマッピングが割り当てられています。  
現在位置の関数引数を削除したいと思うことが結構あるので割と重宝しています。  

#### 参照

* [ textobj-parameter 0.1.0 - :set titlestring=秀丸](http://d.hatena.ne.jp/ampmmn/20100224/1267020691)


## __[glts/vim-textobj-comment](https://github.com/glts/vim-textobj-comment)__

```vim
NeoBundle 'glts/vim-textobj-comment'
```

その名の通りコードのコメント部分を対象とした textobj です。  
デフォルトでは `i,` と `a,` にキーマッピングが割り当てられています。  
コメントを操作するプラグインはいくつか合ったと思うんですが、わたしはこれを（これも）使っています。  
コメントアウトを一括で削除したい時とかに便利。

## __[osyo-manga/vim-textobj-blockwise](https://github.com/osyo-manga/vim-textobj-blockwise)__

```vim
NeoBundle 'osyo-manga/vim-textobj-blockwise'
```

textobj-blockwise は矩形を対象とするための textobj です。  
矩形というのは、例えば、

```vim
" 連続してる複数行の 'textobj' という単語を削除したい
omap ab <Plug>(textobj-multiblock-a)
omap ib <Plug>(textobj-multiblock-i)
vmap ab <Plug>(textobj-multiblock-a)
vmap ib <Plug>(textobj-multiblock-i)

```

と、いう場合に `textobj` という単語を矩形オブジェクトとして一括で操作することができます。  
上記の例では一番上の `textobj` にカーソルを合わせて `dIw`（`i` を `I` にする）を入力すると `textobj` という単語が一括で削除できます。  
デフォルトのキーマッピングでは、組み込みの textobj の `i` や `a` を大文字の `I` や `A` にすると矩形の範囲になります。  
詳しくは以下の記事を参照してください。  


#### 参照

* [Vim Advent Calendar 2013 107日目: Vim で矩形なオブジェクトを対象とする為の textobj を書いた - C++でゲームプログラミング](http://d.hatena.ne.jp/osyo-manga/20140317/1395066378)

## まとめ

書いてみたら半分以上自分でつくったプラグインだった。  
冒頭でも書きましたが Vim の textobj は強力な機能の一つです。  
まだ textobj に慣れてない方はぜひ、この機会に少し調べてみるとよいでしょう。  
今回は少ししか紹介しませんでしたが、textobj 系のプラグインはまだまだたくさんあるので、気になる方は以下のページを見てみるとよいと思います。
次回は operator のプラグインを紹介します。  

## 参照

* [Vim の textobj プラグインをまとめた - C++でゲームプログラミング](http://d.hatena.ne.jp/osyo-manga/20130717/1374069987)