vim-readme-viewerの対象をfzfで選択するコマンドを作った
先日、vim-readme-viewerというプラグインが公開されました。
導入しているプラグインのREADMEをVimで開くことができます。
作者の響さんの記事も公開されています。
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
関数を設定ファイルに定義してください。
名前は他のコマンド等と被りづらいように筆者の好みで決めただけなので、お好みに合わせて調整してください。
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()
を経由すると明示的に設定していないオプションを良い感じに補ってくれます。
ちなみに、辞書リテラルではキーの引用符を省略できます。最近知りました。
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