Vim(2) Advent Calendar 3 個目です。QuickFix ウィンドウを使う時に便利な小さなプラグインを作りました。
名前の通りこれは Neovim 用なのですが、一応、大昔に作った Vim 版もあります(ただし一部機能が未完成)。
これは何?
動画の通り、QuickFix ウィンドウを内容に応じて伸縮してくれるプラグインです。QuickFix ウィンドウに入った時と Neovim 自体の大きさが変わった時に、内容行から計算していい感じの行数に調整してくれます。QuickFix の行数を求めるなら単純に getqflist()
から可能なのですが、set wrap
してると狭いウィンドウで行が折り返してしまうので、それを含めて高さを計算しているのがミソです。
これだけでは何なので……
ネタ的にこれだけだと何なので、更に小ネタも載せておきます。
Git の差分を QuickFix に突っ込む
lewis6991/gitsigns.nvim のメイン機能はファイルの中で Git の差分を分かり易く表示してくれるものなのですが、setqflist
/ setloclist
関数を使うと QuickFix ウィンドウに結果を放り込んでくれます。この画像では HEAD
との差分を表示しています。
これは QuickFix 全般の話になるのですが、QuickFix ウィンドウ使うならkevinhwang91/nvim-bqfは是非入れておきましょう。上記の画像ではすでに使っていますが、QuickFix ウィンドウにプレビュー画面を付け、カーソルの動きに合わせて順次表示してくれます。
ただちょっとこのプラグイン、QuickFix ウィンドウで自動的に set nowrap
しちゃうんですよね…… 拙作 delphinus/qfheight.nvim の意義が半減しちゃうのが残念(あとで issue 立てておこう)。
更に、PR のレビューではこれに加えて tpope/vim-fugitive を使います。
コマンド | 意味 |
---|---|
Git diff main |
main ブランチとの差分を QuickFix ウィンドウに入れる |
Gitsigns change_base main true |
gitsigns の差分は main からの差分にする |
Gitsigns diffthis main |
新旧のファイルを左右に開いて見比べる |
Gitsigns reset_base |
サインの状態を元に戻す |
これらのコマンドを適当なキーにマッピングしておくとレビューが捗ります。
ドキュメント読んだのですが Git difftool
に当たるコマンドが lewis6991/gitsigns.nvim に見当たりませんでした。一応 issue も立てておいたのですが(lewis6991/gitsigns.nvim#692)、反応してくれるかな?
更に更に、このように QuickFix ウィンドウを渡り歩くなら tpope/vim-unimpaired もお勧めです。このプラグインを入れると QuickFix 用に様々なマッピングが定義されます。
マッピング | コマンド | 意味 |
---|---|---|
[q |
:cprevious |
前の差分へ |
]q |
:cnext |
次の差分へ |
[Q |
:cfirst |
最初の差分へ |
]Q |
:clast |
最後の差分へ |
[<C-q> |
:cpfile |
前のファイルへ |
]<C-q> |
:cnfile |
次のファイルへ |
などなど。詳しくはヘルプを見てください。他にも色々定義されますので、煩わしければ自分で必要な分だけ定義してあげても良いですね。
Telescope の結果を QuickFix に突っ込む
みんな大好き nvim-telescope/telescope.nvim は <C-q>
を押すと、結果を QuickFix ウィンドウに放り込むマッピングをデフォルトで定義してくれます。
この例では Telescope live_grep
の結果を <C-q>
で QuickFix ウィンドウに突っ込んでいます。Telescope は検索結果から更に絞り込むようなことは自由にできないので、この機能は大変重宝しています。また、この状態で再び Telescope を開始できますから、検索結果を一次的にストックするような用途にも使えますね。
以上、QuickFix ネタとしてはすでに @YuseiUeno さんが書かれていたのですが、そこに無いネタとして挙げさせていただきました。
Vim(2) Advent Calendar には以下の 2 記事も書いているので是非読んでみてください。