diff --git a/lua/orgmode/config/_meta.lua b/lua/orgmode/config/_meta.lua index edd4a828b..56226699e 100644 --- a/lua/orgmode/config/_meta.lua +++ b/lua/orgmode/config/_meta.lua @@ -130,6 +130,8 @@ ---@field org_demote_subtree? OrgMappingValue Default: '>s' ---@field org_meta_return? OrgMappingValue Add heading, item or row (context-dependent) Default: '' ---@field org_return? OrgMappingValue Default: '' +---@field org_insert_mode_promote? OrgMappingValue Promote heading or decrease indent in insert mode. Default: '' +---@field org_insert_mode_demote? OrgMappingValue Demote heading or increase indent in insert mode. Default: '' ---@field org_insert_heading_respect_content? OrgMappingValue Add new heading after current heading block (same level) Default: 'ih' ---@field org_insert_todo_heading? OrgMappingValue Add new todo heading right after current heading (same level) Default: 'iT' ---@field org_insert_todo_heading_respect_content? OrgMappingValue Add new todo heading after current heading block (same level). Default: 'it' diff --git a/lua/orgmode/config/defaults.lua b/lua/orgmode/config/defaults.lua index 2a5ebd64f..aaadea79a 100644 --- a/lua/orgmode/config/defaults.lua +++ b/lua/orgmode/config/defaults.lua @@ -177,6 +177,8 @@ local DefaultConfig = { org_demote_subtree = '>s', org_meta_return = '', -- Add heading, item or row (context-dependent) org_return = '', + org_insert_mode_promote = '', + org_insert_mode_demote = '', org_insert_heading_respect_content = 'ih', -- Add new heading after current heading block (same level) org_insert_todo_heading = 'iT', -- Add new todo heading right after current heading (same level) org_insert_todo_heading_respect_content = 'it', -- Add new todo heading after current heading block (same level) diff --git a/lua/orgmode/config/mappings/init.lua b/lua/orgmode/config/mappings/init.lua index 96bccd02a..b1716d275 100644 --- a/lua/orgmode/config/mappings/init.lua +++ b/lua/orgmode/config/mappings/init.lua @@ -293,6 +293,14 @@ return { ), org_export = m.action('org_mappings.export', { opts = { desc = 'org export', help_desc = 'Open export options' } }), org_return = m.action('org_mappings.org_return', { modes = { 'i' }, opts = { desc = 'org return' } }), + org_insert_mode_promote = m.action('org_mappings.insert_mode_promote', { + modes = { 'i' }, + opts = { desc = 'org insert mode promote' }, + }), + org_insert_mode_demote = m.action('org_mappings.insert_mode_demote', { + modes = { 'i' }, + opts = { desc = 'org insert mode demote' }, + }), org_next_visible_heading = m.action('org_mappings.next_visible_heading', { modes = { 'n', 'x' }, opts = { desc = 'org next visible headline', help_desc = 'Go to next headline (any level)' }, diff --git a/lua/orgmode/org/mappings.lua b/lua/orgmode/org/mappings.lua index 2e882764b..38d1bfe63 100644 --- a/lua/orgmode/org/mappings.lua +++ b/lua/orgmode/org/mappings.lua @@ -569,6 +569,44 @@ function OrgMappings:do_demote(whole_subtree) vim.fn.winrestview(win_view) end +function OrgMappings:insert_mode_promote() + local line_number = vim.fn.line('.') + local line = vim.fn.getline(line_number) + + if line:match('^%*+') then + local cursor_col = vim.fn.col('.') + local new_line = line:gsub('^%*+', function(asterisks) + if #asterisks > 1 then + return string.rep('*', #asterisks - 1) + else + return '' + end + end) + vim.fn.setline(line_number, new_line) + vim.fn.cursor(line_number, math.max(1, cursor_col - 1)) + return + end + + return vim.api.nvim_feedkeys(utils.esc(''), 'n', true) +end + +function OrgMappings:insert_mode_demote() + local line_number = vim.fn.line('.') + local line = vim.fn.getline(line_number) + + if line:match('^%*+') then + local cursor_col = vim.fn.col('.') + local new_line = line:gsub('^(%*+)', function(asterisks) + return asterisks .. '*' + end) + vim.fn.setline(line_number, new_line) + vim.fn.cursor(line_number, cursor_col + 1) + return + end + + return vim.api.nvim_feedkeys(utils.esc(''), 'n', true) +end + function OrgMappings:org_return() local actions = { function()