## 事象
[[trouble.nvim]]の`keys`では`s`のようにデフォルトで割り当てされている機能がある。
```lua
config = function()
require("trouble").setup({
keys = {
s = { -- example of a custom action that toggles the severity
action = function(view)
local f = view:get_filter("severity")
local severity = ((f and f.filter.severity or 0) + 1) % 5
view:filter({ severity = severity }, {
id = "severity",
template = "{hl:Title}Filter:{hl} {severity}",
del = severity == 0,
})
end,
desc = "Toggle Severity Filter",
},
}
```
この設定を無効化したい。ただし、**何も反応しないのではなく、[[trouble.nvim]]の[[バッファ (Vim)|バッファ]]以外で動作するのと同じように**したい。しかし、以下のような設定を行っても期待通り動かなかった。
```lua
s = nil
s = false
s = true
s = {}
s = { action = nil }
s = { action = false }
```
## 原因
`keys`に一度設定されてしまうと、[[Neovim]]の通常キーバインドへfallbackすることはできなそうな実装になっているため。
### 詳細
[[trouble.nvim]]の`init.lua`を確認すると以下のように設定が追加されている。
```lua
for k, v in pairs(self.opts.keys) do
self:map(k, v)
end
```
これはデフォルト設定として起動時に読み込まれるため回避は不可能。その後に`self.win:map`でキーとアクションがマッピングされる。
```lua
function M:map(key, action)
action = Spec.action(action)
local _self = Util.weak(self)
self.win:map(key, function()
local this = _self()
if this then
this:action(action)
end
end, { desc = action.desc, mode = action.mode })
end
```
`win:map`の実装。
```lua
---@param key string
---@param fn fun(self: trouble.Window):any
---@param opts? string|vim.keymap.set.Opts|{mode?:string}
function M:map(key, fn, opts)
opts = vim.tbl_deep_extend("force", {
buffer = self.buf,
nowait = true,
mode = "n",
}, type(opts) == "string" and { desc = opts } or opts or {})
local mode = opts.mode
opts.mode = nil
---@cast opts vim.keymap.set.Opts
if not self:valid() then
error("Cannot create a keymap for an invalid window")
end
self.keys[key] = opts.desc or key
local weak_self = Util.weak(self)
vim.keymap.set(mode, key, function()
if weak_self() then
return fn(weak_self())
end
end, opts)
end
```
最終的には`vim.keymap.set`で設定しているため、[[trouble.nvim]]の[[ウィンドウ (Vim)|ウィンドウ]]で一度設定(上書き)されてしまったものを戻す手段はなさそうに見える。また、この処理が完了するまでに`key`を消し去る方法もなさそう。
## 解決方法
今のところなさそう
## 回避策
fallbackは諦め、[[trouble.nvim]]以外へのキーバインド設定と全く同じ設定を書く。今回のケースだと
```lua
require("trouble").setup({
keys = {
-- XXX: sはバインドしたくないが、fallbackの方法が分からず...
s = function()
require("flash").jump()
end,
```