tdo.nvim integrates tdo into your neovim workflow to make managing notes and todos super simple and fast. Demo video
Add the following to your lazy/packer config
-- Lazy
{
'2kabhishek/tdo.nvim',
dependencies = '2kabhishek/pickme.nvim',
cmd = { 'Tdo' },
keys = { '<leader>nn', '<leader>nt', '<leader>nx', '[t', ']t' }, -- Add more keybindings you need for lazy loading
},
tdo.nvim can be configured using the following options:
local tdo = require('tdo')
tdo.setup({
add_default_keybindings = true, -- Add default keybindings for the plugin
completion = {
offsets = {}, -- Custom offsets / date expressions for completion
ignored_files = { 'README.md', 'templates' }, -- Files/directories to ignore in completions
},
cache = { -- You don't really need to change these
timeout = 5000, -- Completion cache timeout in milliseconds
max_entries = 100, -- Maximum number of cached completion entries
},
lualine = { -- Only used for lualine integration
update_frequency = 300, -- How frequently to update the pending todo count in lualine
only_show_in_notes = false, -- Whether to show the lualine component only in notes buffers
}
})
tdo.nvim
provides the following commands.
:Tdo [date_expression / note]
: Opens todo with flexible date formats - available expressions:Tdo
- Open today's todo:Tdo tomorrow
- Open tomorrow's todo:Tdo monday
- Open this Monday's todo:Tdo next-friday
- Open next Friday's todo:Tdo 2-weeks-ago
- Open todo from 2 weeks ago:Tdo 2025-07-14
- Open todo for specific date:Tdo vim
- Open note file "vim.md" in notes dir:Tdo entry [date_expression]
: Opens journal entry with same flexible date formats:Tdo entry
- Open today's journal entry:Tdo entry last-tue
- Open last Tuesday's journal entry:Tdo note [title/note-file]
: Create new note, if empty creates timestamped draft:Tdo files
: Review all your notes:Tdo find [text]
: Search for text in all notes:Tdo todos
: Show all incomplete todos:Tdo toggle
: Toggle todo stateThe modern Tdo
command supports comprehensive tab completion:
entry
, note
, files
, find
, todos
, toggle
today
, tomorrow
, yesterday
, monday
, next-friday
, last-week
- powered by your completion.offsets
config, available expressionsBy default, these are the configured keybindings.
Keybinding | Command | Description |
---|---|---|
<leader>nn |
:Tdo<CR> |
Today's Todo |
<leader>ne |
:Tdo entry<CR> |
Today's Entry |
<leader>nf |
:Tdo files<CR> |
All Notes |
<leader>ng |
:Tdo find<CR> |
Find Notes |
<leader>nh |
:Tdo yesterday<CR> |
Yesterday's Todo |
<leader>nl |
:Tdo tomorrow<CR> |
Tomorrow's Todo |
<leader>nc |
:Tdo note<CR> |
Create Note |
<leader>ns |
:lua require("tdo.notes").run_with("commit")<CR> |
Commit Note |
<leader>nt |
:Tdo todos<CR> |
Incomplete Todos |
<leader>nx |
:Tdo toggle<CR> |
Toggle Todo |
]t |
/\v\[ \]\_s*[^[]<CR>:noh<CR> |
Next Todo |
[t |
?\v\[ \]\_s*[^[]<CR>:noh<CR> |
Prev Todo |
<leader>nd[1-9] |
:Tdo [1-9]<CR> |
Todo N Days Later |
<leader>nD[1-9] |
:Tdo -[1-9]<CR> |
Todo N Days Ago |
<leader>nw[1-9] |
:Tdo [1-9]-weeks-later<CR> |
Todo N Weeks Later |
<leader>nW[1-9] |
:Tdo [1-9]-weeks-ago<CR> |
Todo N Weeks Ago |
<leader>nm[1-9] |
:Tdo [1-9]-months-later<CR> |
Todo N Months Later |
<leader>nM[1-9] |
:Tdo [1-9]-months-ago<CR> |
Todo N Months Ago |
<leader>ny[1-9] |
:Tdo [1-9]-years-later<CR> |
Todo N Years Later |
<leader>nY[1-9] |
:Tdo [1-9]-years-ago<CR> |
Todo N Years Ago |
I recommend customizing these keybindings based on your preferences.
Note: Keybindings are only active when add_default_keybindings = true
in your configuration.
You can display your pending todo count in your lualine statusline.
Copy the component from lua/tdo/lualine.lua and add it to your lualine sections
config (recommended)
require('lualine').setup({
sections = {
lualine_x = { require('tdo.lualine'), 'fileformat', 'filetype' },
}
})
You tell me!
Most note-taking systems offer a lot more than I needed, so I wrote tdo and then tdo.nvim for better integration.
⭐ hit the star button if you found this useful ⭐
Source | Blog | Twitter | LinkedIn | More Links | Other Projects