🔍

ddu.vimにちゃんと入門した話

2023/05/29に公開

これは Vim駅伝 5/29の記事です。

はじめに

Vim/Neovim 用ファジーファインダー(FF)である、ddu.vim にちゃんと入門しました。
せっかくなのでその備忘録と、どういう人に向いていそうかなどを適当に書いてみます。

ddu.vim 自体の説明はあまりしません。
作者の記事があるのでこちらをどうぞ。

https://zenn.dev/shougo/articles/ddu-vim-beta

結論

親切ではない。これに尽きるように思います。
これは利点でもあり、欠点でもあるでしょう。
ユーザーに見えないところでよしなにやってくれることはほぼありませんが、その分細かく挙動を制御できます。
全ての挙動を制御したい。設定したようにしか動かないでほしい。
そのための設定やバグ修正、存在しないモジュールの自作などのコストを払える人にとっては理想的な FF です。

ですので、ライトユーザーにはオススメできません。
ddu.vim に手を出すのは、telescope.nvim や fzf-lua などのオールインワン系の FF を使ってみて、もっとカスタマイズしたいと思ってからでいいと思います。
あれらは多大な労力で多くの機能がプリインストールされており、普通に使えば素晴らしいプラグインです。

私が ddu を導入したのは1週間少し前ですが、色々と直したり新しく作ったりする羽目になりました。

https://github.com/yuki-yano/ddu-filter-fzf
https://github.com/gamoutatsumi/ddu-source-nvim-lsp
https://github.com/uga-rosa/ddu-source-search_history
https://github.com/uga-rosa/ddu-filter-converter_devicon
https://github.com/uga-rosa/ddu-filter-sorter_length

本体や ui-ff へのバグ報告も、(vim-jpで) 何件も行いました。
報告すると毎回素早く @Shougo さんが対応してくださり、大変助かりました。

私が作者の想定から離れた使い方をしているせいなので、普通の移行ならここまで大変なことになる可能性は低いと思います。

また ddu-source-nvim-lsp に関してなのですが、一応 references ソースは直してあります。
しかし、Neovim 側の仕様と一部の LS の仕様が悪魔的に噛み合っているせいで、なかなか面倒なことになっています。
設計からやり直した方がよさそうなので、この記事を書いたら取りかかる予定です。

やりました。詳細記事はまた書きます。

https://github.com/uga-rosa/ddu-source-lsp

設定

https://github.com/uga-rosa/dotfiles/blob/df96d680c7db82137d44456a51716d80eef71349/nvim/rc/ddu.toml
https://github.com/uga-rosa/dotfiles/blob/df96d680c7db82137d44456a51716d80eef71349/nvim/lua/rc/ddu.lua

dotfiles は公開しているので、実際の設定はリンクとして丸ごと貼っておきます。
このあたりを見れば ddu 関連の設定は大体あると思います。

私の設定の特徴

ddu.vim は本来、通常の Vim バッファ同様にノーマルモードで操作することを想定しています。

しかし私の使い方は

  • 絞り込みを多用
  • ファイルを開く以外のアクションはほとんど使わない

であるため、他の FF 同様に filter window の insert mode からの操作を主軸とした方が効率的です。
最初から filter に入るようにし(startFilter を有効化)、fzf で候補を絞った後に(カーソルを動かしても数行)そのまま filter からファイルを開く、というワークフローに合わせてマッピングしました。

注意点ですが、一部のアクションは insert mode から呼ぶと壊れるので、文字列で <Esc> からマッピングしなければいけません。
これは ddu の実装が悪い等の話ではなく、Vim の仕様の問題です。
他の FF では機能を制限し、プラグインからマッピングすることで回避しているのでしょうが、ddu ではそのようなことはしません。
任意のアクションを生やせる代償として受け止めましょう。
私はラッパーを書きました。

また、新規タブでファイルを開くときに :tcd を走らせるようにしています。
これで、タブローカルにプロジェクトルートを管理できるようになりました。

UI の設定では floating window を使うようにし、サイズや位置を調整しています。
見た目を個人の好みで調整できるのも嬉しい点ですね。

見た目といえば

devicon を追加するこの converter を使えばリッチな見た目になるのでおすすめです(ステマ)。
https://github.com/uga-rosa/ddu-filter-converter_devicon

また、各種呼び出しを :Ddu のサブコマンドとして登録する方式にしています。

こちらは特に関係ありません(というか入れてません)
https://github.com/Shougo/ddu-commands.vim

これは toml でソースごとの設定を分割するためです。
require() をハックする package.preload を使ったりして(無駄に)テクニカルなので、気になる人は読んでみてください。
ちゃんと補完にも対応しています。

cmdline-complete

おわりに

この記事を読んで、「へへっ、面白そうじゃねえか」と思える人にはとても向いていると思います。
深い沼に一緒に沈みましょう。。。

GitHubで編集を提案

Discussion