## 事象 [[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, ```