diff --git a/lua/orgmode/objects/calendar.lua b/lua/orgmode/objects/calendar.lua index e77e5c440..5808f710f 100644 --- a/lua/orgmode/objects/calendar.lua +++ b/lua/orgmode/objects/calendar.lua @@ -81,6 +81,7 @@ function Calendar.open() vim.keymap.set('n', '<', 'lua require("orgmode.objects.calendar").backward()', map_opts) vim.keymap.set('n', '', 'lua require("orgmode.objects.calendar").select()', map_opts) vim.keymap.set('n', '.', 'lua require("orgmode.objects.calendar").reset()', map_opts) + vim.keymap.set('n', 'i', 'lua require("orgmode.objects.calendar").read_date()', map_opts) vim.keymap.set('n', 'q', ':call nvim_win_close(win_getid(), v:true)', map_opts) vim.keymap.set('n', '', ':call nvim_win_close(win_getid(), v:true)', map_opts) if Calendar.clearable then @@ -145,7 +146,9 @@ function Calendar.render() table.insert(content, ' [<] - prev month [>] - next month') table.insert(content, ' [.] - today [Enter] - select day') if Calendar.clearable then - table.insert(content, ' [r] Clear date') + table.insert(content, ' [i] - enter date [r] - clear date') + else + table.insert(content, ' [i] - enter date') end vim.api.nvim_buf_set_lines(Calendar.buf, 0, -1, true, content) @@ -264,7 +267,7 @@ function Calendar.reset() vim.fn.search(today:format('%d'), 'W') end -function Calendar.select() +function Calendar.get_selected_date() local col = vim.fn.col('.') local char = vim.fn.getline('.'):sub(col, col) local day = vim.trim(vim.fn.expand('')) @@ -274,7 +277,11 @@ function Calendar.select() return utils.echo_warning('Please select valid day number.', nil, false) end day = tonumber(day) - local selected_date = Calendar.month:set({ day = day }) + return Calendar.month:set({ day = day }) +end + +function Calendar.select() + local selected_date = Calendar.get_selected_date() local cb = Calendar.callback Calendar.callback = nil vim.cmd([[echon]]) @@ -300,4 +307,21 @@ function Calendar.clear_date() cb(nil, true) end +function Calendar.read_date() + vim.ui.input({ prompt = 'Enter date: ' }, function(result) + if result then + local date = Date.from_string(result) + if not date then + date = Calendar.get_selected_date():adjust(result) + end + + Calendar.date = date + Calendar.month = date:set({ day = 1 }) + Calendar.render() + vim.fn.cursor(2, 0) + vim.fn.search(date:format('%d'), 'W') + end + end) +end + return Calendar