{"id":21897219,"url":"https://github.com/bmpi-dev/vscode-todo-plus-plus","last_synced_at":"2025-08-12T06:14:59.443Z","repository":{"id":102066491,"uuid":"226492856","full_name":"bmpi-dev/vscode-todo-plus-plus","owner":"bmpi-dev","description":null,"archived":false,"fork":false,"pushed_at":"2020-02-15T16:10:00.000Z","size":4115,"stargazers_count":15,"open_issues_count":1,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-15T18:44:40.880Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.bmpi.dev/zh-cn/dev/vscode-plugin-development-notes/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bmpi-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-12-07T10:25:35.000Z","updated_at":"2024-02-14T20:23:19.000Z","dependencies_parsed_at":"2023-04-15T13:30:18.551Z","dependency_job_id":null,"html_url":"https://github.com/bmpi-dev/vscode-todo-plus-plus","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bmpi-dev/vscode-todo-plus-plus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmpi-dev%2Fvscode-todo-plus-plus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmpi-dev%2Fvscode-todo-plus-plus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmpi-dev%2Fvscode-todo-plus-plus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmpi-dev%2Fvscode-todo-plus-plus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bmpi-dev","download_url":"https://codeload.github.com/bmpi-dev/vscode-todo-plus-plus/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmpi-dev%2Fvscode-todo-plus-plus/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270011194,"owners_count":24511902,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-12T02:00:09.011Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-28T14:16:36.518Z","updated_at":"2025-08-12T06:14:59.434Z","avatar_url":"https://github.com/bmpi-dev.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Todo+\n\n## !!!UPDATE!!!\nThis is a copy from [fabiospampinato/vscode-todo-plus](https://github.com/fabiospampinato/vscode-todo-plus), I modify it for myself use. Below is my change:\n1. Add DOING window in treeview. This helps me focus on what I'm doing.\n2. Add CRITICAL window in treeview. This helps remind me of things that are important but haven't started.\n---\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/fabiospampinato/vscode-todo-plus/master/resources/logo/logo.png\" width=\"128\" alt=\"Logo\"\u003e\n\u003c/p\u003e\n\nManage todo lists with ease. Powerful, easy to use and customizable. [View the demo](#demo).\n\n## Features\n\n- **Easy to use**: you're just a few shortcuts away from becoming a master\n- **Portable**: being a plain text format you can read and edit it using any editor\n- **Custom symbols**: you can replace the default symbols with any of the supported ones\n  - **Box**: `-` `❍` `❑` `■` `⬜` `□` `☐` `▪` `▫` `–` `—` `≡` `→` `›` `[]` `[ ]`\n  - **Done**: `✔` `✓` `☑` `+` `[x]` `[X]` `[+]`\n  - **Cancelled**: `✘` `x` `X` `[-]`\n- **Custom colors**: all colors can be customized\n- **Custom special tags**: special tags' names and their colors can be customized\n- **Archive**: you can move finished todos to a special \"Archive\" section with a shortcut\n- **Formatting**: you can format text in a markdown-like fashion, we support: **bold**, _italic_, ~~strikethrough~~ and `code`\n- **Go To Symbol**: you can easily move between projects by using the `Go to Symbol in File...` command\n- **[TaskPaper](https://www.taskpaper.com) compatible**: just set `todo.symbols.box`, `todo.symbols.done` and `todo.symbols.cancelled` to `-`\n- **Timekeeping**: you can mark todos as started and track elapsed time until completion\n- **Timer**: a timer can be displayed in the statusbar for started todos\n- **Time estimates**: you can estimate the time it will take to complete a todo by adding a tag to it that looks like this: `@est(3 hours)`, `@est(2h30m)` or `@2h30m`. Then you can use the `[est]` token in statistics\n- **Statistics**: statistics about your entire file and/or project-level statistics about your individual projects\n- **Embedded todos**: it's common to have `//TODO` or `//FIXME` comments in our code, this extension can find those as well\n- **Activity bar views**: you can view your todo file and your embedded todos from a custom activity bar section\n\n## Install\n\nFollow the instructions in the [Marketplace](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-todo-plus), or run the following in the command palette:\n\n```shell\next install fabiospampinato.vscode-todo-plus\n```\n\n## Usage\n\nIt adds 11 commands to the command palette:\n\n```js\n'Todo: Open' // Open or create your project's todo file\n'Todo: Open Embedded' // Open embedded todos\n'Todo: Toggle Box' // Toggle todo's box symbol\n'Todo: Toggle Done' // Toggle todo's done symbol\n'Todo: Toggle Cancelled' // Toggle todo's cancelled symbol\n'Todo: Toggle Start' // Toggle a todo as started\n'Todo: Toggle Timer' // Toggle the timer\n'Todo: Archive' // Archive finished todos\n'Todo: Embedded View - Filter' // Filter the embedded todos view\n'Todo: Embedded View - Clear Filter' // Clear the filter in the embedded todos view\n'Todo: Embedded View - Toggle View All Files' // Toggle between viewing all files or only the current one\n```\n\nIt adds 6 shortcuts when editing a `Todo` file:\n\n```js\n'Cmd/Ctrl+Enter' // Triggers `Todo: Toggle Box`\n'Alt+Enter' // Triggers `Todo: Toggle Box`\n'Alt+D' // Triggers `Todo: Toggle Done`\n'Alt+C' // Triggers `Todo: Toggle Cancelled`\n'Alt+S' // Triggers `Todo: Toggle Start`\n'Cmd/Ctrl+Shift+A' // Triggers  `Todo: Archive`\n```\n\n## Settings\n\n```js\n{\n  \"todo.file.name\": \"TODO\", // Todo file name. Other supported names are: `*.todo`, `*.todos`, `*.task`, `*.tasks`, `*.taskpaper` and `todolist.txt`\n  \"todo.file.defaultContent\": \"\\nTodo:\\n  ☐ Item\\n\", // New todo files default content\n  \"todo.file.include\": [\"**/TODO\", ...], // Globs to use for including files\n  \"todo.file.exclude\": [\"**/.!(todo|todos|task|tasks)/**\", ...], // Globs to use for excluding files\n  \"todo.file.view.expanded\": true, // Start the tree in an expanded state\n  \"todo.indentation\": \"  \", // String used for indentation\n  \"todo.symbols.box\": \"☐\", // Box symbol\n  \"todo.symbols.done\": \"✔\", // Done symbol\n  \"todo.symbols.cancelled\": \"✘\", // Cancelled symbol\n  \"todo.colors.done\": \"#a6e22e\", // Done todo color\n  \"todo.colors.cancelled\": \"#f92672\", // Cancelled todo color\n  \"todo.colors.code\": \"#fd971f\", // Code color\n  \"todo.colors.comment\": \"#75715e\", // Comment color\n  \"todo.colors.project\": \"#66d9ef\", // Project color\n  \"todo.colors.projectStatistics\": \"#4694a3\", // Project statistics color\n  \"todo.colors.tag\": \"#e6db74\", // Tag color\n  \"todo.colors.tags.background\": [\"#e54545\", \"#e59f45\", \"#e5d145\", \"#ae81ff\"], // Special tags' background colors\n  \"todo.colors.tags.foreground\": [\"#000000\", \"#000000\", \"#000000\", \"#000000\"], // Special tags' foreground colors\n  \"todo.colors.types\": { \"TODO\": \"#ffcc00\", \"FIXME\": \"#cc0000\" ... }, // Object mapping todo types to their color\n  \"todo.colors.dark\": { /* \"done\": \"white\", ... */ }, // Colors for dark themes\n  \"todo.colors.light\": { /* \"done\": \"black\", ... */ }, // Colors for light themes\n  \"todo.tags.names\": [\"critical\", \"high\", \"low\", \"today\"], // Special tags' names\n  \"todo.tags.namesInference\": true, // Infer commonly used tags' names\n  \"todo.archive.name\": \"Archive\", // Name of the special \"Archive\" section\n  \"todo.archive.remove.emptyProjects\": true, // Remove projects without todos\n  \"todo.archive.remove.emptyLines\": 1, // Remove extra empty lines, keeping no more than `emptyLinesThreshold` consecutive empty lines\n  \"todo.archive.project.enabled\": true, // Enable the @project tag\n  \"todo.archive.project.separator\": \".\", // String used for joining multiple projects\n  \"todo.archive.sortByDate\": false, // Sort lines by finished date\n  \"todo.formatting.enabled\": true, // Enable markdown-like formatting\n  \"todo.timekeeping.created.enabled\": false, // Enable the @created tag\n  \"todo.timekeeping.created.time\": true, // Insert the time inside the @created tag\n  \"todo.timekeeping.created.format\": \"YY-MM-DD HH:mm\", // Format used for displaying time inside @created\n  \"todo.timekeeping.started.time\": true, // Insert the time inside the @started tag\n  \"todo.timekeeping.started.format\": \"YY-MM-DD HH:mm\", // Format used for displaying time inside @started\n  \"todo.timekeeping.finished.enabled\": true, // Enable the @done/cancelled tag. It's always enabled if you explicitly start a todo or if you use only 1 symbol\n  \"todo.timekeeping.finished.time\": true, // Insert the time inside the @done/cancelled tag\n  \"todo.timekeeping.finished.format\": \"YY-MM-DD HH:mm\", // Format used for displaying time inside @done/cancelled\n  \"todo.timekeeping.elapsed.enabled\": true, // Enable the @lasted/wasted tag\n  \"todo.timekeeping.elapsed.format\": \"short-compact\", // Format used for displaying time diff inside @lasted/waster\n  \"todo.timekeeping.estimate.format\": \"short-compact\", // Format used for the `[est]` token\n  \"todo.timer.statusbar.enabled\": true, // Show a timer for started todos in the statusbar\n  \"todo.timer.statusbar.alignment\": \"left\", // Should the item be placed to the left or right?\n  \"todo.timer.statusbar.color\": \"\", // The foreground color for this item\n  \"todo.timer.statusbar.priority\": -10, // The priority of this item. Higher value means the item should be shown more to the left\n  \"todo.statistics.project.enabled\": \"global.projects \u003c 100\", // Show statistics next to a project, boolean or JS expression\n  \"todo.statistics.project.text\": \"([pending]) [est]\", // Template used for rendering the text\n  \"todo.statistics.statusbar.enabled\": \"global.projects \u003c 100 \u0026\u0026 project.all \u003e 0\", // Show statistics in the statusbar, boolean or JS expression\n  \"todo.statistics.statusbar.ignoreArchive\": true, // Ignore the archive when rendering statistics in the statusbar\n  \"todo.statistics.statusbar.alignment\": \"left\", // Should the item be placed to the left or right?\n  \"todo.statistics.statusbar.color\": \"\", // The foreground color for this item\n  \"todo.statistics.statusbar.command\": \"\", // Command to execute on click\n  \"todo.statistics.statusbar.priority\": -1, // The priority of this item. Higher value means the item should be shown more to the left\n  \"todo.statistics.statusbar.text\": \"$(check) [finished]/[all] ([percentage]%)\", // Template used for rendering the text\n  \"todo.statistics.statusbar.tooltip\": \"[pending] Pending - [done] Done - [cancelled] Cancelled\", // Template used for rendering the tooltip\n  \"todo.embedded.regex\": \"(?:\u003c!-- *)?(?:#|// @|//|/\\\\*+|\u003c!--|--|\\\\* @|\\\\{!|\\\\{\\\\{!--|\\\\{\\\\{!) *(TODO|FIXME|FIX|BUG|UGLY|HACK|NOTE|IDEA|REVIEW|DEBUG|OPTIMIZE)(?:\\\\s*\\\\([^)]+\\\\))?:?(?!\\\\w)(?: *--\u003e| *\\\\*/| *!}| *--}}| *}}|(?= *(?:[^:]//|/\\\\*+|\u003c!--|@|--|\\\\{!|\\\\{\\\\{!--|\\\\{\\\\{!))|((?: +[^\\\\n@]*?)(?= *(?:[^:]//|/\\\\*+|\u003c!--|@|--(?!\u003e)|\\\\{!|\\\\{\\\\{!--|\\\\{\\\\{!))|(?: +[^@\\\\n]+)?))\", // Regex used for finding embedded todos, requires double escaping\n  \"todo.embedded.regexFlags\": \"gi\", // Regex flags to use\n  \"todo.embedded.include\": [\"**/*\"], // Globs to use for including files\n  \"todo.embedded.exclude\": [\"**/.*\", \"**/.*/**\", ...], // Globs to use for excluding files\n  \"todo.embedded.provider\": \"\", // The provider to use when searching for embedded todos\n  \"todo.embedded.providers.ag.regex\": \"(?:#|// @|//|/\\\\*+|\u003c!--|--|\\\\* @|\\\\{!|\\\\{\\\\{!--|\\\\{\\\\{!) *(TODO|FIXME|FIX|BUG|UGLY|HACK|NOTE|IDEA|REVIEW|DEBUG|OPTIMIZE)\", // Regex used by ag, requires double escaping\n  \"todo.embedded.providers.ag.args\": ['--ignore-case'], // Extra arguments to pass to ag\n  \"todo.embedded.providers.rg.regex\": \"(?:#|// @|//|/\\\\*+|\u003c!--|--|\\\\* @|\\\\{!|\\\\{\\\\{!--|\\\\{\\\\{!) *(TODO|FIXME|FIX|BUG|UGLY|HACK|NOTE|IDEA|REVIEW|DEBUG|OPTIMIZE)\", // Regex used by rg, requires double escaping\n  \"todo.embedded.providers.rg.args\": ['--ignore-case'], // Extra arguments to pass to rg\n  \"todo.embedded.file.wholeLine\": true, // Show the whole line\n  \"todo.embedded.file.groupByRoot\": true, // Group embedded todos by workspace root\n  \"todo.embedded.file.groupByType\": true, // Group embedded todos by type\n  \"todo.embedded.file.groupByFile\": true, // Group embedded todos by file\n  \"todo.embedded.view.wholeLine\": false, // Show the whole line\n  \"todo.embedded.view.groupByRoot\": true, // Group embedded todos by workspace root\n  \"todo.embedded.view.groupByType\": true, // Group embedded todos by type\n  \"todo.embedded.view.groupByFile\": true, // Group embedded todos by file\n  \"todo.embedded.view.expanded\": true, // Start the tree in an expanded state\n  \"todo.embedded.view.icons\": true // Show icons next to todos and types\"\n}\n```\n\nChanging some settings (symbols, colors, providers...) requires a restart.\n\nAn actual regex will be generated from the value of the `todo.embedded.regex` setting. It uses 2 capturing groups, the first one captures the type of the todo (`TODO`, `FIXME` etc.) and the second one captures an optional description (`TODO: description`).\n\nDates are formatted using [moment](https://momentjs.com/docs/#/displaying/format).\n\n## Embedded Todos Providers\n\nThis extension supports various providers for searching for embedded todos, it'll use the one you set via the `todo.embedded.provider` setting or the first one available between:\n\n1. **[ag / The Silver Searcher](https://github.com/ggreer/the_silver_searcher)**: About 50x faster than the `javascript` provider, it'll use the regex defined under `todo.embedded.providers.ag.regex`. It must be installed in your system.\n2. **[rg / ripgrep](https://github.com/BurntSushi/ripgrep)**: About 50x faster than the `javascript` provider, it'll use the regex defined under `todo.embedded.providers.rg.regex`. It doesn't support lookaheads and lookbehinds. It must be installed in your system, or Visual Studio Code must include it.\n3. **javascript**: Works on every system, but it's quite slow. This is the fallback provider.\n\n`ag` and `rg` will use their specific regexes for finding the lines containing embedded todos, then those lines will be searched in using the regex defined under `todo.embedded.regex`.\n\n## Statistics Tokens\n\nThe following tokens can be used in `todo.statistics.project.text`, `todo.statistics.statusbar.text` and `todo.statistics.statusbar.tooltip`, they will be replaced with the value they represent.\n\n| Token          | Value                            |\n|----------------|----------------------------------|\n| `[comments]`   | Number of comments               |\n| `[projects]`   | Number of projects               |\n| `[tags]`       | Number of tags                   |\n| `[pending]`    | Number of pending todos          |\n| `[done]`       | Number of done todos             |\n| `[cancelled]`  | Number of cancelled todos        |\n| `[finished]`   | Number of finished todos         |\n| `[all]`        | Number of todos                  |\n| `[percentage]` | Percentage of finished todos     |\n| `[est]`        | Estimated time                   |\n| `[lasted]`     | Time the task lasted             |\n| `[wasted]`     | Time wasted on task              |\n| `[elapsed]`    | Sum of `[lasted]` and `[wasted]` |\n\n## Demo\n\n### [Example todo file](https://github.com/fabiospampinato/vscode-todo-plus/blob/master/resources/readme.todo)\n\n![Example todo file](resources/demo/syntax.png)\n\n### Embedded todos\n\n![Embedded](resources/demo/embedded.gif)\n\n### Activity bar views\n\n![Activity bar views](resources/demo/activity_bar_views.png)\n\n### Statistics\n\n![Statistics](resources/demo/statistics.png)\n\n![Project Statistics](resources/demo/project_statistics.png)\n\n![Project Statistics Advanced](resources/demo/project_statistics_adv.gif)\n\n### Timekeeping \u0026 Timer\n\n![Timekeeping \u0026 Timer](resources/demo/timer.gif)\n\n## Hints\n\n- **Dark/Light Themes**: if you switch between dark and light themes, remember that you can provide specific colors for them via the `todo.colors.dark.*` and `todo.colors.light.*` settings, which will override the default `todo.colors.*` settings.\n\n- **Activity Bar**: you can switch the focus to the `Todo` activity bar view by assigning a shortcut to the `workbench.view.extension.todo` command.\n\n- **Icons**: icons can be used in `todo.statistics.statusbar.text`. [Here](https://octicons.github.com/) you can browse a list of supported icons. If for instance you click the first icon, you'll get a page with `.octicon-alert` written in it, to get the string to use simply remove the `.octicon-` part, so in this case the icon name would be `alert`.\n\n- **CLI**: you can view your embedded todos from the command line with the `todo` command if you install [ag](https://github.com/ggreer/the_silver_searcher) and add the following to your shell configuration file:\n\n```bash\nalias todo=\"ag --color-line-number '1;36' --color-path '1;36' --ignore-case --print-long-lines --silent '(?:\u003c!-- *)?(?:#|//|/\\*+|\u003c!--|--) *(TODO|FIXME|FIX|BUG|UGLY|HACK|NOTE|IDEA|REVIEW|DEBUG|OPTIMIZE)(?:\\([^(]+\\))?:?(?!\\w)(?: *--\u003e| *\\*/|(?= *(?:[^:]//|/\\*+|\u003c!--|@|--))|((?: +[^\\n@]*?)(?= *(?:[^:]//|/\\*+|\u003c!--|@|--))|(?: +[^@\\n]+)?))'\"\n```\n\n## Related\n\n- **[Highlight](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-highlight)**: I recommend using this extension for highlighting your embedded todos.\n\n- **[Markdown Todo](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-markdown-todo#overview)**: Manage todo lists inside markdown files with ease.\n\n- **[Projects+ Todo+](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-projects-plus-todo-plus)**: Bird's-eye view over your projects, view all your todo files aggregated into one.\n\n- **[Noty](https://github.com/fabiospampinato/noty)**: Autosaving sticky note with support for multiple notes, find/replace, programmers shortcuts and more. It implements a subset of the functionalities provided by this extension.\n\n- **[Notable](https://github.com/fabiospampinato/notable)**: The markdown-based note-taking app that doesn't suck.\n\n## Contributing\n\nIf you found a problem, or have a feature request, please open an [issue](https://github.com/fabiospampinato/vscode-todo-plus/issues) about it.\n\nIf you want to make a pull request you can debug the extension using [Debug Launcher](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-debug-launcher).\n\n## License\n\nMIT © Fabio Spampinato\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmpi-dev%2Fvscode-todo-plus-plus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbmpi-dev%2Fvscode-todo-plus-plus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmpi-dev%2Fvscode-todo-plus-plus/lists"}