diff --git a/README.md b/README.md index 8b26844..45f7361 100644 --- a/README.md +++ b/README.md @@ -55,9 +55,58 @@ require('tabi').setup({ border = 'rounded', }, }, + keymaps = { + enabled = true, -- Set to false to disable all default keymaps + start = 'ts', + ['end'] = 'te', + note = 'tn', + note_delete = 'td', + retrace = 'tr', + retrace_end = 'tq', + sessions = 'tl', + }, +}) +``` + +### Customizing Keymaps + +You can override individual keymaps or disable them by setting to `false`: + +```lua +require('tabi').setup({ + keymaps = { + note = 'an', -- Custom key for note + next = ']n', -- Custom key for next + prev = '[n', -- Custom key for prev + start = false, -- Disable start keymap + }, }) ``` +To disable all default keymaps: + +```lua +require('tabi').setup({ + keymaps = { + enabled = false, + }, +}) +``` + +## Default Keymaps + +| Key | Mode | Command | Description | +|-----|------|---------|-------------| +| `ts` | Normal | `:Tabi start` | Start a new session | +| `te` | Normal | `:Tabi end` | End the current session | +| `tn` | Normal/Visual | `:Tabi note` | Add/edit note at current line | +| `td` | Normal | `:Tabi note delete` | Delete note at current line | +| `tr` | Normal | `:Tabi retrace` | Start retrace mode | +| `tq` | Normal | `:Tabi retrace end` | Quit retrace mode | +| `tl` | Normal | `:Tabi sessions` | List all sessions | + +**Note**: In retrace mode, use Neovim's location list commands (`:lnext`, `:lprev`) to navigate between notes. + ## Usage ### Basic Workflow @@ -87,7 +136,7 @@ require('tabi').setup({ ```vim :Tabi retrace my-reading-session ``` - - Navigate through notes with `:Tabi next` and `:Tabi prev` + - Navigate through notes with `:lnext` and `:lprev` (location list commands) - Exit retrace mode with `:Tabi retrace end` ### Commands @@ -115,8 +164,7 @@ require('tabi').setup({ | Command | Description | |---------|-------------| | `:Tabi retrace [name]` | Start replaying a session | -| `:Tabi next` | Go to next note in replay | -| `:Tabi prev` | Go to previous note in replay | +| `:lnext` / `:lprev` | Navigate through notes (location list) | | `:Tabi retrace end` | Exit retrace mode | ### Anonymous Sessions diff --git a/lua/tabi/config.lua b/lua/tabi/config.lua index 98ff892..df32779 100644 --- a/lua/tabi/config.lua +++ b/lua/tabi/config.lua @@ -4,10 +4,21 @@ local M = {} ---@class TabiOptions ---@field storage TabiStorageConfig ---@field ui TabiUIConfig +---@field keymaps TabiKeymapsConfig ---@class TabiStorageConfig ---@field backend 'local'|'global' +---@class TabiKeymapsConfig +---@field enabled boolean +---@field start string|false +---@field ["end"] string|false +---@field note string|false +---@field note_delete string|false +---@field retrace string|false +---@field retrace_end string|false +---@field sessions string|false + ---@class TabiUIConfig ---@field selector 'native'|'telescope'|'float' ---@field note_preview_length number @@ -43,6 +54,16 @@ M.defaults = { layout_config = {}, }, }, + keymaps = { + enabled = true, + start = "ts", + ["end"] = "te", + note = "tn", + note_delete = "td", + retrace = "tr", + retrace_end = "tq", + sessions = "tl", + }, } --- Current configuration diff --git a/lua/tabi/init.lua b/lua/tabi/init.lua index 34555a0..701e4a4 100644 --- a/lua/tabi/init.lua +++ b/lua/tabi/init.lua @@ -23,6 +23,10 @@ function M.setup(opts) -- Setup autocommands and highlights M._setup_highlights() + + -- Setup keymaps + local keymaps = require("tabi.keymaps") + keymaps.setup() end --- Setup highlight groups diff --git a/lua/tabi/keymaps.lua b/lua/tabi/keymaps.lua new file mode 100644 index 0000000..9e74457 --- /dev/null +++ b/lua/tabi/keymaps.lua @@ -0,0 +1,104 @@ +---@class TabiKeymaps +local M = {} + +--- Setup keymaps based on configuration +function M.setup() + local config = require("tabi.config").get() + local keymaps = config.keymaps + + if not keymaps.enabled then + return + end + + local opts = { silent = true } + + -- Session management + if keymaps.start then + vim.keymap.set( + "n", + keymaps.start, + "Tabi start", + vim.tbl_extend("force", opts, { + desc = "Tabi: Start session", + }) + ) + end + + if keymaps["end"] then + vim.keymap.set( + "n", + keymaps["end"], + "Tabi end", + vim.tbl_extend("force", opts, { + desc = "Tabi: End session", + }) + ) + end + + if keymaps.sessions then + vim.keymap.set( + "n", + keymaps.sessions, + "Tabi sessions", + vim.tbl_extend("force", opts, { + desc = "Tabi: List sessions", + }) + ) + end + + -- Note operations + if keymaps.note then + vim.keymap.set( + "n", + keymaps.note, + "Tabi note", + vim.tbl_extend("force", opts, { + desc = "Tabi: Add/edit note", + }) + ) + vim.keymap.set( + "v", + keymaps.note, + ":Tabi note", + vim.tbl_extend("force", opts, { + desc = "Tabi: Add note for selection", + }) + ) + end + + if keymaps.note_delete then + vim.keymap.set( + "n", + keymaps.note_delete, + "Tabi note delete", + vim.tbl_extend("force", opts, { + desc = "Tabi: Delete note", + }) + ) + end + + -- Retrace mode + if keymaps.retrace then + vim.keymap.set( + "n", + keymaps.retrace, + "Tabi retrace", + vim.tbl_extend("force", opts, { + desc = "Tabi: Start retrace", + }) + ) + end + + if keymaps.retrace_end then + vim.keymap.set( + "n", + keymaps.retrace_end, + "Tabi retrace end", + vim.tbl_extend("force", opts, { + desc = "Tabi: Quit retrace", + }) + ) + end +end + +return M diff --git a/lua/tabi/retrace.lua b/lua/tabi/retrace.lua index f1a2572..35e1438 100644 --- a/lua/tabi/retrace.lua +++ b/lua/tabi/retrace.lua @@ -53,7 +53,7 @@ function M.start(session) state.loclist_bufwin = vim.api.nvim_get_current_win() -- Jump to first note (this will focus the location list) - M.show_current(true) -- silent=true to avoid double notification + M.show_current(true) vim.notify(string.format("Tabi: Retrace mode started - Note 1/%d", #session.notes), vim.log.levels.INFO) return true @@ -121,7 +121,7 @@ function M.next() end state.current_index = state.current_index + 1 - M.show_current() + M.show_current(true) end --- Go to previous note @@ -137,7 +137,7 @@ function M.prev() end state.current_index = state.current_index - 1 - M.show_current() + M.show_current(true) end --- Check if in retrace mode