Vim 8.0 Advent Calendar 18 日目 新しい関数 ～情報取得編～

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 18 日目の記事です。

今回は新しく追加された関数の中から、情報を取得するものを中心に紹介します。

## `wordcount()`

現在バッファの統計情報を辞書で取得します。
この情報は `g<C-g>` コマンドで表示できるものですが、表示だけだとスクリプトから扱うのが困難であるため、関数が追加されました。

辞書には以下の情報が含まれます。

| キー            | 説明 |
|:--------------- |:-------|
| `bytes`         | バッファ内のバイト数です。|
| `chars`         | バッファ内の文字数です。|
| `words`         | バッファ内の単語数です。|
| `cursor_bytes`  | カーソル位置より前のバイト数です。ビジュアルモードでない場合のみ存在します。|
| `cursor_chars`  | カーソル位置より前の文字数です。ビジュアルモードでない場合のみ存在します。|
| `cursor_words`  | カーソル位置より前の単語数です。ビジュアルモードでない場合のみ存在します。|
| `visual_bytes`  | ビジュアル選択領域内のバイト数です。ビジュアルモードの場合のみ存在します。|
| `visual_chars`  | ビジュアル選択領域内の文字数です。ビジュアルモードの場合のみ存在します。|
| `visual_words`  | ビジュアル選択領域内の単語数です。ビジュアルモードの場合のみ存在します。|

## `getbufinfo([{expr}])` `getbufinfo([{dict}])`

バッファの情報を辞書の配列で取得します。引数を与えない場合、全てのバッファの情報を取得します。
配列の各要素の辞書は、以下のエントリーを持っています。

| キー            | 説明 |
|:----------------|:-----|
| `bufnr`         | バッファ番号です。 |
| `changed`       | バッファが変更されているなら('modified' がオンなら) TRUE になります。 |
| `changedtick`   | バッファが変更された回数(b:changedtick の値)です。 |
| `hidden`        | 隠れバッファであるなら('hidden' がオンなら) TRUE になります。 |
| `listed`        | バッファがバッファリストに表示されるなら('buflisted' がオンなら) TRUE になります。 |
| `loaded`        | バッファがロード済みなら TRUE になります。 |
| `name`          | バッファ名(バッファのファイルのフルパス)です。 |
| `signs`         | サインの情報のリストです。リストの各要素は辞書で、以下の要素を持ちます。 <table><tr><th>キー</th><th>説明</th></tr><tr><td>id</td><td>サインの ID</td></tr><tr><td>lnum</td><td>行番号</td></tr><tr><td>name</td><td>サインの名前</td></tr></table> |
| `variables`     | バッファローカル変数を参照する辞書です。 |
| `windows`       | バッファを表示しているウィンドウのウィンドウ ID のリストです。 |

引数を渡した場合は、取得したいバッファの条件を指定することで絞り込みができます。詳細は help を参照してみてください。

## `getwininfo([{winid}])`

ウィンドウの情報を辞書の配列で取得します。引数を与えない場合、全てのタブページのウィンドウの情報を取得します。
配列の各要素の辞書は、以下のエントリーを持っています。

| キー            | 説明 |
|:--------------- |:------ |
| `bufnr`         | ウィンドウが開いているバッファのバッファ番号です。 |
| `height`        | ウィンドウの高さです。 |
| `loclist`       | このウィンドウがロケーションリストだった場合は 1 です。 |
| `quickfix`      | このウィンドウが quickfix ウィンドウだった場合は 1 です。 |
| `tabnr`         | ウィンドウがあるタブページのタブページ番号です。 |
| `variables`     | ウィンドウローカル変数を参照する辞書です。 |
| `width`         | ウィンドウの幅です。 |
| `winid`         | ウィンドウ ID です。 |
| `winnr`         | ウィンドウ番号です。 |

引数にウィンドウ ID を渡した場合は、指定したウィンドウ ID の情報のみを含む配列を取得できます。

## `gettabinfo([{arg}])`

タブページの情報を辞書の配列で取得します。引数を与えない場合、全てのタブページのウィンドウの情報を取得します。
配列の各要素の辞書は、以下のエントリーを持っています。

| キー            | 説明 |
|:--------------- |:------ |
| `tabnr`         | タブページ番号です。 |
| `variables`     | タブページローカル変数を参照する辞書です。 |
| `windows`       | タブページで表示されているウィンドウのウィンドウ ID のリストです。 |

引数にタブページ番号を渡した場合は、指定したタブページ番号の情報のみを含む配列を取得できます。

## `getcharsearch()` `setcharsearch({dict})`

文字検索の情報を取得、設定できます。文字検索とは、`f` `F` `t` `T` で行う、指定した文字やその手前に飛ぶ機能のことです。
文字検索の情報を持つ辞書を取得、および設定できます。この辞書は以下の要素を持ちます。

| key       | 説明                                                                                            |
|:----------|:------------------------------------------------------------------------------------------------|
| `char`    | 検索文字です。空文字列にすると、文字検索を解除します。                                          |
| `forward` | 検索方向です。1 ならば前方、0 ならば後方です。                                                  |
| `untill`  | 検索の種類です。1 の場合は、文字の手前(`t` か `T`)、0 の場合は文字自体(`f` か `F`) の検索です。 |

## `getcmdwintype()`

`getcmdtype()` のコマンドラインウィンドウ版です。
`q:` `q/` `q?` でコマンドラインウィンドウを開いている時に、現在のコマンドラインウィンドウがどのタイプかを返します。戻り値は `:` `/` `?` のいずれかで、コマンドラインウィンドウが開かれていない場合は空文字列を返します。

## `getcompletion({pat}, {type} [, {filtered}])`

コマンドラインの補完の結果を取得できます。`{type}` は以下のうちのどれかです。

| `{type}`        | 説明    |
|:----------------|:--------|
| `augroup`       | autocmd のグループ名です。 |
| `buffer`        | バッファ名です。 |
| `behave`        | `:behave` Ex コマンドの引数です。 |
| `color`         | カラースキームです。 |
| `command`       | Ex コマンドです。 |
| `compiler`      | `:compiler` Ex コマンドの引数です。 |
| `cscope`        | `:cscope` Ex コマンドの引数です。 |
| `dir`           | ディレクトリ名です。 |
| `environment`   | 環境変数です。 |
| `event`         | autocmd のイベント名です。 |
| `expression`    | Vim の式です。 |
| `file`          | ファイル名とディレクトリ名です。 |
| `file_in_path`  | `'path'` にあるファイル名とディレクトリ名です。 |
| `filetype`      | ファイルタイプの名前です。 |
| `function`      | 関数名です。 |
| `help`          | help の項目です。 |
| `highlight`     | ハイライトグループです。 |
| `history`       | `:history` Ex コマンドの引数です。 |
| `locale`        | ロケールの名前(`locale -a` の出力)です。 |
| `mapping`       | キーマッピングの名前です。 |
| `menu`          | メニューです。 |
| `option`        | オプションです。 |
| `shellcmd`      | シェルコマンドです。 |
| `sign`          | `:sign` Ex コマンドの引数です。 |
| `syntax`        | syntax ファイルのファイル名です。 |
| `syntime`       | `:syntime` Ex コマンドの引数です。 |
| `tag`           | tags ファイルから読み取れるタグです。 |
| `tag_listfiles` | `tag` と同じです。 |
| `user`          | ユーザー名です。 |
| `var`           | Vim script の変数です。 |

`{pat}` で候補を絞り込めます。コマンドラインに入力されている文字列を渡します。
`{filtered}` に 1 を渡すと、`'wildignore'` オプションを結果に適用します。

## `arglistid([{winnr} [, {tabnr}]])`

Vim には引数リストという機能があります。これはグローバルなものが 1 つあり、それとは別にウィンドウ毎にローカルなものが作成できます。
引数リストの使い方についてはここでは省略しますが、この関数はこの引数リストの ID を取得できます。
指定したウィンドウにローカルな引数リストがなく、グローバルなものが使用されている場合は 0 を返します。引数が無効だった場合は -1 を返します。