QuickFix を自動で伸縮する（他、色々）

Vim(2) Advent Calendar 3 個目です。QuickFix ウィンドウを使う時に便利な小さなプラグインを作りました。

* [delphinus/qfheight.nvim: Resize quickfix window automatically][delphinus/qfheight.nvim]

[delphinus/qfheight.nvim]: https://github.com/delphinus/qfheight.nvim

名前の通りこれは Neovim 用なのですが、一応、大昔に作った Vim 版もあります（ただし一部機能が未完成）。

* [delphinus/vim-quickfix-height][delphinus/vim-quickfix-height]

[delphinus/vim-quickfix-height]: https://github.com/delphinus/vim-quickfix-height

# これは何？

![Kapture 2022-12-15 at 21.05.00.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8880/c5a0355f-c4a3-d735-4c12-83cb9223ef7f.gif)

動画の通り、QuickFix ウィンドウを内容に応じて伸縮してくれるプラグインです。QuickFix ウィンドウに入った時と Neovim 自体の大きさが変わった時に、内容行から計算していい感じの行数に調整してくれます。QuickFix の行数を求めるなら単純に `getqflist()` から可能なのですが、`set wrap` してると狭いウィンドウで行が折り返してしまうので、それを含めて高さを計算しているのがミソです。

# これだけでは何なので……

ネタ的にこれだけだと何なので、更に小ネタも載せておきます。

## Git の差分を QuickFix に突っ込む

https://twitter.com/delphinus35/status/1602441651531943936

[lewis6991/gitsigns.nvim][] のメイン機能はファイルの中で Git の差分を分かり易く表示してくれるものなのですが、`setqflist` / `setloclist` 関数を使うと QuickFix ウィンドウに結果を放り込んでくれます。この画像では `HEAD` との差分を表示しています。

これは QuickFix 全般の話になるのですが、QuickFix ウィンドウ使うなら[kevinhwang91/nvim-bqf][]は是非入れておきましょう。上記の画像ではすでに使っていますが、QuickFix ウィンドウにプレビュー画面を付け、カーソルの動きに合わせて順次表示してくれます。

:::note info

ただちょっとこのプラグイン、QuickFix ウィンドウで自動的に `set nowrap` しちゃうんですよね…… 拙作 [delphinus/qfheight.nvim][] の意義が半減しちゃうのが残念（あとで issue 立てておこう）。

:::

[kevinhwang91/nvim-bqf]: https://github.com/kevinhwang91/nvim-bqf

更に、PR のレビューではこれに加えて [tpope/vim-fugitive][] を使います。

[lewis6991/gitsigns.nvim]: https://github.com/lewis6991/gitsigns.nvim
[tpope/vim-fugitive]: https://github.com/tpope/vim-fugitive

| コマンド | 意味 |
|--|--|
| `Git diff main` | main ブランチとの差分を QuickFix ウィンドウに入れる |
| `Gitsigns change_base main true` | gitsigns の差分は main からの差分にする |
| `Gitsigns diffthis main` | 新旧のファイルを左右に開いて見比べる |
| `Gitsigns reset_base` | サインの状態を元に戻す |

これらのコマンドを適当なキーにマッピングしておくとレビューが捗ります。

:::note info

ドキュメント読んだのですが `Git difftool` に当たるコマンドが lewis6991/gitsigns.nvim に見当たりませんでした。一応 issue も立てておいたのですが（[lewis6991/gitsigns.nvim#692][issue]）、反応してくれるかな？

[issue]: https://github.com/lewis6991/gitsigns.nvim/issues/692

:::

更に更に、このように QuickFix ウィンドウを渡り歩くなら [tpope/vim-unimpaired][] もお勧めです。このプラグインを入れると QuickFix 用に様々なマッピングが定義されます。

[tpope/vim-unimpaired]: https://github.com/tpope/vim-unimpaired

| マッピング | コマンド | 意味 |
|--|--|--|
| `[q` | `:cprevious` | 前の差分へ |
| `]q` | `:cnext` | 次の差分へ |
| `[Q` | `:cfirst` | 最初の差分へ |
| `]Q` | `:clast` | 最後の差分へ |
| `[<C-q>` | `:cpfile` | 前のファイルへ |
| `]<C-q>` | `:cnfile` | 次のファイルへ |

などなど。詳しくはヘルプを見てください。他にも色々定義されますので、煩わしければ自分で必要な分だけ定義してあげても良いですね。

## Telescope の結果を QuickFix に突っ込む

みんな大好き [nvim-telescope/telescope.nvim][] は `<C-q>` を押すと、結果を QuickFix ウィンドウに放り込むマッピングをデフォルトで定義してくれます。

[nvim-telescope/telescope.nvim]: https://github.com/nvim-telescope/telescope.nvim

![Kapture 2022-12-16 at 17.55.43.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8880/6f5de1a7-3129-e54a-c9ce-684094df4aec.gif)

この例では `Telescope live_grep` の結果を `<C-q>` で QuickFix ウィンドウに突っ込んでいます。Telescope は検索結果から更に絞り込むようなことは自由にできないので、この機能は大変重宝しています。また、この状態で再び Telescope を開始できますから、検索結果を一次的にストックするような用途にも使えますね。

----

以上、QuickFix ネタとしてはすでに @YuseiUeno さんが[書かれていた][]のですが、そこに無いネタとして挙げさせていただきました。

[書かれていた]: https://zenn.dev/ysay1125/articles/19d9972c7dde27

Vim(2) Advent Calendar には以下の 2 記事も書いているので是非読んでみてください。

* [爆速で起動する Neovim を作る - Qiita](https://qiita.com/delphinus/items/fb905e452b2de72f1a0f)
* [関数を返す関数を呼び出せる関数を返す関数を書く - Qiita](https://qiita.com/delphinus/items/ced2d6d4c44aa45af3af)