🔬

vim-readme-viewerの対象をfzfで選択するコマンドを作った

2021/12/08に公開

先日、vim-readme-viewerというプラグインが公開されました。
導入しているプラグインのREADMEをVimで開くことができます。

https://github.com/4513ECHO/vim-readme-viewer

作者の響さんの記事も公開されています。

https://zenn.dev/4513echo/articles/2021-12-04-vim-readme-viewer

Neovim向けの比較的新しいプラグインなどはhelpがしっかり作られていないことも多いので、使い方を調べるのに役立ちます。

しかし、意外と「プラグイン名を指定する」ところが面倒に感じられました。
plugin-nameについて調べようと思ったときに、指定するべき名前がplugin-name.vimだったか、それともvim-plugin-nameだったか…のように迷ってしまうことがあったためです。まあコマンド入力時に候補は出るのですが…。

そこで、fzfでプラグインを選択してvim-readme-viewerへ渡すコマンドを作ってみました。

なお、vim-readme-viewerは複数種類のプラグインマネージャに対応していますが、本記事では筆者の使用しているvim-plug用のコマンドを紹介します。

FzReadmeコマンド(vim-plug用)

以下のFzReadmeコマンドおよびs:PlugReadmeFzf関数を設定ファイルに定義してください。
名前は他のコマンド等と被りづらいように筆者の好みで決めただけなので、お好みに合わせて調整してください。

.vimrc or init.vim
command! FzReadme call fzf#run(fzf#wrap(#{
          \ source: values(map(copy(g:plugs), {k,v-> k.' '.get(split(globpath(get(v,'dir',''), '\creadme.*'), '\n'), 0, '')})),
          \ options: ['--with-nth=1', '--preview', 'bat --color=always --plain {2}'],
          \ sink: funcref('s:PlugReadmeFzf')}))
function s:PlugReadmeFzf(name_and_path) abort
  execute 'PlugReadme' substitute(a:name_and_path, ' .*', '', '')
endfunction

:FzReadmeでfzfの検索ウィンドウが起動し、READMEをプレビューしつつ、インストールされているプラグインを選択できます。

動作例

解説

fzfのvim用関数を使用しています。

fzf#run()にオプションを渡すことでfuzzy findを起動できるのですが、fzf#wrap()を経由すると明示的に設定していないオプションを良い感じに補ってくれます。
ちなみに、辞書リテラルではキーの引用符を省略できます。最近知りました。
https://twitter.com/kg8m_/status/1467167562551025670

source

fuzzy findする対象のリストです。
vim-plugによって読み込まれたプラグインは、g:plugsという変数に格納されているので、これをvalues(map())して、プラグイン名 READMEファイルのパスという文字列のリストを生成しています。

options

fzfのcliオプションに対応する配列です。
上記の通り、検索対象の項目はプラグイン名 READMEファイルのパスという空白区切りの文字列になっているため、前半のプラグイン名を検索部に表示し、後半のパスをbatに渡してREADMEファイルのプレビューを行っています。

sink

fzfで選択した結果が渡される関数です。
検索結果はプラグイン名 READMEファイルのパスという空白区切りの文字列になっているため、直接PlugReadmeコマンドへ渡すことはできません。
そこで、s:PlugReadmeFzf関数内で前半のプラグイン名のみを取り出す処理を挟んでいます。
(ここ、関数を挟まないで実行できるスマートな方法ありましたらご教示いただきたいです)

vim-plug以外のプラグインマネージャの場合

vim-plug以外のプラグインマネージャを使用している場合は、上記コマンドのg:plugsからプラグイン名を取り出す部分と、表示に使うコマンド(PlugReadme)を各プラグイン向けに変更してください。

おわりに

やっぱり何かを選択するという場面ではfzfは非常に便利ですね。
ご参考になれば幸いです。

Discussion