bastibe / annotate.el

Annotate.el
Other
384 stars 20 forks source link

+OPTIONS: html-postamble:nil html-preamble:nil toc:nil

+AUTHOR:

+TITLE: Annotate.el

[[https://elpa.nongnu.org/nongnu/annotate.svg][https://elpa.nongnu.org/nongnu/annotate.svg]]

[[http://melpa.org/#/annotate][http://melpa.org/packages/annotate-badge.svg]]

[[http://stable.melpa.org/#/annotate][http://stable.melpa.org/packages/annotate-badge.svg]]

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. [[https://raw.githubusercontent.com/bastibe/annotate.el/master/example.png]]

** Quick start

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.

** Metadata

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.

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.

**** related customizable variable

*** Non centralized database

To use multiple database in the same Emacs session ~annotate-file~ should be made [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Buffer_002dLocal-Variables.html][buffer-local]],

see:

[[https://github.com/bastibe/annotate.el/issues/68][this thread]] and, in particular [[https://github.com/bastibe/annotate.el/issues/68#issuecomment-728218022][this message]].

Finally, if the customizable variable ~annotate-file-buffer-local~ is non-nil (default ~nil~), for each annotated file an annotation database is saved under the same directory that contains the annotated file.

The name of the annotation database is built concatenating the name of the annotated file without the optional extension and the string value bound to the customizable variable ~annotate-buffer-local-database-extension~ (default: ~notes~), example follows:

| annotated file | annotations file | |------------------+----------------------| | /home/user/foo.c | /home/user/foo.notes | |------------------+----------------------|

Important note: if ~/home/user/foo.notes~ exists, will be overwritten.

**** related customizable variable

*** Uninstalling

Users of [[https://github.com/emacscollective/no-littering][no-littering]] can take advantage of its packages generated files management.

** keybindings

*** ~C-c C-a~ (function annotate-annotate) 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.

With a numeric prefix the annotations will be displayed with the faces indicated in ~annotate-highlight-faces~ and ~annotate-annotation-text-faces~, respectively. The numeric prefix is used as index in the lists bound to the aforementioned variables.

The first theme can be addressed by the prefix ~1~, the second by the prefix ~2~ and so on.

**** related customizable variable

*** ~C-c C-d~ 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.

**** related customizable variable

*** ~C-c ]~ (function annotate-goto-next-annotation) Jump to the next annotation.

*** ~C-c [~ (function annotate-goto-previous-annotation) Jump to the previous annotation.

*** ~C-c C-s~ (function annotate-show-annotation-summary) 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.

**** related customizable variable

*** ~C-c C-c~ (function annotate-change-annotation-colors)

Change the color of the annotation below point (both higlight and annotation text colors are changed).

These changes are kept after the buffer is killed.

*** ~C-c C-p~ (function annotate-change-annotation-text-position)

Change the policy positioning the annotation below point, a message with the new policy is printed.

These changes are kept after the buffer is killed.

Annotations can be exported ~annotate-export-annotations~ as commented unified diffs, like this:

[[https://raw.githubusercontent.com/bastibe/annotate.el/master/diff-example.png]]

Alternatively, they can be integrated ~annotate-integrate-annotations~ as comments into the current buffer, like this:

[[https://raw.githubusercontent.com/bastibe/annotate.el/master/integrate-example.png]]

**** related customizable variable

An annotation database file can be imported using the command ~annotate-import-annotations~.

When importing, overlapping annotations will be merged in a single annotation with the new annotated text that maximizes the portion of text annotated, e.g.

+BEGIN_SRC

The quick brown fox ← text ^^^^^^^^ ← first annotation **** ← second annotation +++++++++++++ ← merged annotation

+END_SRC

The text of the merged annotation is the concatenated text of the two annotations.

Note that importing a database will modify permanently the file bound to the variable ~annotate-file~. If unsure of the results, backup that file before importing.

**** related customizable variable

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 [[https://github.com/bastibe/annotate.el/pull/81][this pull request]] for a couple of examples.

Moreover if ~annotate-use-echo-area~ and ~annotate-print-annotation-under-cursor~ value both non null, placing the cursor over an annotated text region will print the annotation's text in the minibuffer prefixed by the value of customizable variable ~annotate-print-annotation-under-cursor-prefix~, after a delay (in seconds) defined by the variable ~annotate-print-annotation-under-cursor-delay~.

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.

**** related customizable variable

** annotate-switch-db

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 [[https://github.com/bastibe/annotate.el/issues/68][this thread]] for a possible workflow where this command could be useful.

** annotate-toggle-annotation-text Shows or hides annotation's text under cursor.

** annotate-toggle-all-annotations-text Shows or hides the annotation's text in the whole buffer.

Please check ~M-x customize-group RET annotate~ as there is extensive documentation for each customizable variable.

** Known bugs

** Report bugs

To report bugs please, point your browser to the [[https://github.com/bastibe/annotate.el/issues][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:

+BEGIN_SRC text

[file-mask] [(and | or) [not] regex-note [(and | or) [not] regexp-note ...]]

+END_SRC

where:

** Examples

+BEGIN_SRC text

lisp$ and TODO

+END_SRC

matches the text ~TODO~ in all lisp files

Parenthesis can be used for the expression related to the text of annotation, like this:

+BEGIN_SRC text

lisp$ and (TODO or important)

+END_SRC

the same as above but checks also for string `important'

+BEGIN_SRC text

/home/foo/

+END_SRC

matches all the annotation that refers to file in the directory ~/home/foo~

+BEGIN_SRC text

/home/foo/ and not minor

+END_SRC

matches all the annotation that refers to file in the directory ~/home/foo~ and that not contains the text ~minor~.

+BEGIN_SRC text

.* and "not"

+END_SRC

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][LICENSE]]