This package provides a minor mode annotate-mode
, which can add
annotations to arbitrary files without changing the files
themselves. This is very useful for code reviews. When annotate-mode
is active, C-c C-a
will create, edit, or delete annotations.
With an active region, C-c C-a
creates a new annotation for that
region. With no active region, C-c C-a
will create an annotation for
the word under point. If point is on an annotated region, C-c C-a
will edit that annotation instead of creating a new one. Typing C-c
C-d
or clearing the annotation deletes them.
Use C-c ]
to jump to the next annotation and C-c [
to jump to the
previous annotation.
The current database for annotations is contained in the file
indicated by the variable annotate-file
(~/.emacs.d/annotations
by
default) but each user can change this value in a dynamic way using
the command annotate-switch-db
. This command will take care to
refresh/redraw all annotations in the buffers that uses
annotate-mode
.
The database holds the hash of each annotated file so it can print a warning if the file has been modified outside Emacs (for example).
Warning can be suppressed setting the variable
annotate-warn-if-hash-mismatch
to nil.
Please note that switching database, in this context, means rebinding
the aforementioned variable (annotate-file
). This means than no
more than a single database can be active for each Emacs session.
To use multiple database in the same Emacs session annotate-file
should be made
buffer-local,
see:
this thread and, in particular
this message.
If an empty annotation database (in memory) is saved the database
file is deleted instead, if annotate-database-confirm-deletion
is
non nil (the default) a confirmation action is asked to the user
before actually remove the file from the file system.
Users of no-littering can take advantage of its packages generated files management.
annotate-file
annotate-warn-if-hash-mismatch
annotate-database-confirm-deletion
Creates a new annotation for that
region. With no active region, C-c C-a
will create an annotation for
the word under point. If point is on an annotated region, C-c C-a
will edit that annotation instead of creating a new one. Clearing the
annotation deletes them.
If annotate-annotation-confirm-deletion
is non nil (the default
is nil) a confirmation action is asked, using y-or-n-p
, to the
user before actually remove the annotation.
If point is the newline character and the customizable variable
annotate-endline-annotate-whole-line
is not nil (default is non
nil) the whole line is annotated (or the next if the line is
empty).
If the line contains a single annotation that cover all the line annotating the newline Will ask to edit the annotation. If `annotate-endline-annotate-whole-line’ is nil annotating a newline will signal an error.
annotate-annotation-column
;annotate-annotation-confirm-deletion
;annotate-annotation-max-size-not-place-new-line
;annotate-annotation-position-policy
;annotate-annotation-secondary
;annotate-annotation
;annotate-endline-annotate-whole-line
;annotate-highlight-secondary
;annotate-highlight
.
Delete an annotation under point, if such annotation exists.
If annotate-annotation-confirm-deletion
is non nil (the default
is nil) a confirmation action is asked, using y-or-n-p
, to the
user before actually remove the annotation.
annotate-annotation-confirm-deletion
.
Jump to the next annotation.
Jump to the previous annotation.
Show summary window.
A window with a list of annotated files together with their
annotations is shown. If annotate-summary-ask-query
is non nil
(default is t
) then a prompt is shown where the user can insert
a query to filter the annotation database, see “Query Language”
below.
The summary window allow editing and removing of annotation using the provided buttons.
The annotation text can be pressed to and will open the annotated file, placing the cursor at the point where the corresponding annotated text appears.
annotate-summary-ask-query
.
Annotations can be exported annotate-export-annotations
as commented
unified diffs, like this:
Alternatively, they can be integrated annotate-integrate-annotations
as comments into the current buffer, like this:
annotate-integrate-marker
annotate-diff-export-options
annotate-integrate-highlight
annotate-fallback-comment
For typographically difficult scenarios (or just because you prefer it), such as variable-width fonts or overlay-heavy modes, the default visualization system that renders the annotation into the buffer could not properly works.
In this case the users can switch to a “pop-up” style annotation
setting to a non-nil value the variable annotate-use-echo-area
.
When such variable’s value is not null, moving the mouse pointer over the annotated text will temporary show the annotation.
The actual visuals of this “pop-up” can be different depending of your system’s setup (see this pull request for a couple of examples.
Another alternative way to show annotations is provided by the command:
annotate-summary-of-file-from-current-pos
.
Calling this command will show a summary window that prints all the annotations related to annotated text that appears (in the active buffer) beyond the current cursor position.
annotate-use-echo-area
This command will ask the user for a new annotation database files, load it and refresh all the annotations contained in each buffer where annotate minor mode is active.
See the docstring for more information and this thread for a possible workflow where this command could be useful.
Please check M-x customize-group RET annotate
as there is
extensive documentation for each customizable variable.
- Annotations in org-mode source blocks will be underlined, but the annotations don’t show up. This is likely a fundamental incompatibility with the way source blocks are highlighted and the way annotations are displayed.
- Because of a limitation in the Emacs display routines
scroll-down-line
could get stuck on a annotated line. So no fix can be provided by the authors ofannotate.el
, a possible workaround is to call the command with a numeric prefix equals to one plus the number of annotation text lines below the annotated text.For example:
foo bar baz annotation
needs a prefix of 2:
C-u 2 M-x scroll-down-line
But note that:
foo bar baz annotation
Needs no prefix.
- Deleting the first character of an annotated text will remove the annotation (this turned out to be useful, though).
To report bugs please, point your browser to the issue tracker.
The summary window can shows results filtered by criteria specified with a very simple query language, the basis syntax for that language is shown below:
[file-mask] [(and | or) [not] regex-note [(and | or) [not] regexp-note ...]]
where
- file-mask
- is a regular expression that should match the path of file the annotation refers to;
- and, or, not
- you guess? Classics logical operators;
- regex-note
- the text of annotation must match this regular expression.
lisp$ and TODO
matches the text TODO
in all lisp files
Parenthesis can be used for the expression related to the text of annotation, like this:
lisp$ and (TODO or important)
the same as above but checks also for string `important’
/home/foo/
matches all the annotation that refers to file in the directory
/home/foo
/home/foo/ and not minor
matches all the annotation that refers to file in the directory
/home/foo
and that not contains the text minor
.
.* and "not"
the quotation mark (“) can be used to escape strings.
As a shortcut, an empty query will match everything (just press
return
at prompt).
Sometimes the package does not respect the customizable variable’s value of
annotate-annotation-position-policy
, is this a bug?
No it is not, when a line which is using a non default font is
annotated the software force the :new-line
policy, that is the
annotation will be displayed on a new line regardless of the value
of the variable mentioned in the question.
This is necessary to prevent the annotation to be pushed beyond the window limits if an huge font is used by the annotated text.
This package is released under the MIT license, see file LICENSE