Skip to content

Commit 29724e5

Browse files
committed
feat: allow disable/enable shortcuts on the fly
1 parent 018c7bd commit 29724e5

File tree

6 files changed

+174
-102
lines changed

6 files changed

+174
-102
lines changed

.github/workflows/default.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,21 @@ jobs:
2828
2929
- name: Run test
3030
run: make
31+
env:
32+
BUFFON_LOGS: debug
33+
34+
- name: Check logs
35+
if: always()
36+
run: |
37+
ls /tmp
38+
mv /tmp/buffon-$(date +'%Y-%m-%d').log /tmp/buffon_.log
39+
40+
- name: Upload buffon log
41+
if: always()
42+
uses: actions/upload-artifact@v4
43+
with:
44+
name: buffon-log-${{ matrix.neovim_version }}
45+
path: /tmp/buffon.log
3146

3247
lint:
3348
name: lint

README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,26 @@ To do this, you only have to assign the string "false" or leave it blank in the
208208
}
209209
```
210210

211+
It is also possible to disable/enable keybindings on the fly.
212+
213+
Here is an example of how to disable the keybinding for closing buffers:
214+
215+
```lua
216+
require("buffon").update_shortcuts({ close_buffer = "false" })
217+
```
218+
219+
To enable it again, simply assign the keybinding you want:
220+
221+
```lua
222+
require("buffon").update_shortcuts({ close_buffer = "<buffonleader>d" })
223+
```
224+
225+
And if you want to restore all default values, you can do so with:
226+
227+
```lua
228+
require("buffon").update_shortcuts({})
229+
```
230+
211231
### Theming
212232

213233
The interface colors can be customized to your liking. There are four elements that can be personalized:

lua/buffon/init.lua

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,13 @@ function M.add(callback)
5454
end
5555
end
5656

57+
---@param partial_shortcuts table<string, string>
58+
function M.update_shortcuts(partial_shortcuts)
59+
if Buffon.ctrl == nil then
60+
log.error("Buffon controller is not initialized yet.")
61+
return
62+
end
63+
Buffon.ctrl:update_shortcuts(partial_shortcuts)
64+
end
65+
5766
return M

lua/buffon/maincontroller.lua

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ local mainwindow = require("buffon.ui.mainwindow")
55
local helpwindow = require("buffon.ui.help")
66
local buffer = require("buffon.buffer")
77
local utils = require("buffon.utils")
8+
local config = require("buffon.config")
89

910
local M = {}
1011

@@ -195,7 +196,7 @@ function MainController:get_shortcuts()
195196
for _, action in ipairs(shortcuts) do
196197
local action_can_be_disabled = configurable_disabled_actions[action.shortcut]
197198
local action_is_disabled = (self.config.keybindings[action.shortcut] == "false")
198-
or (self.config.keybindings[action.shortcut] == "")
199+
or (self.config.keybindings[action.shortcut] == "")
199200
local is_pagination_action = pagination_actions[action.shortcut]
200201
local one_page = self.config.num_pages == 1
201202

@@ -274,14 +275,26 @@ function MainController:get_events()
274275
}
275276
end
276277

277-
function MainController:register_shortcuts()
278+
function MainController:register_user_shortcuts()
278279
for _, action in ipairs(self:get_shortcuts()) do
279280
local shortcut = utils.replace_leader(self.config, self.config.keybindings[action.shortcut])
280281
log.debug("registering shortcut", shortcut, "for", action.shortcut)
281282
set_keymap(shortcut, function()
282283
self:dispatch(action)
283284
end, action.help)
284285
end
286+
end
287+
288+
function MainController:unregister_user_shortcuts()
289+
for _, action in ipairs(self:get_shortcuts()) do
290+
local shortcut = utils.replace_leader(self.config, self.config.keybindings[action.shortcut])
291+
log.debug("unregistering shortcut", shortcut)
292+
vim.keymap.del("n", shortcut)
293+
end
294+
end
295+
296+
function MainController:register_shortcuts()
297+
self:register_user_shortcuts()
285298

286299
for idx = 1, #self.config.mapping_chars do
287300
local char = self.config.mapping_chars:sub(idx, idx)
@@ -316,7 +329,7 @@ function MainController:dispatch(action, event_data)
316329
return
317330
end
318331

319-
pcall(function ()
332+
pcall(function()
320333
event_data.file = event_data.file:gsub("\\", "/") -- important for windows
321334
end)
322335

@@ -465,7 +478,7 @@ end
465478

466479
function MainController:action_goto_previous()
467480
local previous_buffer =
468-
self.page_controller:get_active_page().bufferslist:get_previous_buffer(utils.get_buffer_name())
481+
self.page_controller:get_active_page().bufferslist:get_previous_buffer(utils.get_buffer_name())
469482
if previous_buffer then
470483
self:action_open_or_activate_buffer(previous_buffer)
471484
end
@@ -652,6 +665,19 @@ function MainController:event_win_closed(win)
652665
end
653666
end
654667

668+
---@param partial_shortcuts table<string, string>
669+
function MainController:update_shortcuts(partial_shortcuts)
670+
self:unregister_user_shortcuts()
671+
672+
local original_cfg = config.Config:new({})
673+
local merged_keybindings = vim.tbl_deep_extend("force", original_cfg.keybindings, partial_shortcuts)
674+
675+
local cfg = vim.tbl_deep_extend("force", self.config, { keybindings = merged_keybindings })
676+
self.config = cfg
677+
678+
self:register_user_shortcuts()
679+
end
680+
655681
M.MainController = MainController
656682

657683
return M

lua/buffon/storage.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ end
7878
function Storage:init()
7979
local ok, msg = pcall(initialize_data_path, self.data_path)
8080
if not ok then
81+
log.debug("data path", self.data_path)
8182
log.debug("storage couldn't be initialized", msg)
8283
end
8384
return ok

tests/maincontroller_spec.lua

Lines changed: 99 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -3,115 +3,116 @@ local config = require("buffon.config")
33
local pagecontroller = require("buffon.pagecontroller")
44
local maincontroller = require("buffon.maincontroller")
55
local storage = require("buffon.storage")
6+
local buffon = require("buffon")
67

78
---@param shortcuts table<BuffonAction>
89
---@param to_compare table<string>
910
local compare_shortcuts = function(shortcuts, to_compare)
10-
eq(#shortcuts, #to_compare)
11-
for i, action in ipairs(shortcuts) do
12-
eq(action.shortcut, to_compare[i])
13-
end
11+
eq(#shortcuts, #to_compare)
12+
for i, action in ipairs(shortcuts) do
13+
eq(action.shortcut, to_compare[i])
14+
end
1415
end
1516

1617
local default_shortcuts = {
17-
"toggle_buffon_window",
18-
"toggle_buffon_window_position",
19-
"goto_next_buffer",
20-
"goto_previous_buffer",
21-
"next_page",
22-
"previous_page",
23-
"move_to_next_page",
24-
"move_to_previous_page",
25-
"move_buffer_up",
26-
"move_buffer_down",
27-
"move_buffer_top",
28-
"move_buffer_bottom",
29-
"close_buffer",
30-
"close_buffers_above",
31-
"close_buffers_below",
32-
"close_all_buffers",
33-
"close_others",
34-
"switch_previous_used_buffer",
35-
"reopen_recent_closed_buffer",
18+
"toggle_buffon_window",
19+
"toggle_buffon_window_position",
20+
"goto_next_buffer",
21+
"goto_previous_buffer",
22+
"next_page",
23+
"previous_page",
24+
"move_to_next_page",
25+
"move_to_previous_page",
26+
"move_buffer_up",
27+
"move_buffer_down",
28+
"move_buffer_top",
29+
"move_buffer_bottom",
30+
"close_buffer",
31+
"close_buffers_above",
32+
"close_buffers_below",
33+
"close_all_buffers",
34+
"close_others",
35+
"switch_previous_used_buffer",
36+
"reopen_recent_closed_buffer",
3637
}
3738

3839
describe("maincontrolelr", function()
39-
it("default get_shortcuts", function()
40-
local cfg = config.Config:new({})
41-
local stg = storage.Storage:new("/foo/boo")
42-
local pagectrl = pagecontroller.PageController:new(cfg)
43-
local ctrl = maincontroller.MainController:new(cfg, pagectrl, stg)
44-
local shortcuts = ctrl:get_shortcuts()
45-
compare_shortcuts(shortcuts, default_shortcuts)
46-
end)
40+
it("default get_shortcuts", function()
41+
local cfg = config.Config:new({})
42+
local stg = storage.Storage:new("/foo/boo")
43+
local pagectrl = pagecontroller.PageController:new(cfg)
44+
local ctrl = maincontroller.MainController:new(cfg, pagectrl, stg)
45+
local shortcuts = ctrl:get_shortcuts()
46+
compare_shortcuts(shortcuts, default_shortcuts)
47+
end)
4748

48-
it("disabling some actions", function()
49-
local cfg = config.Config:new({
50-
keybindings = {
51-
close_buffer = "false",
52-
close_buffers_above = "false",
53-
close_buffers_below = "",
54-
close_all_buffers = "false",
55-
close_others = "false",
56-
},
57-
})
58-
local stg = storage.Storage:new("/foo/boo")
59-
local pagectrl = pagecontroller.PageController:new(cfg)
60-
local ctrl = maincontroller.MainController:new(cfg, pagectrl, stg)
61-
local shortcuts = ctrl:get_shortcuts()
62-
compare_shortcuts(shortcuts, {
63-
"toggle_buffon_window",
64-
"toggle_buffon_window_position",
65-
"goto_next_buffer",
66-
"goto_previous_buffer",
67-
"next_page",
68-
"previous_page",
69-
"move_to_next_page",
70-
"move_to_previous_page",
71-
"move_buffer_up",
72-
"move_buffer_down",
73-
"move_buffer_top",
74-
"move_buffer_bottom",
75-
"switch_previous_used_buffer",
76-
"reopen_recent_closed_buffer",
77-
})
78-
end)
49+
it("disabling some actions", function()
50+
local cfg = config.Config:new({
51+
keybindings = {
52+
close_buffer = "false",
53+
close_buffers_above = "false",
54+
close_buffers_below = "",
55+
close_all_buffers = "false",
56+
close_others = "false",
57+
},
58+
})
59+
local stg = storage.Storage:new("/foo/boo")
60+
local pagectrl = pagecontroller.PageController:new(cfg)
61+
local ctrl = maincontroller.MainController:new(cfg, pagectrl, stg)
62+
local shortcuts = ctrl:get_shortcuts()
63+
compare_shortcuts(shortcuts, {
64+
"toggle_buffon_window",
65+
"toggle_buffon_window_position",
66+
"goto_next_buffer",
67+
"goto_previous_buffer",
68+
"next_page",
69+
"previous_page",
70+
"move_to_next_page",
71+
"move_to_previous_page",
72+
"move_buffer_up",
73+
"move_buffer_down",
74+
"move_buffer_top",
75+
"move_buffer_bottom",
76+
"switch_previous_used_buffer",
77+
"reopen_recent_closed_buffer",
78+
})
79+
end)
7980

80-
it("try disable unauthorized keybinding", function()
81-
local cfg = config.Config:new({
82-
keybindings = {
83-
toggle_buffon_window = "false",
84-
},
85-
})
86-
local stg = storage.Storage:new("/foo/boo")
87-
local pagectrl = pagecontroller.PageController:new(cfg)
88-
local ctrl = maincontroller.MainController:new(cfg, pagectrl, stg)
89-
local shortcuts = ctrl:get_shortcuts()
90-
compare_shortcuts(shortcuts, default_shortcuts)
91-
end)
81+
it("try disable unauthorized keybinding", function()
82+
local cfg = config.Config:new({
83+
keybindings = {
84+
toggle_buffon_window = "false",
85+
},
86+
})
87+
local stg = storage.Storage:new("/foo/boo")
88+
local pagectrl = pagecontroller.PageController:new(cfg)
89+
local ctrl = maincontroller.MainController:new(cfg, pagectrl, stg)
90+
local shortcuts = ctrl:get_shortcuts()
91+
compare_shortcuts(shortcuts, default_shortcuts)
92+
end)
9293

93-
it("if num_pages is 1, keybindings related with pagination are disabled", function()
94-
local cfg = config.Config:new({ num_pages = 1 })
95-
local stg = storage.Storage:new("/foo/boo")
96-
local pagectrl = pagecontroller.PageController:new(cfg)
97-
local ctrl = maincontroller.MainController:new(cfg, pagectrl, stg)
98-
local shortcuts = ctrl:get_shortcuts()
99-
compare_shortcuts(shortcuts, {
100-
"toggle_buffon_window",
101-
"toggle_buffon_window_position",
102-
"goto_next_buffer",
103-
"goto_previous_buffer",
104-
"move_buffer_up",
105-
"move_buffer_down",
106-
"move_buffer_top",
107-
"move_buffer_bottom",
108-
"close_buffer",
109-
"close_buffers_above",
110-
"close_buffers_below",
111-
"close_all_buffers",
112-
"close_others",
113-
"switch_previous_used_buffer",
114-
"reopen_recent_closed_buffer",
115-
})
116-
end)
94+
it("if num_pages is 1, keybindings related with pagination are disabled", function()
95+
local cfg = config.Config:new({ num_pages = 1 })
96+
local stg = storage.Storage:new("/foo/boo")
97+
local pagectrl = pagecontroller.PageController:new(cfg)
98+
local ctrl = maincontroller.MainController:new(cfg, pagectrl, stg)
99+
local shortcuts = ctrl:get_shortcuts()
100+
compare_shortcuts(shortcuts, {
101+
"toggle_buffon_window",
102+
"toggle_buffon_window_position",
103+
"goto_next_buffer",
104+
"goto_previous_buffer",
105+
"move_buffer_up",
106+
"move_buffer_down",
107+
"move_buffer_top",
108+
"move_buffer_bottom",
109+
"close_buffer",
110+
"close_buffers_above",
111+
"close_buffers_below",
112+
"close_all_buffers",
113+
"close_others",
114+
"switch_previous_used_buffer",
115+
"reopen_recent_closed_buffer",
116+
})
117+
end)
117118
end)

0 commit comments

Comments
 (0)