Skip to main content

ddu.vim をコマンド履歴のファジーファインダーとして使う設定

s-show
s-show

about 2 months前に投稿

0
License: MIT

LUA
vim.fn["ddu#custom#patch_global"]({
  ui = 'ff',
  uiParams = {
    ff = {
      filterFloatingPosition = "top",
      floatingBorder = "rounded",
      floatingTitle = 'list',
      split = "floating",
      winHeight = '&lines * 6 / 10',
      winWidth = '&columns * 4 / 10',
      winRow = '&lines * 2 / 10',
      winCol = '&columns * 1 / 10',
      prompt = "> ",
    }
  },
  sourceOptions = {
    _ = {
      matchers = { 'matcher_substring' },
      ignoreCase = true,
    },
  },
  kindOptions = {
    _ = {
      defaultAction = "open"
    },
    action = {
      defaultAction = "do",
    },
  },
  actionOptions = {
    quit = false
  }
})

vim.fn["ddu#custom#patch_local"]("command_history", {
  uiParams = {
    ff = {
      previewFloating = false,
      winHeight = '&lines / 2',
      winWidth = '&columns / 3',
      winRow = '&lines / 4',
      winCol = '&columns / 6 * 2',
      displaySourceName = "no",
    }
  },
  sources = {
    {
      name = { "command_history" },
    },
  },
  sourceOptions = {
    command_history = {
      defaultAction = "execute",
    }
  },
  unique = true,
})


local ddu_vim_autocmd_group = vim.api.nvim_create_augroup('ddu_vim', {})
vim.api.nvim_create_autocmd("FileType",
  {
    pattern = "ddu-ff",
    callback = function()
      vim.keymap.set("n", "q", [[<Cmd>call ddu#ui#do_action("quit")<CR>]], { buffer = true })
      vim.keymap.set("n", "<CR>", [[<Cmd>call ddu#ui#do_action("itemAction")<CR>]], { buffer = true })
      vim.keymap.set("n", "a", [[<Cmd>call ddu#ui#do_action('chooseAction')<CR>]], { buffer = true })
      vim.keymap.set("n", "i", [[<Cmd>call ddu#ui#do_action("openFilterWindow")<CR>]], { buffer = true })
      if vim.fn["ddu#custom#get_current"]().name == "command_history" then
        vim.keymap.set("n", "e", [[<Cmd>call ddu#ui#do_action("itemAction", {'name': 'edit'})<CR>]], { buffer = true })
        vim.keymap.set("n", "dd", [[<Cmd>call ddu#ui#do_action("itemAction", {'name': 'delete'})<CR>]], { buffer = true })
      end
    end,
  }
)

vim.api.nvim_create_autocmd("User",
  {
    pattern = 'Ddu:ui:ff:openFilterWindow',
    callback = function()
      vim.keymap.set({ 'n', 'i', 'c' }, '<CR>', [[<Cmd>close<CR>]], { expr = true, buffer = true })
      vim.fn['ddc#enable_cmdline_completion']()
    end,
  }
)

vim.api.nvim_create_autocmd({ 'User' },
  {
    pattern = 'Ddu:ui:ff:closeFilterWindow',
    callback = function()
      vim.keymap.del('n', '<CR>', { buffer = true })
      vim.keymap.del('i', '<CR>', { buffer = true })
      vim.keymap.del('c', '<CR>', { buffer = true })
      -- アイテムリスト用のキーバインドを復活させる
      vim.keymap.set("n", "<CR>", [[<Cmd>call ddu#ui#do_action("itemAction")<CR>]], { buffer = true })
      local autocmd_id = Get_autocmd_id({ group = ddu_vim_autocmd_group, pattern = 'Ddu:uiDone' })
      if autocmd_id ~= 0 then
        vim.api.nvim_del_autocmd(autocmd_id)
      end
    end
  }
)

vim.keymap.set('n', '<leader>dc', function()
  vim.fn['ddu#start']({ name = 'command_history' })
end)

function Ddu_start_with_filter_window(source_name)
  vim.fn['ddu#start']({ name = source_name })
  return vim.api.nvim_create_autocmd("User",
    {
      pattern = 'Ddu:uiDone',
      group = ddu_vim_autocmd_group,
      nested = true,
      callback = function()
        local lineCount = vim.fn.line('$')
        if lineCount >= 10 then
          vim.fn['ddu#ui#async_action']('openFilterWindow')
        end
      end,
    }
  )
end

Deno を使って開発されたファジーファインダープラグインの Shougo/ddu.vim を使ってコマンド履歴を曖昧検索する設定例です。

ddu.vim は ユーザーインターフェース、UI に表示するアイテムを取得する機能、UI に表示しているアイテムに対するアクション、UI に表示しているアイテムを検索する機能を個別にインストールする必要がありますので、以下のプラグインを組み合わせてコマンド履歴の曖昧検索を実現しています。

  • Shougo/ddu.vim
    • Deno を使った Vim/Neovim 対応のファジーファインダープラグイン。
  • vim-denops/denops.vim
    • Deno を使って Vim/Neovim のプラグインを作るためのエコシステムを提供するプラグイン。ddu.vim を動かすには必須。
  • Shougo/ddu-ui-ff
    • ddu.vim の UI を提供するプラグイン
  • matsui54/ddu-source-command_history
    • コマンド履歴を取得して ddu.vim に渡すプラグイン
  • Shougo/ddu-source-action
    • ddu.vim の UI に表示されているアイテムに対するアクションを提供するプラグイン
  • Shougo/ddu-filter-matcher_substring
    • ddu.vim の検索のフィルタリングで使うプラグイン

この設定のキーバインドは次のとおりです。

  • ノーマルモード
    • <leader>dc: ddu.vim の UI を開きます。
  • ddu.vim の UI で有効なキーバインド
    • q: UI を閉じます
    • ``: 選択したアイテム(コマンド履歴)を実行します
    • a: 選択したアイテムに対して実施できるアクションを表示します
    • i: 絞り込みを開始します。絞り込みのための入力はコマンドラインで行います。
    • e: 選択しているアイテムをコマンドラインに送り込みます。送り込むだけで実行はまだ行いませんので、コマンド履歴の一部を変更して実行するときに使えます。
    • dd: 選択しているアイテムを削除します。残す必要がないコマンド履歴の削除に使えます。
  • ddu.vim の絞り込み入力で使えるキーバインド
    • ``: 絞り込み入力を完了して ddu.vim の UI に戻ります。

コメントを投稿するにはログインが必要です