Skip to main content
This configuration includes productivity tools for time management, note-taking, and code organization.

TODO comments

Highlight and navigate TODO/FIXME/NOTE comments across your codebase:
lua/plugins/productivity.lua
{
  "folke/todo-comments.nvim",
  dependencies = { "nvim-lua/plenary.nvim" },
  event = "VeryLazy",
}

Keyword highlighting

Multiple comment types with distinct colors:
lua/plugins/productivity.lua
keywords = {
  FIX = {
    icon = " ",
    color = "error",
    alt = { "FIXME", "BUG", "FIXIT", "ISSUE" },
  },
  TODO = { icon = " ", color = "info" },
  HACK = { icon = " ", color = "warning" },
  WARN = { icon = " ", color = "warning", alt = { "WARNING", "XXX" } },
  PERF = { icon = " ", alt = { "OPTIM", "PERFORMANCE", "OPTIMIZE" } },
  NOTE = { icon = " ", color = "hint", alt = { "INFO" } },
  TEST = { icon = "⏲ ", color = "test", alt = { "TESTING", "PASSED", "FAILED" } },
}

FIX

Critical issues requiring fixes Red/error color

TODO

Tasks to complete Blue/info color

HACK

Temporary workarounds Yellow/warning color

WARN

Warnings and edge cases Orange/warning color

PERF

Performance optimizations Purple color

NOTE

Important notes Green/hint color

TEST

Test-related comments Test color
KeyActionDescription
]tNext todoJump to next TODO comment
[tPrevious todoJump to previous TODO comment
lua/plugins/productivity.lua
{
  "]t",
  function()
    require("todo-comments").jump_next()
  end,
  desc = "Next todo comment",
}

Example usage

// TODO: Add input validation
function processData(data) {
  // FIXME: This breaks with null values
  return data.map(item => item.value)
  
  // PERF: Consider using a Set for O(1) lookup
  // NOTE: This assumes data is already sorted
  // HACK: Temporary fix until API is updated
}
All TODO keywords are highlighted in the sign column and visible in search results.

Search integration

Use Snacks picker to search all TODO comments:
:TodoSnacks
Or use Trouble to view them in a list:
:TodoTrouble

Lazyclip

Clipboard manager with history and fuzzy search:
lua/plugins/productivity.lua
{
  "atiladefreitas/lazyclip",
  event = "VeryLazy",
  opts = {
    max_history = 100,
    items_per_page = 9,
    min_chars = 5,
  },
}

Features

Persistent history

Keeps last 100 clipboard items

Fuzzy search

Search clipboard history by content

Pagination

Navigate through items 9 at a time

Quick paste

Insert any historical item instantly

Window configuration

lua/plugins/productivity.lua
window = {
  relative = "editor",
  width = 70,
  height = 12,
  border = "rounded",
}

Keybindings

Inside the Lazyclip window:
KeyActionDescription
qCloseClose clipboard window
hPrevious pageGo to previous page
lNext pageGo to next page
<CR>PastePaste selected item
kMove upMove selection up
jMove downMove selection down
dDeleteDelete selected item from history

Usage example

1

Open Lazyclip

Trigger with your configured keymap (check :Lazyclip)
2

Navigate history

Use j/k to browse clipboard items Use h/l to change pages
3

Search

Type to fuzzy search clipboard content
4

Paste

Press <CR> to paste selected item
Only text with 5+ characters is saved to history to avoid cluttering with single-character yanks.

Timerly

Simple timer plugin for time management:
lua/plugins/productivity.lua
{
  "nvzone/timerly",
  lazy = true,
  cmd = "TimerlyToggle",
  dependencies = "nvzone/volt",
  opts = {},
}

Usage

:TimerlyToggle
Opens a floating window with timer controls.
Perfect for Pomodoro technique or tracking time spent on tasks.

Mini.nvim productivity features

Additional productivity tools from mini.nvim:

Surround

Add, delete, or replace surrounding characters:
require("mini.surround").setup()
OperatorActionExample
saiw)Add surroundword(word)
sd'Delete surround'hello'hello
sr)'Replace surround(word)'word'
Position cursor on word, then:
  • saiw" → Surround with double quotes
  • saiw) → Surround with parentheses
  • saiw] → Surround with square brackets

Split/join

Toggle between split and joined code blocks:
require("mini.splitjoin").setup({
  mappings = {
    toggle = "gS",
  },
})
Example:
// Before (cursor on line)
const obj = { name: "John", age: 30, city: "NYC" }

// Press gS
const obj = {
  name: "John",
  age: 30,
  city: "NYC"
}

// Press gS again to rejoin
Works with:
  • Object literals
  • Array literals
  • Function arguments
  • Import statements
  • JSX props

Operators

Additional text operators:
lua/plugins/mini.lua
require("mini.operators").setup({
  replace = { prefix = "<leader>or" },
  exchange = { prefix = "<leader>ox" },
  sort = { prefix = "<leader>os" },
  multiply = { prefix = "<leader>om" },
  evaluate = { prefix = "<leader>oe" },
})

Replace

<leader>oriw - Replace with register

Exchange

<leader>oxiw - Exchange two text objects

Sort

<leader>osip - Sort lines in paragraph

Multiply

<leader>om3iw - Duplicate word 3 times

Evaluate

<leader>oei) - Evaluate expression

Session management

Persistent sessions with auto-save:
lua/plugins/sessions.lua
{
  "folke/persistence.nvim",
  event = "BufReadPre",
  opts = {},
}
Sessions are automatically saved and restored, preserving window layouts, buffers, and working directory.

Snacks productivity features

Snacks.nvim provides additional productivity tools:

Scratch buffers

KeyActionDescription
<leader>.Toggle scratchQuick scratch buffer for notes
<leader>SSelect scratchChoose from multiple scratch buffers
See Snacks documentation for details.

Zen mode

KeyActionDescription
<leader>zZen modeDistraction-free editing
<leader>ZZoom modeMaximize current window
See Snacks documentation for details.

Workflow tips

  1. Add TODO comments while coding
  2. Use ]t/[t to navigate between them
  3. Search all TODOs with :TodoSnacks
  4. Review and fix items systematically

Integration with other plugins

Snacks

Additional scratch buffers and zen mode

Trouble

View all TODOs in a quickfix-like list

Treesitter

Powers surround and split/join with syntax awareness

Build docs developers (and LLMs) love