Skip to content

Commit 705b7fd

Browse files
Refactor mappings (#344)
1 parent 86cd103 commit 705b7fd

File tree

11 files changed

+242
-272
lines changed

11 files changed

+242
-272
lines changed

ftplugin/org.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ endif
44
let b:did_ftplugin = 1
55

66
lua require('orgmode.config'):setup_mappings('org')
7-
lua require('orgmode.config'):setup_text_object_mappings()
7+
lua require('orgmode.config'):setup_mappings('text_objects')
88

99
function! OrgmodeFoldExpr()
1010
return luaeval('require("orgmode.org.indent").foldexpr()')

lua/orgmode/config/defaults.lua

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,7 @@ return {
6565
org_agenda_year_view = 'vy',
6666
org_agenda_quit = 'q',
6767
org_agenda_switch_to = '<CR>',
68-
org_agenda_goto = {
69-
n = '<TAB>',
70-
},
68+
org_agenda_goto = '<TAB>',
7169
org_agenda_goto_date = 'J',
7270
org_agenda_redo = 'r',
7371
org_agenda_todo = 't',
@@ -119,23 +117,15 @@ return {
119117
org_promote_subtree = '<s',
120118
org_demote_subtree = '>s',
121119
org_meta_return = '<Leader><CR>', -- Add headling, item or row
122-
org_return = {
123-
i = '<CR>',
124-
},
120+
org_return = '<CR>',
125121
org_insert_heading_respect_content = '<Leader>oih', -- Add new headling after current heading block with same level
126122
org_insert_todo_heading = '<Leader>oiT', -- Add new todo headling right after current heading with same level
127123
org_insert_todo_heading_respect_content = '<Leader>oit', -- Add new todo headling after current heading block on same level
128124
org_move_subtree_up = '<Leader>oK',
129125
org_move_subtree_down = '<Leader>oJ',
130126
org_export = '<Leader>oe',
131-
org_next_visible_heading = {
132-
n = '}',
133-
x = '}',
134-
},
135-
org_previous_visible_heading = {
136-
n = '{',
137-
x = '{',
138-
},
127+
org_next_visible_heading = '}',
128+
org_previous_visible_heading = '{',
139129
org_forward_heading_same_level = ']]',
140130
org_backward_heading_same_level = '[[',
141131
outline_up_heading = 'g{',

lua/orgmode/config/init.lua

Lines changed: 10 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
local instance = {}
22
local utils = require('orgmode.utils')
33
local defaults = require('orgmode.config.defaults')
4+
---@type table<string, MapEntry>
45
local mappings = require('orgmode.config.mappings')
56

67
---@class Config
@@ -174,109 +175,24 @@ function Config:get_todo_keywords()
174175
return types
175176
end
176177

177-
function Config:setup_mappings(category)
178+
function Config:setup_mappings(category, bufnr)
178179
if not self.old_cr_mapping then
179180
self.old_cr_mapping = vim.fn.maparg('<CR>', 'i', false, true)
180181
end
181182
if self.opts.mappings.disable_all then
182183
return
183184
end
184-
if not category then
185-
local agenda_keys = self.opts.mappings.global.org_agenda
186-
if type(agenda_keys) == 'string' then
187-
agenda_keys = { agenda_keys }
188-
end
189-
190-
for _, k in ipairs(agenda_keys) do
191-
utils.keymap('n', k, '<cmd>lua require("orgmode").action("agenda.prompt")<CR>')
192-
end
193185

194-
local capture_keys = self.opts.mappings.global.org_capture
195-
if type(capture_keys) == 'string' then
196-
capture_keys = { capture_keys }
197-
end
198-
199-
for _, k in ipairs(capture_keys) do
200-
utils.keymap('n', k, '<cmd>lua require("orgmode").action("capture.prompt")<CR>')
201-
end
202-
203-
return
204-
end
205-
if not self.opts.mappings[category] then
206-
return
186+
local map_entries = mappings[category]
187+
local default_mappings = defaults.mappings[category] or {}
188+
local user_mappings = vim.tbl_get(self.opts.mappings, category) or {}
189+
local opts = {}
190+
if bufnr then
191+
opts.buffer = bufnr
207192
end
208193

209-
for name, lhs in pairs(self.opts.mappings[category]) do
210-
if mappings[category] and mappings[category][name] and lhs then
211-
-- lhs
212-
local keys = {}
213-
if type(lhs) == 'string' or vim.tbl_islist(lhs) then
214-
-- no mode specified, default to normal-mode
215-
keys['n'] = lhs
216-
else
217-
keys = lhs
218-
end
219-
-- rhs
220-
local map = {}
221-
if not type(mappings[category][name]) == 'table' or vim.tbl_islist(mappings[category][name]) then
222-
-- no mode specified, default to normal-mode
223-
map['n'] = {}
224-
map['n']['action'] = vim.tbl_map(function(i)
225-
return string.format('"%s"', i)
226-
end, mappings[category][name])
227-
map['n']['opts'] = {}
228-
else
229-
-- multi-mode mapping
230-
for mode, mapping in pairs(mappings[category][name]) do
231-
map[mode] = {}
232-
if type(mapping) == 'table' and not vim.tbl_islist(mapping) then
233-
local action = {}
234-
table.insert(action, mapping['callback'])
235-
vim.list_extend(action, mapping['args'])
236-
map[mode]['action'] = vim.tbl_map(function(i)
237-
return string.format('"%s"', i)
238-
end, action)
239-
map[mode]['opts'] = mapping['opts']
240-
else
241-
map[mode]['action'] = vim.tbl_map(function(i)
242-
return string.format('"%s"', i)
243-
end, mapping)
244-
map[mode]['opts'] = {}
245-
end
246-
end
247-
end
248-
-- register mappings
249-
for mode, key in pairs(keys) do
250-
if type(key) == 'string' then
251-
key = { key }
252-
end
253-
for _, k in pairs(key) do
254-
local mapping = map[mode] or false
255-
if mapping then
256-
local action = table.concat(mapping['action'], ',')
257-
utils.buf_keymap(
258-
0,
259-
mode,
260-
k,
261-
string.format('<cmd>lua require("orgmode").action(%s)<CR>', action),
262-
mapping['opts']
263-
)
264-
end
265-
end
266-
end
267-
end
268-
end
269-
end
270-
271-
function Config:setup_text_object_mappings()
272-
if self.opts.mappings.disable_all then
273-
return
274-
end
275-
for name, key in pairs(self.opts.mappings.text_objects) do
276-
if mappings.text_objects[name] then
277-
utils.buf_keymap(0, 'x', key, string.format(':<C-U>lua require("orgmode.org.text_objects").%s()<CR>', name))
278-
utils.buf_keymap(0, 'o', key, string.format(':normal v%s<CR>', key))
279-
end
194+
for name, map_entry in pairs(map_entries) do
195+
map_entry:attach(default_mappings[name], user_mappings[name], opts)
280196
end
281197
end
282198

lua/orgmode/config/mappings.lua

Lines changed: 0 additions & 105 deletions
This file was deleted.

lua/orgmode/config/mappings/init.lua

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
local m = require('orgmode.config.mappings.map_entry')
2+
3+
return {
4+
global = {
5+
org_agenda = m.action('agenda.prompt', { opts = { buffer = false } }),
6+
org_capture = m.action('capture.prompt', { opts = { buffer = false } }),
7+
},
8+
agenda = {
9+
org_agenda_later = m.action('agenda.advance_span', { args = { 1 } }),
10+
org_agenda_earlier = m.action('agenda.advance_span', { args = { -1 } }),
11+
org_agenda_goto_today = m.action('agenda.reset'),
12+
org_agenda_day_view = m.action('agenda.change_span', 'day'),
13+
org_agenda_week_view = m.action('agenda.change_span', 'week'),
14+
org_agenda_month_view = m.action('agenda.change_span', 'month'),
15+
org_agenda_year_view = m.action('agenda.change_span', 'year'),
16+
org_agenda_quit = m.action('agenda.quit'),
17+
org_agenda_switch_to = m.action('agenda.switch_to_item'),
18+
org_agenda_goto = m.action('agenda.goto_item'),
19+
org_agenda_goto_date = m.action('agenda.goto_date'),
20+
org_agenda_redo = m.action('agenda.redo'),
21+
org_agenda_todo = m.action('agenda.change_todo_state'),
22+
org_agenda_clock_in = m.action('agenda.clock_in'),
23+
org_agenda_clock_out = m.action('agenda.clock_out'),
24+
org_agenda_clock_cancel = m.action('agenda.clock_cancel'),
25+
org_agenda_set_effort = m.action('agenda.set_effort'),
26+
org_agenda_clock_goto = m.action('clock.org_clock_goto'),
27+
org_agenda_clockreport_mode = m.action('agenda.toggle_clock_report'),
28+
org_agenda_priority = m.action('agenda.set_priority'),
29+
org_agenda_priority_up = m.action('agenda.priority_up'),
30+
org_agenda_priority_down = m.action('agenda.priority_down'),
31+
org_agenda_toggle_archive_tag = m.action('agenda.toggle_archive_tag'),
32+
org_agenda_set_tags = m.action('agenda.set_tags'),
33+
org_agenda_deadline = m.action('agenda.set_deadline'),
34+
org_agenda_schedule = m.action('agenda.set_schedule'),
35+
org_agenda_filter = m.action('agenda.filter'),
36+
org_agenda_show_help = m.action('org_mappings.show_help'),
37+
},
38+
capture = {
39+
org_capture_finalize = m.action('capture.refile'),
40+
org_capture_refile = m.action('capture.refile_to_destination'),
41+
org_capture_kill = m.action('capture.kill'),
42+
org_capture_show_help = m.action('org_mappings.show_help'),
43+
},
44+
org = {
45+
org_refile = m.action('capture.refile_headline_to_destination'),
46+
org_timestamp_up_day = m.action('org_mappings.timestamp_up_day'),
47+
org_timestamp_down_day = m.action('org_mappings.timestamp_down_day'),
48+
org_timestamp_up = m.action('org_mappings.timestamp_up'),
49+
org_timestamp_down = m.action('org_mappings.timestamp_down'),
50+
org_change_date = m.action('org_mappings.change_date'),
51+
org_todo = m.action('org_mappings.todo_next_state'),
52+
org_priority = m.action('org_mappings.set_priority'),
53+
org_priority_up = m.action('org_mappings.priority_up'),
54+
org_priority_down = m.action('org_mappings.priority_down'),
55+
org_todo_prev = m.action('org_mappings.todo_prev_state'),
56+
org_toggle_checkbox = m.action('org_mappings.toggle_checkbox'),
57+
org_toggle_heading = m.action('org_mappings.toggle_heading'),
58+
org_open_at_point = m.action('org_mappings.open_at_point'),
59+
org_edit_special = m.action('org_mappings.edit_special'),
60+
org_cycle = m.action('org_mappings.cycle'),
61+
org_global_cycle = m.action('org_mappings.global_cycle'),
62+
org_archive_subtree = m.action('org_mappings.archive'),
63+
org_set_tags_command = m.action('org_mappings.set_tags'),
64+
org_toggle_archive_tag = m.action('org_mappings.toggle_archive_tag'),
65+
org_do_promote = m.action('org_mappings.do_promote'),
66+
org_do_demote = m.action('org_mappings.do_demote'),
67+
org_promote_subtree = m.action('org_mappings.do_promote', { args = { true } }),
68+
org_demote_subtree = m.action('org_mappings.do_demote', { args = { true } }),
69+
org_meta_return = m.action('org_mappings.handle_return'),
70+
org_insert_heading_respect_content = m.action('org_mappings.insert_heading_respect_content'),
71+
org_insert_todo_heading = m.action('org_mappings.insert_todo_heading'),
72+
org_insert_todo_heading_respect_content = m.action('org_mappings.insert_todo_heading_respect_content'),
73+
org_move_subtree_up = m.action('org_mappings.move_subtree_up'),
74+
org_move_subtree_down = m.action('org_mappings.move_subtree_down'),
75+
org_export = m.action('org_mappings.export'),
76+
org_return = m.action('org_mappings.org_return', { modes = { 'i' } }),
77+
org_next_visible_heading = m.action('org_mappings.next_visible_heading', {
78+
modes = { 'n', 'x' },
79+
}),
80+
org_previous_visible_heading = m.action('org_mappings.previous_visible_heading', { modes = { 'n', 'x' } }),
81+
org_forward_heading_same_level = m.action('org_mappings.forward_heading_same_level'),
82+
org_backward_heading_same_level = m.action('org_mappings.backward_heading_same_level'),
83+
outline_up_heading = m.action('org_mappings.outline_up_heading'),
84+
org_deadline = m.action('org_mappings.org_deadline'),
85+
org_schedule = m.action('org_mappings.org_schedule'),
86+
org_time_stamp = m.action('org_mappings.org_time_stamp'),
87+
org_time_stamp_inactive = m.action('org_mappings.org_time_stamp', { args = { true } }),
88+
org_clock_in = m.action('clock.org_clock_in'),
89+
org_clock_out = m.action('clock.org_clock_out'),
90+
org_clock_cancel = m.action('clock.org_clock_cancel'),
91+
org_clock_goto = m.action('clock.org_clock_goto'),
92+
org_set_effort = m.action('clock.org_set_effort'),
93+
org_show_help = m.action('org_mappings.show_help'),
94+
},
95+
edit_src = {
96+
org_edit_src_abort = m.custom([[<Cmd>lua require('orgmode.objects.edit_special').abort()<CR>]]),
97+
org_edit_src_show_help = m.custom([[<Cmd>lua require('orgmode.objects.help').show({ type = 'edit_src' })<CR>]]),
98+
org_edit_src_save = m.custom([[<Cmd>lua require('orgmode.objects.edit_special'):new():write()<CR>]]),
99+
},
100+
text_objects = {
101+
inner_heading = m.text_object('inner_heading'),
102+
around_heading = m.text_object('around_heading'),
103+
inner_subtree = m.text_object('inner_subtree'),
104+
around_subtree = m.text_object('around_subtree'),
105+
inner_heading_from_root = m.text_object('inner_heading_from_root'),
106+
around_heading_from_root = m.text_object('around_heading_from_root'),
107+
inner_subtree_from_root = m.text_object('inner_subtree_from_root'),
108+
around_subtree_from_root = m.text_object('around_subtree_from_root'),
109+
},
110+
}

0 commit comments

Comments
 (0)