Skip to content

atiladefreitas/dooing

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

64 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Dooing

Dooing is a minimalist todo list manager for Neovim, designed with simplicity and efficiency in mind. It provides a clean, distraction-free interface to manage your tasks directly within Neovim. Perfect for users who want to keep track of their todos without leaving their editor.

dooing demo

πŸš€ Features

  • πŸ“ Manage todos in a clean floating window
  • 🏷️ Categorize tasks with #tags
  • βœ… Simple task management with clear visual feedback
  • πŸ’Ύ Persistent storage of your todos
  • 🎨 Adapts to your Neovim colorscheme
  • πŸ› οΈ Compatible with Lazy.nvim for effortless installation
  • ⏰ Relative timestamps showing when todos were created
  • πŸ“‚ Per-project todos with git integration

πŸ“¦ Installation

Prerequisites

  • Neovim >= 0.10.0
  • Lazy.nvim as your plugin manager

Using Lazy.nvim

return {
    "atiladefreitas/dooing",
    config = function()
        require("dooing").setup({
            -- your custom config here (optional)
        })
    end,
}

Run the following commands in Neovim to install Dooing:

:Lazy sync

Default Configuration

Dooing comes with sensible defaults that you can override:

{
    -- Core settings
    save_path = vim.fn.stdpath("data") .. "/dooing_todos.json",

    -- Timestamp settings
    timestamp = {
        enabled = true,  -- Show relative timestamps (e.g., @5m ago, @2h ago)
    },

    -- Window settings
    window = {
        width = 55,         -- Width of the floating window
        height = 20,        -- Height of the floating window
        border = 'rounded', -- Border style
        position = 'center', -- Window position: 'right', 'left', 'top', 'bottom', 'center',
                           -- 'top-right', 'top-left', 'bottom-right', 'bottom-left'
        padding = {
            top = 1,
            bottom = 1,
            left = 2,
            right = 2,
        },
    },

    -- To-do formatting
    formatting = {
        pending = {
            icon = "β—‹",
            format = { "icon", "notes_icon", "text", "due_date", "ect" },
        },
        in_progress = {
            icon = "◐",
            format = { "icon", "text", "due_date", "ect" },
        },
        done = {
            icon = "βœ“",
            format = { "icon", "notes_icon", "text", "due_date", "ect" },
        },
    },

    quick_keys = true,      -- Quick keys window
    
    notes = {
        icon = "πŸ““",
    },

    scratchpad = {
        syntax_highlight = "markdown",
    },

    -- Per-project todos
    per_project = {
        enabled = true,                        -- Enable per-project todos
        default_filename = "dooing.json",      -- Default filename for project todos
        auto_gitignore = false,                -- Auto-add to .gitignore (true/false/"prompt")
        on_missing = "prompt",                 -- What to do when file missing ("prompt"/"auto_create")
    },

    -- Nested tasks
    nested_tasks = {
        enabled = true,                        -- Enable nested subtasks
        indent = 2,                           -- Spaces per nesting level
        retain_structure_on_complete = true,   -- Keep nested structure when completing tasks
        move_completed_to_end = true,         -- Move completed nested tasks to end of parent group
    },

    -- Keymaps
    keymaps = {
        toggle_window = "<leader>td",          -- Toggle global todos
        open_project_todo = "<leader>tD",      -- Toggle project-specific todos
        new_todo = "i",
        create_nested_task = "<leader>tn",     -- Create nested subtask under current todo
        toggle_todo = "x",
        delete_todo = "d",
        delete_completed = "D",
        close_window = "q",
        undo_delete = "u",
        add_due_date = "H",
        remove_due_date = "r",
        toggle_help = "?",
        toggle_tags = "t",
        toggle_priority = "<Space>",
        clear_filter = "c",
        edit_todo = "e",
        edit_tag = "e",
        edit_priorities = "p",
        delete_tag = "d",
        search_todos = "/",
        add_time_estimation = "T",
        remove_time_estimation = "R",
        import_todos = "I",
        export_todos = "E",
        remove_duplicates = "<leader>D",
        open_todo_scratchpad = "<leader>p",
        refresh_todos = "f",
        share_todos = "s",
    },

    calendar = {
        language = "en",
        icon = "",
        keymaps = {
            previous_day = "h",
            next_day = "l",
            previous_week = "k",
            next_week = "j",
            previous_month = "H",
            next_month = "L",
            select_day = "<CR>",
            close_calendar = "q",
        },
    },

    -- Priority settings
    priorities = {
        {
            name = "important",
            weight = 4,
        },
        {
            name = "urgent",
            weight = 2,
        },
    },
    priority_groups = {
        high = {
            members = { "important", "urgent" },
            color = nil,
            hl_group = "DiagnosticError",
        },
        medium = {
            members = { "important" },
            color = nil,
            hl_group = "DiagnosticWarn",
        },
        low = {
            members = { "urgent" },
            color = nil,
            hl_group = "DiagnosticInfo",
        },
    },
    hour_score_value = 1/8,
    done_sort_by_completed_time = false,
}

πŸ“‚ Per-Project Todos

Dooing supports project-specific todo lists that are separate from your global todos. This feature integrates with git repositories to automatically detect project boundaries.

Usage

  • <leader>td - Open/toggle global todos (works everywhere)
  • <leader>tD - Open/toggle project-specific todos (only in git repositories)

How it works

  1. When you press <leader>tD in a git repository, Dooing looks for a todo file in the project root
  2. If the file exists, it loads those todos
  3. If not, it prompts you to create one with an optional custom filename
  4. Project todos are completely separate from global todos
  5. Switch between them anytime using the different keymaps

Configuration Options

per_project = {
    enabled = true,                    -- Enable/disable per-project todos
    default_filename = "dooing.json",  -- Default filename for new project todo files
    auto_gitignore = false,           -- Automatically add to .gitignore
                                      -- Set to true for auto-add, "prompt" to ask, false to skip
    on_missing = "prompt",            -- What to do when project todo file doesn't exist
                                      -- "prompt" = ask user, "auto_create" = create automatically
}

Commands

Dooing provides several commands for task management:

  • :Dooing - Opens the global todo window
  • :DooingLocal - Opens the project-specific todo window (git repositories only)
  • :Dooing add [text] - Adds a new task
    • -p, --priorities [list] - Comma-separated list of priorities (e.g. "important,urgent")
  • :Dooing list - Lists all todos with their indices and metadata
  • :Dooing set [index] [field] [value] - Modifies todo properties
    • priorities - Set/update priorities (use "nil" to clear)
    • ect - Set estimated completion time (e.g. "30m", "2h", "1d", "0.5w")

πŸ”‘ Keybindings

Dooing comes with intuitive keybindings:

Main Window

Key Action
<leader>td Toggle todo window
i Add new todo
<leader>tn Create nested subtask
x Toggle todo status
d Delete current todo
D Delete all completed todos
q Close window
H Add due date
r Remove due date
T Add time estimation
R Remove time estimation
? Toggle help window
t Toggle tags window
c Clear active tag filter
e Edit todo
p Edit priorities
u Undo delete
/ Search todos
I Import todos
E Export todos
<leader>D Remove duplicates
<leader>p Open todo scratchpad
f Refresh todo list
s Share todos [EXPERIMENTAL]

Tags Window

Key Action
e Edit tag
d Delete tag
<CR> Filter by tag
q Close window

Calendar Window

Key Action
h Previous day
l Next day
k Previous week
j Next week
H Previous month
L Next month
<CR> Select date
q Close calendar

πŸ“₯ Backlog

Planned features and improvements for future versions of Dooing:

Core Features

  • Due Dates Support
  • Priority Levels
  • Todo Filtering by Tags
  • Todo Search
  • Todo List Per Project

UI Enhancements

  • Tag Highlighting
  • Custom Todo Colors
  • Todo Categories View

Quality of Life

  • Multiple Todo Lists
  • Import/Export Features

πŸ“ License

This project is licensed under the MIT License. See the LICENSE file for details.


πŸ”– Versioning

We use Semantic Versioning for versioning. For the available versions, see the tags on this repository.


🀝 Contributing

Contributions are welcome! If you'd like to improve Dooing, please read our Contributing Guide for detailed information about:

  • Setting up the development environment
  • Understanding the modular codebase structure
  • Adding new features and fixing bugs
  • Testing and documentation guidelines
  • Submitting pull requests

For quick contributions:

  • Submit an issue for bugs or feature requests
  • Create a pull request with your enhancements

🌟 Acknowledgments

Dooing was built with the Neovim community in mind. Special thanks to all the developers who contribute to the Neovim ecosystem and plugins like Lazy.nvim.


All my plugins

Repository Description Stars
LazyClip A Simple Clipboard Manager Stars
Dooing A Minimalist Todo List Manager Stars
TinyUnit A Practical CSS Unit Converter Stars

πŸ“¬ Contact

If you have any questions, feel free to reach out:

About

The minimalist to-do list for Neovim

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published