org-fm
org-fm
supports taking and exporting minutes in org-mode
files. org-fm
assumes a very simple but effective minutes format consisting of plain lists, where list items can be typed and assigned to participants using the dictionary notation of org-mode
lists.
Emacs screenshot:
Example of PDF export via LaTeX:
Installation
Usage
The basic list format
Minutes taken with org-fm
consist of one arbitrarily deeply embedded list, where the topmost level is an enumeration (1)
, 2)
, …).
org-fm
items have the following structure
1) (I:? <TIMESTAMP>? <NAMES>? <SEPARATOR>)? <CONTENT>
- (<TYPE>? <TIMESTAMP>? <NAMES>? <SEPARATOR>)? <CONTENT>
which means:
<TYPE>
is the type of the item. There is a choice of item types built in:<TYPE> description A:
,[ ]
action/agenda D:
,E:
decision/Entscheidung I:
information C:
,B:
consultation/Beratung N:
note AC:
,[X]
cleared <TIMESTAMP>
is an (inactive)org-timestamp
.<NAMES>
is a comma-separated list of participant names.<SEPARATOR>
can be::
or||
.- When
<TYPE>
,<TIMESTAMP>
or<NAMES>
are given, there also has to be a<SEPARATOR>
. - When
<NAMES>
but not<TYPE>
is given, the implicit type will beI:
(information).
Inline elements
org-fm
also provides two types of inline elements:
inline element | description |
---|---|
enclosed by ?: and :? | question about minutes |
enclosed by #: and :# | private comment |
Keywords
There is a number of special org-fm
keywords that are used during export:
keywords | description |
---|---|
#+MINUTES_TITLE: | title of the document; used as #+TITLE: |
#+MINUTES_EVENT: | name of the event |
#+MINUTES_PLACE: | place of the event |
#+MINUTES_DATE: | date of the event; used as #+DATE: |
#+MINUTES_AUTHOR: | name of minute taker; used as #+AUTHOR: |
#+MINUTES_CHAIR: | chair of the event |
#+MINUTES_DRAFT-TEXT: | text of the draft watermark |
#+MINUTES_PARTICIPANTS: | names of participants |
#+MINUTES_LANGUAGE: | language of minutes |
#+MINUTES_LATEX_STYLE: | name of \LaTeX style file |
#+MINUTES_OPTIONS: | used as #+OPTIONS: |
Participants can be included using the drawer :PARTICIPANTS-LIST:
which is assumed to contain exactly one list. The content of :PARTICIPANTS-LIST:
will overwrite #+MINUTES_PARTICIPANTS:
.
Automatic abbreviation expansion
org-fm
lets you easily define abbreviations of participant names that are expanded during export.
Within :PARTICIPANTS-LIST:
, abbreviations (and optionally expansions) can be specified in square brackets:
- [X] Susan Parker [SP=Sue] - [ ] Kim Miller [KM]
When no expansion is given, either the part preceding a comma (,) or the last word in the preceding name will be used.
One can mask abbreviations (and suppress their expansion) by prefixing it with ##
, which will be removed during expansion.
Example
See example.org.
Export
The export is triggered with org-fm-export
.
org-fm-export
will first copy the content of the org-mode
heading at point into a temporary buffer, perform a couple of replacements and then call org-export-dispatch
.
Timestamps
Items may contain an inactive org-timestamp
, which is located after <TYPE>
and before <NAMES>
:
- N: [2020-06-08 Mo 12:18] :: This is a note.
Timestamps can be inserted or updated with org-fm-add-or-update-timestamp
.
Timestamps are not exported with org-fm-export
except for the note type (N:
).
Plans
- [X] add easy way to include the time
- [X] add automatic expansion of abbreviations
- instad use links? https://en.wikibooks.org/wiki/LaTeX/Hyperlinks#Hyperlink_and_Hypertarget
- Full name is given in the link label.
- instad use links? https://en.wikibooks.org/wiki/LaTeX/Hyperlinks#Hyperlink_and_Hypertarget
- [ ] activate faces only in headings with minutes?
- [ ] check in and ckeck out participants
Ideas and Snippets
(org-narrow-to-element)
(choose-item)
(add-subitem-with-timestamp-etc)
(defun helm-org-fm-checkout-participant ()
""
(helm :sources (helm-build-in-buffer-source "org-fm participants"
:data (current-buffer)
:candidate-transformer (lambda (candidates)
(progn
(forward-line 1)
(beginning-of-line)
(cl-loop for c in candidates
when (string-match "^[[:blank:]]*-[[:blank:]]+\\[.\\].*" c)
collect c)))
:get-line #'buffer-substring)
:buffer "*helm org-fm*"))