🔍

ddu.vim で複数のソースを仕切り付きで分ける

2023/06/21に公開

はじめに

ddu.vim で複数のソースを混ぜて使うときに、仕切りを出す方法について紹介します。

また設定は Lua で書きます。Vim script の行継続嫌いなので。。。

手法

これは組み込みの機能ではありません。
ダミーの候補を混ぜているだけです。

ダミー A
ソース 1 の候補
ソース 1 の候補
ダミー B
ソース 2 の候補
ソース 2 の候補
...

こういう構造です。
仕切りの filter を全て無効にすることで、常に表示されますし混ざることもありません。

仕切りにはこれを使います。
使い方は params で表示する word とハイライトグループを指定するだけです。

https://github.com/Shougo/ddu-source-dummy

  • (2023/06/22: uga-rosa/ddu-source-dummy と統合しました)

ダミーを飛ばしてカーソルを動かす

このダミーですが、あくまで仕切りなのでカーソル移動のときは無視してほしいですよね。
つまり、(1) で j を押したら (2) まで移動するようにします。

ダミー A
ソース 1 の候補
ソース 1 の候補 ... (1)
ダミー B
ソース 2 の候補 ... (2)
ソース 2 の候補

move_ignore_dummy(1)j に、move_ignore_dummy(-1)k にマッピングします。
item.__sourceName を参照しているので、ダミーの文字列にマーカーを付けなくとも安全に判定できます。

---@param items table[] DduItem[]
---@param index number
---@return boolean
local function is_dummy(items, index)
  return items[index] and items[index].__sourceName == "dummy"
end

---@param dir number
---@return function
local function move_ignore_dummy(dir)
  return function()
    local items = vim.fn["ddu#ui#get_items"]()
    local index = vim.fn.line(".") + dir

    while is_dummy(items, index) do
      index = index + dir
    end
    if 1 <= index and index <= #items then
      vim.cmd("normal! " .. index .. "gg")
    end
  end
end

つい昨日入れてもらったばかりの ddu#ui#get_items() を使っているので、真似する方はプラグインを更新してください。

逆のことをすれば、アウトライン移動のように使えるかもしれませんね。

使用例

lspsaga.nvim の lsp_finder のように、定義と参照をまとめて出してみましょう。
{ includeDeclaration = false } を入れておくと lsp_references から定義位置が除外されるので、ダブりがなくなり見やすいです。

---@param word string
---@param color string
---@return Source
local function separator(word, color)
local hlGroup = "DduDummy" .. color:gsub("[^a-zA-Z0-9]", "")
vim.api.nvim_set_hl(0, hlGroup, { fg = color })
return {
  "dummy",
  params = { word = word, hlGroup = hlGroup },
}
end

helper.register("lsp_finder", function()
helper.start("lsp:dummy", {
  separator(">>Definition<<", "#fc514e"),
  "lsp_definition",
  separator(">>References<<", "#5e97ec"),
  { "lsp_references", params = { includeDeclaration = false } },
})
end)

こんな感じになります。

helper の実体はここにあります。
https://github.com/uga-rosa/dotfiles/blob/main/nvim/lua/rc/helper/ddu.lua

おわりに

source や filter を自由に組み替えられる、ddu の良さが光る設定ではないでしょうか。
視覚的なわかりやすさは、使い勝手に影響する重要な要素です。おしゃれなだけではありません。
どんどんカスタマイズしましょう!

謝辞

このアイデアは vim-jp slack で @kamecha さんからお借りしました。

GitHubで編集を提案

Discussion