ddu.vim で複数のソースを仕切り付きで分ける
はじめに
ddu.vim で複数のソースを混ぜて使うときに、仕切りを出す方法について紹介します。
また設定は Lua で書きます。Vim script の行継続嫌いなので。。。
手法
これは組み込みの機能ではありません。
ダミーの候補を混ぜているだけです。
ダミー A
ソース 1 の候補
ソース 1 の候補
ダミー B
ソース 2 の候補
ソース 2 の候補
...
こういう構造です。
仕切りの filter を全て無効にすることで、常に表示されますし混ざることもありません。
仕切りにはこれを使います。
使い方は params で表示する word とハイライトグループを指定するだけです。
- (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 の実体はここにあります。
おわりに
source や filter を自由に組み替えられる、ddu の良さが光る設定ではないでしょうか。
視覚的なわかりやすさは、使い勝手に影響する重要な要素です。おしゃれなだけではありません。
どんどんカスタマイズしましょう!
謝辞
このアイデアは vim-jp slack で @kamecha さんからお借りしました。
Discussion