• Stars
    star
    373
  • Rank 114,600 (Top 3 %)
  • Language
    Emacs Lisp
  • License
    Other
  • Created over 9 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Annotate.el

Annotate.el

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

http://melpa.org/packages/annotate-badge.svg

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

introduction

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

Usage

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

  • annotate-file
  • annotate-warn-if-hash-mismatch
  • annotate-database-confirm-deletion

Non centralized database

To use multiple database in the same Emacs session annotate-file should be made buffer-local, see: this thread and, in particular 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 fileannotations file
/home/user/foo.c/home/user/foo.notes

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

related customizable variable

  • annotate-file-buffer-local
  • annotate-buffer-local-database-extension

Uninstalling

Users of 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-endline-annotate-whole-line 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

  • annotate-annotation-column;
  • annotate-annotation-confirm-deletion;
  • annotate-annotation-max-size-not-place-new-line;
  • annotate-annotation-position-policy;
  • annotate-endline-annotate-whole-line;
  • annotate-annotation-text-faces.

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

  • annotate-annotation-confirm-deletion.

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

  • annotate-summary-ask-query.

Exporting

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

  • annotate-integrate-marker
  • annotate-diff-export-options
  • annotate-integrate-highlight
  • annotate-fallback-comment

Importing

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.

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

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

  • annotate-database-confirm-import.

Alternative visualization of annotations

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.

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-use-echo-area
  • annotate-print-annotation-under-cursor
  • annotate-print-annotation-under-cursor-prefix
  • annotate-print-annotation-under-cursor-delay
  • annotate-summary-of-file-from-current-pos.

Other commands

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 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.

More documentation

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

BUGS

Known bugs

  • 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 of annotate.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).

Report bugs

To report bugs please, point your browser to the issue tracker.

Query Language

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.

Examples

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).

FAQ

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.

LICENSE

This package is released under the MIT license, see file LICENSE

More Repositories

1

org-journal

A simple org-mode based journaling mode
Emacs Lisp
1,235
star
2

SoundCard

A Pure-Python Real-Time Audio Library
Python
641
star
3

python-soundfile

SoundFile is an audio library based on libsndfile, CFFI, and NumPy
Python
586
star
4

org-static-blog

A static site generator using org-mode
Emacs Lisp
304
star
5

lunatic-python

A two-way bridge between Python and Lua
C
300
star
6

Violinplot-Matlab

Violin Plots for Matlab
MATLAB
191
star
7

transplant

Transplant is an easy way of calling Matlab from Python
MATLAB
106
star
8

PySoundCard

PySoundCard is an audio library based on PortAudio, CFFI and NumPy
Python
85
star
9

simple-cython-limiter

A simple real-time limiter implemented using Python, Cython, Numpy and PyAudio
Python
44
star
10

WebGL-Spectrogram

A smoothly animated spectrogram display in WebGL (FFT in Python/Tornado)
JavaScript
40
star
11

libsndfile-binaries

Pre-compiled shared libraries for libsndfile
Shell
29
star
12

Fujifilm-Auto-Settings-for-Darktable

Automatically apply Fujifilm film simulation LUTs, crop, and DR correction when importing images in Darktable
Lua
28
star
13

twilight

A Circular Color Map
Python
22
star
14

MatlabCodeAnalyzer

A Code Style Checker and Analyzer for Matlab Code
MATLAB
21
star
15

MAPS-Scripts

A fundamental frequency estimation algorithm using features from the magnitude and phase spectrogram.
MATLAB
17
star
16

matlab-msgpack

msgpack.org[Matlab]
MATLAB
14
star
17

python-oscillator

See what your sound card is doing in real time
Python
13
star
18

Map-Matlab

Draws an OSM map on a Matlab axes.
MATLAB
12
star
19

PySoundFile

DEPRECATED version of SoundFile
Python
11
star
20

bastibe.github.com

This is the generated HTML and sources for my blog
HTML
10
star
21

RunForrest

Batch and run your code in parallel. Simply.
Python
10
star
22

Replication-Dataset-Scripts

Scripts for recreating the Replication Dataset for Fundamental Frequency Estimation. Part of the dissertation "Pitch of Voiced Speech in the Short-Time Fourier Transform". © 2020, Bastian Bechtold. All rights reserved.
Python
9
star
23

.emacs.d

Emacs Lisp
8
star
24

LUT-Maker

Python
8
star
25

jbof

Use Just a Bunch of Files as Datasets
Python
8
star
26

KDE-Media-Keys

Shell
6
star
27

MatlabXML

Read XML files in pure Matlab, because xmlread is too slow.
MATLAB
5
star
28

pomodoro-timer

A graphical timer for your Pomodoro workflow
4
star
29

MusicTagger

Python
4
star
30

Raspberry-Pi-Camera

Python
4
star
31

Dissertation-Website

The Companion Website to my Dissertation "Pitch of Voiced Speech in the Short-Time Fourier Transform: Algorithms, Ground Truths, and Evaluation Methods"
HTML
4
star
32

PinBoarder

Prettyfies Youtube links in Pinboard
Python
3
star
33

Speqtrogram

C++
3
star
34

meteogram

Grabbing weather data from the web and plotting a meteogram.
Python
3
star
35

pocoder

A vocoder implemented in Python
MATLAB
3
star
36

QtWorkshop

Example projects and documentation for a Qt Workshop
Python
3
star
37

Darktable-Film-Simulation-Panel

Lua
3
star
38

Consensus-Truth-Scripts

A new ground truth for speech corpora and fundamental frequency estimation, based on the consensus of multiple fundamental frequency estimation algorithms.
Python
3
star
39

timeup

Create Backups much like Time Machine, using rsync.
Python
2
star
40

org-journal-telegram-bot

Python
2
star
41

MatType

Test your typing skills in Matlab
MATLAB
2
star
42

MiniHUD

An X-Plane plugin that shows a small instrument panel for flying without seeing the cockpit
Lua
2
star
43

PythonSoundExperiment

Python
1
star
44

beegeewedding

HTML
1
star
45

MissionGeneratorSite

HTML
1
star
46

fish-config

My fish configuration
Shell
1
star
47

com1

just a test
1
star
48

vim

these are my vim settings
Vim Script
1
star
49

Photography-Analyzer

Crawl all your photos, and analyze your shooting habits
Python
1
star