🐡

fzf-luaを使う

2022/09/30に公開

https://github.com/ibhagwan/fzf-lua

(Neo)Vimのfuzzy finderといえばいろいろなプラグインがありますが、中でもfzf-luaはとても高機能です。基本的なファイル検索の他様々な機能をサポートしており、特にGitやLSP連携はとても強力です。開発に必要な多くの機能をこのプラグインでカバーすることができます。

公式のGithubページも丁寧にまとめられているのですが、機能の割に日本語の情報が少なかったので今回紹介することにしました。気になったら是非使ってみてください。

インストール

お使いのプラグインマネージャに合わせて設定ファイルに追加してください。Packerの場合はこんな感じです。

nvim/init.lua
require("packer").startup(function()
  use { 'ibhagwan/fzf-lua',
    -- optional for icon support
    requires = { 'kyazdani42/nvim-web-devicons' }
  }
end)
  • Dependencies
    • Linux or MacOS
    • neovim version > 0.5.0
    • fzf version > 0.27 (see note below) or skim binary installed
    • nvim-web-devicons (optional)

fd, bat, rgなどのOptional dependenciesもありますので必要なら適宜インストールしてください。

設定

起動するだけなら特別な設定は必要ありません。こちらを参考にカスタマイズしてみてください。

FzfLuaNormalFzfLuaBorderはそれぞれデフォルトでNoramlBorderにリンクされていますが、同じ配色にした方が統一感があってオススメです。

termguicolorsを有効にしてwinblendを設定すると透過表示できるのでかなり格好いいです。気分上げていきましょう。

キーボードショートカットはお好きにカスタマイズしてください。よく使うものに絞っても数が多くてキーの数が足りなくなってしまうので大変です。

nvim/init.lua
require'fzf-lua'.setup({
  winopts = {
    height     = 0.85,     -- window height
    width      = 0.80,     -- window width
    row        = 0.35,     -- window row position (0=top, 1=bottom)
    col        = 0.50,     -- window col position (0=left, 1=right)
    border     = 'rounded' -- 'none', 'single', 'double', 'thicc' or 'rounded'
    fullscreen = false,    -- start fullscreen?
  },
})

vim.cmd [[
highlight FzfLuaNormal guibg=#383850
highlight FzfLuaBorder guibg=#383850
]]

vim.opt.winblend = 5
vim.opt.termguicolors = true

vim.g.mapleader = " "
vim.keymap.set('n', '<leader>e', "<cmd>lua require('fzf-lua').files()<CR>")
vim.keymap.set('n', '<leader>g', "<cmd>lua require('fzf-lua').git_status()<CR>")
vim.keymap.set('n', '<leader>b', "<cmd>lua require('fzf-lua').git_branches()<CR>")
vim.keymap.set('n', '<leader>p', "<cmd>lua require('fzf-lua').grep()<CR>")
vim.keymap.set('n', '<leader>/', "<cmd>lua require('fzf-lua').blines()<CR>")

vim.keymap.set('n', '<leader>r', "<cmd>lua require('fzf-lua').lsp_references()<CR>")
vim.keymap.set('n', '<leader>d', "<cmd>lua require('fzf-lua').lsp_definitions()<CR>")
vim.keymap.set('n', '<leader>D', "<cmd>lua require('fzf-lua').lsp_declarations()<CR>")
vim.keymap.set('n', '<leader>i', "<cmd>lua require('fzf-lua').lsp_implementations()<CR>")
vim.keymap.set('n', '<leader>s', "<cmd>lua require('fzf-lua').lsp_document_symbols()<CR>")
vim.keymap.set('n', '<leader>t', "<cmd>lua require('fzf-lua').lsp_typedefs()<CR>")
vim.keymap.set('n', '<leader>l', "<cmd>lua require('fzf-lua').diagnostics_document()<CR>")

操作方法

:help fzf-lua-default-options で操作方法を確認できます。require'fzf-lua'.setup({})で自分で設定することもできます。

  • F1:ヘルプ表示
  • F2:全体表示切り替え
  • F3:プレビューウィンドウを折返し切り替え
  • F4:プレビューウィンドウを有効/無効化
  • F5:プレビューウィンドウを反時計回りに移動
  • F6:プレビューウィンドウを時計回りに移動
  • Shift-up/down:プレビューウィンドウをスクロール
  • Shift-left:プレビューウィンドウの位置をリセット
  • Ctrl-S:水平分割して開く
  • Ctrl-V:垂直分割して開く
  • Ctrl-T:タブで開く
  • Ctrl-Z / Ctrl-C / Esc:fzf-luaを閉じる

up/down , Ctrl-K/Jで上下選択、Enterで決定はfzfコマンドのキーマップに従っているので設定ファイル内で変更することはできません。

コマンド一覧

:FzfLua xxxとして実行します。めちゃくちゃたくさんの機能があり全て紹介することはできないので使用頻度の高いものを紹介します。:FzfLua builtinとすれば使えるコマンドを全てリストアップできますので、どんな機能があるのか一通り確認するのに便利です。:help fzf-lua公式のコマンド一覧と合わせて探してみてください。

1. ファイル・バッファ

  • files
    ファイルの内容をプレビューしながらファイル名で検索します。一番よく使うスタンダードなコマンドです。

  • old_files
    履歴からファイル名で検索します。

  • buffers
    開いているバッファからファイル名で検索します。

  • blines
    現在アクティブなバッファの内容を検索します。Vim標準の検索機能のように使うことができます。個人的にはHelpページで重宝しています。

2. 検索

  • grep
    ファイルの中身を検索します。<Ctrl-G> でRegex Search(正規表現検索)とFuzzy Search(あいまい検索)を切り替えることができます。

  • grep_cword/cWORD
    カーソルの下にある文字列で検索します。

  • grep_visual
    ビジュアルモードで選択している文字列に対して検索します。

3. Git

ファイルやコミットログ、ブランチなどを検索します。中でも編集中のファイルの変更箇所をプレビューしながらstage/unstageできるのはとても便利なのでオススメです。

  • git_files
    filesと似ていますが、こちらは.gitignoreに指定されているものを除いて検索します。

  • git_status
    最新のコミットに対して編集・追加されたものだけを表示します。

  • git_commits
    コミット履歴を一覧表示します。<username>で検索すれば特定の人のコミットをリストアップすることもできます。

  • git_branches
    ブランチを一覧表示します。プレビューウィンドウにはコミットだけでなくマージの履歴も表示されます。

4. LSP

LSPと連携したコマンドも多数用意されています。サーバーのインストールや設定などは別途行う必要があります。機能によっては標準のLSPにも同じものがありますが、こちらの方がプレビューウィンドウで中身を確認できるので便利です。

  • lsp_references
    カーソル下の変数・関数をワークスペース内で参照している箇所を検索します。

  • lsp_definitions / lsp_declarations / lsp_implementations / lsp_typedefs
    カーソル下の変数・関数の定義や実装元を表示します。

  • lsp_document_symbols / lsp_workspace_symbols
    ファイル・ワークスペース内の変数・関数をリストアップします。プログラムのアウトラインを確認するような感覚で使えて便利です。

  • diagnostics_document / diagnostics_workspace
    ファイル・ワークスペース内のエラーや警告表示をリストアップします。

5. その他

  • help_tags
  • command_history
  • colorschemes
  • keymaps

他にもいろいろあります。ヘルプタグやコマンド履歴を検索する機能は地味ながら便利ですし、カラースキーマをプレビューする機能は面白くて好きです。

DAP(Debug Adapter Protocol)というものがMicrosoftから提唱されており、それと連携することもできるようです。私は今の所利用していないので有用性はわかりませんが、LSP(Language Server Protocol)と同じように今後広く使われるようになるかもしれませんね。

参考

https://github.com/ibhagwan/fzf-lua/wiki/Advanced

公式サイトのWikiが充実しています。役に立つカスタマイズがたくさんあり、自作の関数の作り方なんかも丁寧に書かれていますので、是非こちらも見てください。

Discussion