This package displays keyword entries from source code comments and Org files in the Magit status buffer. Activating an item jumps to it in its file. By default, it uses keywords from hl-todo, minus a few (like NOTE
).
Items from Org files can be displayed, and can be fontified like in Org buffers:
Items can also be automatically grouped in a customizable way, which can be helpful in large repos:
This shows grouping items by the first path component, then keyword, then filename, and with optional keyword header fontification:
Items in KEYWORD(username):
format are also read:
Items specific to the current branch (or git diff
) can be displayed in a separate list:
One of the following external scanners is required:
- ripgrep
git grep
(built with PCRE support)- GNU
grep
(built with PCRE support)
Most Linux systems should have the latter two by default, but some non-standard systems may not. For example, on MacOS you may use Homebrew to install ripgrep
, or git
with PCRE support, like: brew reinstall --with-pcre2 git
.
If you installed from MELPA, you’re done!
Install these required packages:
async
dash
f
hl-todo
magit
pcre2el
s
Then put this file in your load-path
, and put this in your init file:
(require 'magit-todos)
Activate magit-todos-mode
. Then open a Magit status buffer, or run magit-todos-list
to show a dedicated to-do list buffer.
To activate magit-todos-mode
automatically, a recommended configuration for your init file is:
(use-package magit-todos
:after magit
:config (magit-todos-mode 1))
In Magit status buffer:
- j T
- Jump to the to-do list. If the section is empty (e.g. when using manual updates), it will scan for items.
With point in to-do list:
- b
- Show branch (
git diff
) to-do list. - B
- Set commit reference used in branch to-do list.
- j T
- When configured for manual updates, manually update the to-do list.
- j l
- Open dedicated to-do list buffer.
- RET
- Show item at point, or open dedicated buffer if point is on top heading.
- SPC
- Peek at the item at point.
magit-todos-mode
- Activate
magit-todos-mode
, which automatically inserts the to-do list in Magit status buffers. magit-todos-list
- Display the to-do list in a separate buffer. This also works outside of git repos.
Helm and Ivy are also supported. Note that the helm
and ivy
packages are not required, nor does this package depend on them; they are only used if present. Note as well that these commands can be used directly from source buffers, independently of Magit.
helm-magit-todos
- Display the project to-do list with Helm.
ivy-magit-todos
- Display the project to-do list with Ivy.
- Customize settings in the
magit-todos
group. - Use dir-local variables to set per-repository settings. For example, to exclude files and directories from being scanned for to-dos in a repo:
- From a buffer in the repo’s directory (like a
magit-status
buffer), run the commandadd-dir-local-variable
. - Choose the mode
magit-status-mode
. - Choose the variable
magit-todos-exclude-globs
. - Input the glob value, like
("*.html")
to exclude HTML files. (Note that the input is read as a lisp value, and this variable must be a list of strings.) - Now Emacs will remember that setting in that repository. (You may also want to commit the
.dir-locals.el
file to the repo.)
- From a buffer in the repo’s directory (like a
- The
magit-todos-list
command also works outside of git repos.
Remote repositories (i.e. ones accessed via TRAMP) are not automatically scanned for to-dos unless option magit-todos-update-remote
is enabled. Otherwise, a scan may be manually initiated with the command magit-todos-update
.
Note that if TRAMP can’t find the scanner configured in option magit-todos-scanner
, you may need to use directory-local variables to either add the correct path to variable tramp-remote-path
or choose a different scanner.
- The most common reason is that the items you’re expecting to see are not formatted as
magit-todos
expects. For example, a to-do item inmagit-todos.el
looks like;; TODO: Foo bar.
: it starts with the comment delimiter and whitespace, followed by a keyword (see optionsmagit-todos-keywords
andmagit-todos-ignored-keywords
), then a colon (see optionmagit-todos-keyword-suffix
). Items not formatted according to howmagit-todos
is configured won’t be matched and shown. - Other options also affect what is shown, e.g.
magit-todos-filename-filter
andmagit-todos-exclude-globs
. SeeM-x customize-group RET magit-todos RET
for all options.
Nothing new yet.
Additions
- Branch-specific TODOs are also cached (to avoid rescanning when automatic updates are disabled. This can improve performance in large repos).
- Option
magit-todos-upate-remote
allows automatic scanning in remote repositories. (#157. Thanks to Angus Gratton.)
Changes
- Remote repositories are no longer automatically scanned (see new option
magit-todos-update-remote
). - Option
magit-todos-keyword-suffix
defaults to allowing suffixes to be enclosed by parentheses or brackets (rather than just parentheses). - Minor improvements to warnings about files containing very long lines: display as messages instead of warnings, and signal errors from outside the process sentinel.
Removals
- Obsolete option
magit-todos-insert-at
, replaced by optionmagit-todos-insert-after
. (Scheduled for removal since v1.6.)
Fixes
- Disable external diff drivers when calling
git diff
. (#174. Thanks to Aaron Zeng.) - The branch diff scanner was incorrectly treated as a fallback scanner. (See #186. Thanks to Karl Hallsby for reporting.)
Compatibility
- Update test for
git-grep
scanner compatibility for newer versions of Git. (See #186. Thanks to Karl Hallsby.)
Documentation
- Added FAQ section.
Fixes
- Don’t set parent keymap. (#173. Thanks to Aaron Zeng.)
Fixes
- Don’t run branch scanner on a branch without a merge base relative to the main branch. (#153. Thanks to Yukari Hafner for reporting.)
- Keymap parent in status buffer’s to-do section. (#143. Thanks to Matthias Paulmier.)
Changed
- Improve behavior when scanner backend exits with an error. (Now an error is signaled and the command’s output is shown.)
- Option
magit-todos-branch-list-merge-base-ref
defaults to nil, which automatically detects the default branch name using functionmagit-main-branch
. (#151. Thanks to Aaron Zeng for reporting.)
Fixed
- Updated
find|grep
scanner for newer versions of GNUfind
that interpret some arguments differently. (Tested on v4.8.0.) - Prevent leading
./
in filenames when used withrg
scanner. (#148. Thanks to Michal Sojka for reporting.)
- Emacs 26.1 or later is now required.
Added
- Option
magit-todos-submodule-list
controls whether to-dos in submodules are displayed (default: off). (Thanks to Matsievskiy S.V.) - Option
magit-todos-insert-after
, which replacesmagit-todos-insert-at
. (The new option is more flexible, and it is automatically set from the old one’s value.) - Option
magit-todos-filename-filter
, which can be used to shorten filenames. (Thanks to Matsievskiy S.V.)
Changed
- Option
magit-todos-exclude-globs
now excludes the `.git/` directory by default. (Thanks to Amorymeltzer.) - Library
org
is no longer loaded automatically, but only when needed. (This can reduce load time, especially if the user’s Org configuration is complex.) (#120. Thanks to Martin Edström and Johnny Sigman for suggesting.)
Fixed
- Regexp overflow error for very long lines. (#131. Thanks to Laurence Warne.)
- Option
magit-todos-group-by
respects buffer- and directory-local settings. - Insertion of blank lines between expanded sections.
- Section insertion position at top of buffer and when chosen section doesn’t exist. (#139. Thanks to Sascha Lüdecke for reporting.)
Removed
- Option
magit-todos-insert-at
, replaced bymagit-todos-insert-after
. (The old option will be removed in v1.8; customizations of it should be removed.)
Internal
- Define jumper keys using a Transient suffix.
- Use new git-testing function in Magit for remote directories. (#126. Thanks to Max Hollmann.)
Fixes
- Remove face from indentation. (Thanks to Alexander Miller.)
Fixes
- Use
magit-todos-exclude-globs
in branch todo list.
Fixes
- Add insertion function to end of
magit-status-sections-hook
.
Added
- Support for remote repositories accessed via TRAMP. See usage notes.
- Ivy history support. (Thanks to Brian Leung.)
- Option
magit-todos-branch-list-merge-base-ref
. - Command
magit-todos-branch-list-set-commit
, bound toB
with point in a to-do section.
Changed
- Branch todo list now uses
git merge-base
to determine the ancestor commit to compare toHEAD
. - Enable list-wide key bindings on both headings and to-do items.
Removed
- Option
magit-todos-branch-list-commit-ref
, replaced by optionmagit-todos-branch-list-merge-base-ref
.
Fixed
- Don’t use
--help
option when testinggit grep
command, because it can launch a Web browser on some configurations or platforms (see #43). - Caching when branch diff list is displayed.
- Commands
magit-section-forward
/backward
sometimes skipped sections (see #66).
Fixed
- Refreshing
magit-todos-list
buffer. (#92. Thanks to Oleksii Filonenko and Henrik Lissner for reporting.)
Fixed
- Compiler warning.
Added
- Commands
helm-magit-todos
andivy-magit-todos
, which display items with Helm and Ivy. (Note that Helm and Ivy are not required, nor does this package depend on them; they are only used if present.)
Fixed
- Warn about files containing lines too long for Emacs’s regexp matcher to handle, rather than aborting the scan (#63).
Updated
- Use
magit-setup-buffer
instead ofmagit-mode-setup
.
Internal
- Add synchronous mode to scanner functions, which return results directly usable by other code.
Added
- Branch diff task list. See new options
magit-todos-branch-list
andmagit-todos-branch-list-commit-ref
, and commandmagit-todos-branch-list-toggle
, bound tob
with point on to-do list heading. (#30, #77, #82. Thanks to Itamar Turner-Trauring and Arron Mabrey for the suggestion, and to Sébastien Maret for implementing the commit-ref option.)
Internal
- Put newline in section headings. (#68. Thanks to Sean Allred.)
Added
- Allow
magit-todos-list
to work outside git repos. - Option
magit-todos-keyword-suffix
replacesmagit-todos-require-colon
, allowing for common and custom suffixes after item keywords (e.g. to match items likeTODO(user):
). (Fixes #56. Thanks to Lowe Thiderman for suggesting.) - Optionally group and sort by item suffixes (e.g. handy when suffixes contain usernames).
- Bind RET on top-level
TODOs
section heading tomagit-todos-list
command.
Fixed
- Don’t fontify section item counts. (Thanks to Marcin Swieczkowski.)
Worked Around
- Issue in
async
regarding deleted buffers/processes. This is not an ideal solution, but it solves the problem for now.
Removed
- Option
magit-todos-require-colon
, replaced bymagit-todos-keyword-suffix
.
Fixed
- Properly unbind key when mode is disabled. (#74. Thanks to Akira Komamura.)
- Don’t show message when key is already bound correctly. (#75. Thanks to Akira Komamura.)
Fixed
- Disable undo in hidden Org fontification buffer.
- Expand top-level to-do list in
magit-todos-list
buffer.
Fixed
- Insert root section in
magit-todos-list
command. (Really fixes #55. Thanks to Jonas Bernoulli.)
Fixed
- Hide process buffers. (Thanks to Steve Purcell.)
Fixes
magit-todos-depth
number-to-string conversion.
Fixes
- Update
magit-todos-list
for Magit change. (Fixes #55. Thanks to Matteo Lisotto.)
Fixes
- Convert
magit-todos-depth
setting appropriately forrg
scanner.
Fixes
- Ensure mode is activated in
magit-todos-update
command. (Fixes #54. Thanks to Sebastien Maret.)
Additions
- Dedicated to-do list buffer.
- Option
magit-todos-exclude-globs
, a list of glob patterns to ignore when searching for to-do items. - Kill running scans when Magit status buffer is closed.
Changes
- Remove dependency on
a
. - Remove dependency on
anaphora
.
Fixes
- Add missing
cl-
prefix. Thanks to Jelle Licht.
Fixes
- Fix
find|grep
scanner (issue 46). Thanks to Pierre Neidhardt.
Fixes
- Define variables earlier to avoid compiler warnings.
- Remove unused var
magit-todos-ignore-file-suffixes
.
Fixes
regexp-quote
item keywords when jumping to an item. (Fixes #36. Thanks to Derek Feichtinger.)- Ensure
grep
supports--perl-regexp
. - Warn when unable to find a suitable scanner (i.e.
rg
, or a PCRE-compatible version ofgit
orgrep
).
Fixes
- Test whether
git grep
supports--perl-regexp
by checking its--help
output, rather than doing a search and checking for an error. message
instead oferror
for weird behavior. (This message exists to help track down an inconsequential bug.)- Remove unused
magit-todos-ignore-directories
option. (To be replaced in a future release.)
Initial release.
- This package was inspired by magit-org-todos.
- The
ag
support was made much simpler by the great pcre2el package by Jon Oddie. - Thanks to Jiangbin Zhao for his extensive testing and feedback.
GPLv3