- What is this?
- Example workflow
- Example blocks
- Contributions
- Releases
- Installation
- Updater functions
- Dynamic blocks
- Templates
- Minor mode
- Variables
- Faces
- Authors
- License
om-dash implements dynamic blocks for org-mode that you can use to compose a custom project dashboard.
It was always a struggle to me to keep track of the “big picture” when I’m hopping between projects.
I wanted a tool that can give me a brief summary of all ongoing projects: what’s done, what’s next, and what requires attention. And then I realized that it can be easily implemented using org-mode, so here we go.
om-dash implementats a few configurable dynamic blocks:
om-dash-github- generates a table with issues or pull requests from github repositoryom-dash-orgfile- generates tables with top-level entries from an org fileom-dash-imap- generates table with unread email counters for IMAP folderom-dash-command- generates a table from JSON or CSV output of a shell commandom-dash-function- generates a table from output of a Elisp function
The package also provides a minor mode (om-dash-mode) that applies highlighting to the generated tables.
In addition, there is support for templates, which allow to create reusable parameterized configurations of the above blocks (e.g. for specific github query or shell command).
Here I describe my own workflow. Yours can be different of course, but I think this should give the basic idea about this package.
For every project, I have three main sources of “things” to keep track of:
- github repository with issues and pull requests
- personal org file with tasks grouped into some kind of milestones (usually releases)
- a few IMAP directories with email related to this project (mailing lists, notifications, discussions)
On top of that, I have a file called “dashboard.org” with a top-level entry for every project, and a few second-level entries with om-dash dynamic blocks:
- a block with all open or recently merged pull requests from github
- another block with open github issues (for big projects, I display only issues from specific column of github kanban board, or from specific milestone)
- one block for every ongoing or upcoming milestone from my personal org file for this project, showing top level tasks from each milestone
- block with project’s IMAP directories and unread email counters
Screenshot of a project from “dashboard.org” described above:
Display all open pull requests and pull requests closed last month.
#+BEGIN: om-dash-github :repo "roc-streaming/roc-toolkit" :type pullreq :open "*" :closed "-1mo" ... #+END:
Display all open issues with “user report” label and without assignee.
#+BEGIN: om-dash-github :repo "roc-streaming/roc-toolkit" :type issue :open (:assignee "-" :label "user report") ... #+END:
Display all open issues added to github project with id 5, from columns “In work” and “On hold”.
#+BEGIN: om-dash-github :repo "roc-streaming/roc-toolkit" :type issue :open (:project 5 :project-status ("In work" "On hold"))
...
#+END:
Display 1-level TODO tasks as tables with their child 2-level TODO tasks as table rows. Hide 1-level DONE tasks. Hide tasks with category “note”.
#+BEGIN: om-dash-orgfile :file "~/cloud/org/roc-toolkit.org" :query (:todo-depth 2 :done-depth 0 :no-category "note") ... #+END:
Display new and unread email counters for IMAP directory tree.
(setq om-dash-imap-host "imap.example.com"
;; Optional, if unset, default is used
om-dash-imap-port 143
;; Optional, if unset, read from ~/.authinfo
om-dash-imap-user "john"
om-dash-imap-password "secret"
;; Optional, if unset, auto-detected for server
om-dash-imap-stream 'network
om-dash-imap-auth 'login)
#+BEGIN: om-dash-imap :folder "develop/roc" ... #+END:
Display table generated by a shell command.
#+BEGIN: om-dash-command :command "my-command arg1 arg2" :format json :columns ("foo" "bar")
...
#+END:
This example assumes that my-command produces output in JSON format like this:
[
{ "foo": "DONE", "bar": "some text" },
{ "foo": "TODO", "bar": "more text" }
]
It is often convenient to create a template for the command, for example:
(defun my-command-template (params)
(let ((args (plist-get params :my-args)))
(list :headline (format "my command (%s)" args)
:command (format "my-command %s" args)
:columns '("foo" "bar"))))
(add-to-list 'om-dash-templates
'(my-command . my-command-template))
Then you can use it like this:
#+BEGIN: om-dash-command :template my-command :my-args "arg1 arg2" ... #+END:
Display table generated by a Elisp function.
#+BEGIN: om-dash-function :func my-function ... #+END:
The function should return table(s) in plist format to be displayed:
(defun my-function ()
;; list of tables
(list
;; table (plist)
(list :columns '("state" "title")
:data '(("DONE" "some title")
("WIP" "another title")
("TODO" "yet another"))
:keyword "PLANNING"
:headline "example table")))
So far I’ve implemented only things that I needed for my own workflow, plus some reasonable customization. I have quite limited time for this project, so if you would like to extend it for your workflow, pull requests are very welcome!
Also, as I’ve never created elisp packages before, I probably missed some conventions or best practices. Again, patches are welcome.
Changelog file can be found here: changelog.
Required external tools:
To access private repos on github, follow official instructions.
Elisp dependencies:
Package was tested on Emacs 28.2 on Linux.
Instructions for straight.el:
;; required dependencies
(straight-use-package 'org-ql)
(straight-use-package 's)
(straight-use-package 'ts)
;; optional dependencies
(straight-use-package
'(el-csv
:type git
:host github
:repo "mrc/el-csv"
:branch "master"
:files ("parse-csv.el")))
;; om-dash
(straight-use-package
'(om-dash
:type git
:host github
:repo "gavv/om-dash"
:branch "main"
:files ("om-dash.el")))
The following functions can be used to update dynamic blocks (of any kind) in current document. You can bind them to org-mode-map or om-dash-mode-map.
Update all dynamic blocks in the buffer. This function can be used in a hook.
User command for updating dynamic blocks. Update the dynamic block at point. With prefix ARG, update all dynamic blocks in the buffer.
(fn &optional ARG)
Update all dynamic blocks in current tree, starting from top-level entry.
E.g., for the following document:
* 1. ---o ** 1.1 <- cursor | *** 1.1.1 | [tree] *** 1.1.2 | ** 1.2 ---o * 2. ** 2.1
the function updates all blocks inside 1., 1.1, 1.1.1, 1.1.2, 1.2.
Update all dynamic blocks in current subtree, starting from current entry.
E.g., for the following document:
* 1. ** 1.1 <- cursor --o *** 1.1.1 | [subtree] *** 1.1.2 --o ** 1.2 * 2. ** 2.1
the function updates all blocks inside 1.1, 1.1.1, 1.1.2.
This section lists dynamic blocks implemented by om-dash. Each block named om-dash-xxx corresponds to a function named org-dblock-write:om-dash-xxx.
Builds org heading with a table of github issues or pull requests.
Basic example:
#+BEGIN: om-dash-github :repo "owner/repo" :type issue :open "*" :closed "-1w" ... #+END:
More complicated query using simple syntax:
#+BEGIN: om-dash-github :repo "owner/repo" :type pullreq :open (:milestone "1.2.3" :label "blocker" :no-label "triage") ... #+END:
Same query but by providing github search query and jq selector:
#+BEGIN: om-dash-github :repo "owner/repo" :type pullreq :open ("milestone:1.2.3 label:blocker" ".labels | (.name == \"triage\") | not")
...
#+END:
Parameters:
| parameter | default | description |
|---|---|---|
| :repo | required | github repo in form “<owner>/<repo>” |
| :type | required | topic type (issue, pullreq, any) |
| :any | see below | query for topics in any state |
| :open | see below | query for topics in open state |
| :closed | see below | query for topics in closed state |
| :sort | “createdAt” | sort results by given field |
| :fields | om-dash-github-fields | explicitly specify list of fields |
| :limit | om-dash-github-limit | limit number of results |
| :columns | om-dash-github-columns | list of columns to display |
| :keyword | auto | keyword for generated org heading |
| :headline | auto | text for generated org heading |
| :heading-level | auto | level for generated org heading |
Parameters :any, :open, and :closed define QUERY for topics in corresponding
states. You should specify either :any or :open and/or :close. Not specifying
anything is equavalent to :open “*”.
QUERY can have one of the following forms:
- plist: om-dash
SIMPLE-QUERY, e.g.: (:milestone “1.2.3” :no-author “bob”) - string: standard or extended
GITHUB-QUERY, e.g.: “milestone:1.2.3” “*” “-1w” - list: two-element list with
GITHUB-QUERYandJQ-SELECTORstrings, e.g.: (“milestone:1.2.3” “.author.login != “bob”)
You can specify different queries for :open and :closed topics, e.g. to show all
open issues but only recently closed issues, use:
:open "*" :closed "-1mo"
Or you can use a single query regardless of topic state:
:any "-1mo"
SIMPLE-QUERY format is a convenient way to build queries for some typical
use cases. The query should be a plist with the following properties:
| property | description |
|---|---|
| :milestone | include only topics with any of given milestone(s) |
| :no-milestone | exclude topics with any of given milestone(s) |
| :label | include only topics with any of given label(s) |
| :every-label | include only topics with all of given label(s) |
| :no-label | exclude topics with any of given label(s) |
| :author | include only topics with any of given author(s) |
| :no-author | exclude topics with any of given author(s) |
| :assignee | include only topics with any of given assignee(s) |
| :no-assignee | exclude topics with any of given assignee(s) |
| :reviewer | include only topics with any of given reviewer(s) |
| :no-reviewer | exclude topics with any of given reviewer(s) |
| :review-status | include only topics with any of given review status(es) |
| :no-review-status | exclude topics with any of given review status(es) |
| :project | include only topics added to given project |
| :project-type | choose between v2 and classic project |
| :project-status | include only topics with any of given project status(es) |
| :no-project-status | exclude topics with any of given project status(es) |
| :created-at | include only topics created within given date range |
| :updated-at | include only topics updated within given date range |
| :closed-at | include only topics closed within given date range |
| :merged-at | include only topics merged within given date range |
All properties are optional (but at least one should be provided). Multiple properties are ANDed, e.g. (:author “bob” :label “bug”) matches topics with author “bob” AND label “bug”. Most properties support list form, in which case its elements are ORed. E.g. (:author (“bob” “alice”) :label “bug”) matches topics with label “bug” AND author either “bob” OR “alice”.
:milestone, :label, :author, :assignee, and :reviewer properties, as
well as their :no-xxx counterparts, can be either a string (to match one value)
or a list of strings (to match any value from the list). Two special values are
supported: “*” matches if corresponding property (e.g. assignee) is non-empty,
and “-” matches if the property unset/empty.
Examples:
:author "bob"
:assignee "-"
:no-label ("refactoring" "documentation")
:every-label is similar to :label, but it matches topics that have all of
the labels from the list, instead of any label from list.
:review-status property can be a symbol or a list of symbols
(to match any status from the list).
Supported values:
| status | description |
|---|---|
| undecided | review not required, not requested, there’re no approvals or rejects |
| required | review is required by repo rules |
| requested | review is explicitly requested |
| commented | some reviewers commented without approval or rejection |
| approved | all reviewers either approved or commented, and at least one approved |
| rejected | some reviewers requested changes or dismissed review |
Examples:
:review-status (required requested) :review-status approved :no-review-status (approved rejected commented)
GitHub review state model is complicated. These statuses is an attempt to provide a simplified view of the review state for most common needs.
Note that not all statuses are mutually exclusive, in particular required can
co-exist with any status except undecided, and commented can co-exist with
any other status. You can match multiple statuses by providing a list.
:project defines numeric identifier of the v2 or classic github project (you can
see identifier in the url). By default, v2 is assumed, but you can change type
using :project-type property.
:project-status can be a string or a list of strings. For v2 projects, it matches
“status” field of the project item, which corresponds to column name if board view of
the project. For classic projects, it matches “column” property of the project card.
Examples:
:project 5 :project-status "In work"
:project 2 :project-type classic :project-status ("Backlog" "On hold")
:created-at, :updated-at, :closed-at, :merged-at can have one of this forms:
- “TIMESTAMP”
- (> “TIMESTAMP”)
- (>= “TIMESTAMP”)
- (< “TIMESTAMP”)
- (<= “TIMESTAMP”)
- (range “TIMESTAMP” “TIMESTAMP”)
Supported TIMESTAMP formats:
| format | description |
|---|---|
| “2024-02-20” | date |
| “2024-02-20T15:59:59Z” | utc date and time |
| “2024-02-20T15:59:79+00:00” | date and time with timezone |
| “-10d” | 10 days before today |
| “-10w” | 10 weeks before today |
| “-10mo” | 10 months before today |
| “-10y” | 10 years before today |
Examples:
:created-at "2024-02-20" :updated-at (>= "-3mo")
GITHUB-QUERY is a string using github search syntax:
https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests
Besides standard syntax, a few extended forms are supported for github query:
| form | description |
|---|---|
| ”*” | match all topics |
| “-123d” | match if topic was updated during last 123 days |
| “-123w” | same, but weeks |
| “-123mo” | same, but months |
| “-123y“ | same, but years |
JQ-SELECTOR is an optional selector to filter results using jq command:
https://jqlang.github.io/jq/
Under the hood, this block uses combination of gh and jq commands like:
gh -R <repo> issue list \
--json <fields> --search <github query> --limit <limit> \
| jq '[.[] | select(<jq selector>)]'
Exact commands being executed are printed to *om-dash* buffer
if om-dash-verbose is set.
By default, github query uses all fields from om-dash-github-fields, plus any
field from om-dash-github-auto-enabled-fields if it’s present in jq selector.
The latter allows to exclude fields that makes queries slower, when they’re
not used. To change this, you can specify :fields parameter explicitly.
Builds org headings with tables based on another org file.
Basic usage:
#+BEGIN: om-dash-orgfile :file "~/my/file.org" :query (:todo-depth 2 :done-depth 1) ... #+END:
Custom org-ql query:
#+BEGIN: om-dash-orgfile :file "~/my/file.org" :query (todo "SOMEDAY") ... #+END:
Parameters:
| parameter | default | description |
|---|---|---|
| :file | required | path to .org file |
| :query | (:todo-depth 2 :done-depth 1) | query for org entries |
| :digest | nil | generate single table with all entries |
| :columns | om-dash-orgfile-columns | list of columns to display |
| :keyword | auto | keyword for generated org headings |
| :headline | auto | text for generated org headings |
| :heading-level | auto | level for generated org headings |
By default, this block generates an org heading with a table for every
top-level (i.e. level-1) org heading in specified :file, with nested
headings represented as table rows.
If :digest is t, a single table with all entries is generated instead.
:query defines what entries to retrieve from org file and add to table.
It should have one of the following forms:
- plist: om-dash
SIMPLE-QUERY, e.g. (:todo-depth 2 :done-depth 1) - list:
ORG-QLsexp query, e.g. (todo “SOMEDAY”) - string:
ORG-QLstring query, e.g. “todo:SOMEDAY”
SIMPLE-QUERY format is a convenient way to build queries for some typical
use cases. The query should be a plist with the following properties:
| property | default | description |
|---|---|---|
| :todo-depth | 2 | nesting level for “todo” entries |
| :done-depth | 1 | nesting level for “done” entries |
| :category | nil | include only entries with any of given category(ies) |
| :no-category | nil | exclide entries with any of given category(ies) |
| :priority | nil | include only entries with any of given priority(ies) |
| :no-priority | nil | exclide entries with any of given priority(ies) |
| :tag | nil | include only entries with any of given tag(s) |
| :every-tag | nil | include only entries with all of given tag(s) |
| :no-tag | nil | exclide entries with any of given tag(s) |
| :blocked | any | whether to include blocked entries |
| :habit | any | whether to include habit entries |
Properties :todo-depth and :done-depth limit how deep the tree is
traversed for top-level headings in “todo” and “done” states.
For example:
- if
:todo-depthis 0, then level-1 headings in “todo” state are not shown at all - if
:todo-depthis 1, then level-1 headings in “todo” state are shown “collapsed”, i.e. org heading is generated, but without table - if
:todo-depthis 2, then level-1 headings in “todo” state are shown and each has a table with its level-2 children - if
:todo-depthis 3, then level-1 headings in “todo” state are shown and each has a table with its level-2 and level-3 children
…and so on. Same applies to :done-depth parameter.
Whether a keyword is considered as “todo” or “done” is defined by
variables om-dash-todo-keywords and om-dash-done-keywords.
By default they are automatically populated from org-todo-keywords-1
and org-done-keywords, but you can set them to your own values.
:category, :priority, and :tag properties, as well as their :no-xxx
counterparts, can be either a string (to match one value) or a list of strings
(to match any value from the list).
Examples:
:priority "A"
:no-tag ("wip" "stuck")
:every-tag is similar to :tag, but it matches entries that have all of
the tags from the list, instead of any tag from list.
:blocked and :habit properties should be one of the three symbols: any
(ignore type), yes (include only entries of this type), no (exclude entries).
For ORG-QL sexp and string queries, see here:
https://github.com/alphapapa/org-ql?tab=readme-ov-file#queries
:headline parameter defines text for org headings which contains
tables. If :digest is t, there is only one table and :headline
is just a string. Otherwise, there are many tables, and :headline
is a format string where ‘%s’ can be used for entry title.
Builds org heading with a table of IMAP folder(s) and their unread mail counters.
Usage example:
#+BEGIN: om-dash-imap :folder "foo/bar" ... #+END:
Custom config:
#+BEGIN: om-dash-imap :folder "foo/bar" :server (:host "example.com" :user "john" :password "secret") ... #+END:
| parameter | default | description |
|---|---|---|
| :server | om-dash-imap-default-server | server connection config |
| :columns | om-dash-imap-columns | list of columns to display |
| :keyword | auto | keyword for generated org heading |
| :headline | auto | text for generated org heading |
| :heading-level | auto | level for generated org heading |
:server defines IMAP connection parameters. It must be a plist which can have
the following properties:
| property | default | description |
|---|---|---|
| :host | required | IMAP server hostmame |
| :port | auto | IMAP server port |
| :machine | same as :host | machine name in ~/.authinfo |
| :user | match in ~/.authinfo by :machine | IMAP username |
| :password | match in ~/.authinfo by :machine | IMAP password |
| :stream | auto | STREAM arg for imap-open |
| :auth | auto | AUTH arg for imap-open |
If you omit :server, or some of the properties, their values are substituted with
the corresponding fields from om-dash-imap-default-server, when present.
:host and :port define IMAP server address.
Host must be always set, either via :server or om-dash-imap-default-server.
Port is optional, default value depends on :auth method.
:user and :password define IMAP credentials.
If not set, om-dash-imap will find them in ~/.authinfo by matching by :machine
property. If :machine isn’t set, :host value is used for matching.
:stream and :auth may be used to force imap-open to use specific
connection and authentification types. For example, you can use network
and login values to force plain-text unencrypted password.
Builds org heading with a table from output of a shell command.
Usage example:
#+BEGIN: om-dash-command :command "curl -s https://api.github.com/users/octocat/repos" :format json :columns ("name" "forks_count")
...
#+END:
| parameter | default | description |
|---|---|---|
| :command | required | shell command to run |
| :columns | required | column names (list of strings) |
| :format | json | command output format (json or csv) |
| :keyword | auto | keyword for generated org heading |
| :headline | auto | text for generated org heading |
| :heading-level | auto | level for generated org heading |
If :format is json, command output should be a JSON array of
JSON objects, which have a value for every key from :columns.
If :format is csv, command output should be CSV. First column
of CSV becomes value of first column from :columns, and so on.
Note: using CSV format requires installing parse-csv package
from https://github.com/mrc/el-csv
Builds org heading with a table from output of a elisp function.
Usage example:
#+BEGIN: om-dash-function :func example-func ... #+END:
| parameter | default | description |
|---|---|---|
| :func | required | elisp function to call |
| :args | nil | optional function arguments |
| :columns | nil | list of columns to display |
| :keyword | nil | keyword for generated org heading |
| :headline | nil | text for generated org heading |
| :heading-level | nil | level for generated org heading |
The function should return a list of tables, where each table is
a plist with the following properties:
| property | default | description |
|---|---|---|
| :columns | required | list of column names (strings) |
| :data | required | list of rows, where row is a list of cells (strings) |
| :keyword | “TODO” | keyword for generated org heading |
| :headline | auto | text for generated org heading |
| :heading-level | auto | level for generated org heading |
Every property returned from function, except :data, may be overwritten by a block
parameter with the same name, if it is provided.
Example function that returns a single 2x2 table:
(defun example-func ()
;; list of tables
(list
;; table plist
(list :columns '("foo" "bar")
:data '(("a" "b")
("c" "d"))
:keyword "TODO"
:headline "example table")))
This section lists built-in templates provided by om-dash. You can define your own templates via om-dash-templates variable.
This template is OBSOLETE.
Use om-dash-github with :milestone query instead.
This template is OBSOLETE.
Use om-dash-github with :project-status query instead.
Om-dash minor mode.
This minor mode for .org files enables additional highlighting inside org tables generated by om-dash dynamic blocks.
Things that are highlighted:
- table header and cell (text and background)
- org mode keywords
- issue or pull request state, number, author, etc.
- tags
After editing keywords list, you need to reactivate minor mode for changes to take effect.
To activate this mode automatically for specific files, you can use local variables, e.g. add this to the end of the file:
# Local Variables: # eval: (om-dash-mode 1) # End:
This is a minor mode. If called interactively, toggle the ‘OM-Dash mode’ mode. If the prefix argument is positive, enable the mode, and if it is zero or negative, disable the mode.
If called from Lisp, toggle the mode if ARG is toggle. Enable
the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number.
To check whether the minor mode is enabled in the current buffer,
evaluate om-dash-mode.
The mode’s hook is called both when the mode is enabled and when it is disabled.
List of keywords considered as “todo”.
If block has any of the “todo” keywords, block state is considered “todo”. The first element from this list is used as block’s heading keyword.
If a keyword from this list doesn’t have a face in om-dash-keyword-faces,
it uses standard face for TODO keyword.
When nil, filled automatically from org-todo-keywords, org-done-keywords,
and pre-defined keywords for github, imap, etc.
Variable type:
(choice (const :tag "Auto" nil) (repeat string))
Default value:
nil
Introduced in version:
- 0.1
List of keywords considered as “done”.
If block has only “done” keywords, block state is considered “done”. The first element from this list is used as block’s heading keyword.
If a keyword from this list doesn’t have a face in om-dash-keyword-faces,
it uses standard face for DONE keyword.
When nil, filled automatically from org-todo-keywords, org-done-keywords,
and pre-defined keywords for github, imap, etc.
Variable type:
(choice (const :tag "Auto" nil) (repeat string))
Default value:
nil
Introduced in version:
- 0.1
Assoc list to map keywords to faces.
If some keyword is not mapped to a face explicitly, default face is selected,
using face for TODO or DONE depending on whether that keyword is in
om-dash-todo-keywords or om-dash-done-keywords.
Variable type:
(alist :key-type
(string :tag "Keyword")
:value-type
(symbol :tag "Face"))
Default value:
'(
;; org-mode
("TODO" . om-dash-todo-keyword)
("DONE" . om-dash-done-keyword)
;; github
("OPEN" . om-dash-open-keyword)
("MERGED" . om-dash-merged-keyword)
("CLOSED" . om-dash-closed-keyword)
;; imap
("NEW" . om-dash-new-keyword)
("UNREAD" . om-dash-unread-keyword)
("CLEAN" . om-dash-clean-keyword)
;;
)
Introduced in version:
- 0.1
Assoc list to remap or unmap tag names.
Defines how tags are displayed in table. You can map tag name to a different string or to nil to hide it.
Variable type:
(choice
(const :tag "None" nil)
(alist :key-type
(string :tag "Tag")
:value-type
(choice
(string :tag "Mapped Name")
(const :tag "Hide" nil))))
Default value:
nil
Introduced in version:
- 0.1
Assoc list of expandable templates for om-dash dynamic blocks.
Each entry is a cons of two symbols: template name and template function.
When you pass “:template foo” as an argument to a dynamic block, it finds
a function in this list by key foo and uses it to “expand” the template.
This function is invoked with dynamic block parameters plist and should return a new plist. The new plist is used to update the original parameters by appending new values and overwriting existing values.
For example, if org-dblock-write:om-dash-github block has parameters:
(:repo "owner/repo" :type 'issue :template project-column :project 123 :column "In progress")
Dynamic block will use project-column as a key in om-dash-templates
and find om-dash-github:project-column function.
The function is invoked with the original parameter list, and returns a modified parameter list:
(:repo "owner/repo"
:type 'issue
:open ("project:owner/repo/123"
".projectCards[] | (.column.name == \"In progress\")")
:closed ""
:headline "issues (owner/repo \"1.2.3\")")
Then modified parameters are interpreted by dynamic block as usual.
Variable type:
(alist :key-type
(symbol :tag "Template Name")
:value-type
(function :tag "Template Function"))
Default value:
'(
;; OBSOLETE templates:
(milestone . om-dash-github:milestone)
(project-column . om-dash-github:project-column)
;;
)
Introduced in version:
- 0.1
If non-nil, align tables to have given fixed width. If nil, tables have minimum width that fits their contents.
Variable type:
(choice (const :tag "Minimum Width" nil) (integer :tag "Fixed Width"))
Default value:
nil
Introduced in version:
- 0.2
If non-nil, automatically remove empty columns from tables. E.g. if every row has empty tags, :tags column is removed from this table.
Variable type:
(boolean)
Default value:
t
Introduced in version:
- 0.2
How links are generated in om-dash tables.
Allowed values:
:none- no links are inserted:text- only cell text becomes a link:cell- whole cell becomes a link
Variable type:
(choice (const :tag "No links" :none) (const :tag "Cell Text Is Link" :text) (const :tag "Whole Cell Is Link" :cell))
Default value:
:cell
Introduced in version:
- 0.2
Format for format-time-string used for times in tables.
E.g. used for github columns like :created-at, :updated-at, etc.
Variable type:
(string)
Default value:
"%a, %d %b %Y"
Introduced in version:
- 0.3
Column list for om-dash-github tables.
Supported values:
| symbol | example |
|---|---|
| :state | OPEN, CLOSED, … |
| :number | #123 |
| :title | text |
| :title-link | [[link][text]] |
| :milestone | 1.2.3 |
| :tags | :tag1:tag2:…: |
| :author | @octocat |
| :assignee | @octocat,@github |
| :reviewer | @octocat,@github |
| :project | text |
| :project-status | text |
| :classic-project | text |
| :classic-project-status | text |
| :created-at | date |
| :updated-at | date |
| :closed-at | date |
| :merged-at | date |
Variable type:
(repeat symbol)
Default value:
'(:state
:number
:author
:title-link)
Introduced in version:
- 0.1
Column list for om-dash-orgfile tables.
Supported values:
| symbol | example |
|---|---|
| :state | TODO, DONE, … |
| :title | text |
| :title-link | [[link][text]] |
| :tags | :tag1:tag2:…: |
Variable type:
(repeat symbol)
Default value:
'(:state
:title-link)
Introduced in version:
- 0.1
Column list for om-dash-imap tables.
Supported values:
| symbol | example |
|---|---|
| :state | NEW, UNREAD, CLEAN |
| :new | 10 |
| :unread | 20 |
| :total | 30 |
| :folder | foo/bar |
Variable type:
(repeat symbol)
Default value:
'(:state
:new
:unread
:total
:folder)
Introduced in version:
- 0.3
Default limit for github queries.
E.g. if you query “all open issues” or “closed issues since january”,
only last om-dash-github-limit results are returned.
Variable type:
(integer)
Default value:
200
Introduced in version:
- 0.1
List of json fields enabled by default in github queries.
This defines which fields are present in github responses and hence can be used in jq selectors.
We don’t enable all fields by default because some of them noticeably slow down response times.
There is also om-dash-github-auto-enabled-fields, which defines fields
that are enabled automatically for a query if jq selector contains them.
In addition, org-dblock-write:om-dash-github accept :fields
parameter, which can be used to overwrite fields list per-block.
Variable type:
(alist :key-type
(choice
(const :tag "Pull Request" pullreq)
(const :tag "Issue" issue))
:value-type
(repeat :tag "Field" string))
Default value:
'((pullreq
.
("assignees"
"author"
"autoMergeRequest"
"baseRefName"
"body"
"closed"
"closedAt"
"createdAt"
"headRefName"
"headRefOid"
"headRepository"
"headRepositoryOwner"
"id"
"isCrossRepository"
"isDraft"
"labels"
"maintainerCanModify"
"mergeable"
"mergeCommit"
"mergedAt"
"mergedBy"
"mergeStateStatus"
"milestone"
"number"
"potentialMergeCommit"
"state"
"title"
"updatedAt"
"url"))
(issue
.
("assignees"
"author"
"closed"
"closedAt"
"createdAt"
"id"
"labels"
"milestone"
"number"
"state"
"title"
"updatedAt"
"url")))
Introduced in version:
- 0.1
List of json fields automatically enabled on demand in github queries.
See om-dash-github-fields for more details.
Variable type:
(alist :key-type
(choice
(const :tag "Pull Request" pullreq)
(const :tag "Issue" issue))
:value-type
(repeat :tag "Field" string))
Default value:
'((pullreq
.
("additions"
"changedFiles"
"comments"
"commits"
"deletions"
"files"
"latestReviews"
"projectCards"
"projectItems"
"reactionGroups"
"reviewDecision"
"reviewRequests"
"reviews"
"statusCheckRollup"))
(issue
.
("body"
"comments"
"projectCards"
"projectItems"
"reactionGroups")))
Introduced in version:
- 0.1
Default IMAP connection settings.
Fields from this plist are used in om-dash-imap if corresponding
parameters are not explicitly specified for the block.
Supported properties:
| parameter | description |
|---|---|
| :host | IMAP server hostmame |
| :port | IMAP server port |
| :machine | machine name in ~/.authinfo |
| :user | IMAP username |
| :password | IMAP password |
| :stream | STREAM for imap-open |
| :auth | AUTH for imap-open |
Variable type:
(plist :options
((:host
(string :tag "Hostname Or IP"))
(:port
(choice
(integer :tag "Port Number")
(const :tag "Auto" nil)))
(:machine
(choice
(string :tag "Machine Name For ~/.authinfo")
(const :tag "Auto" nil)))
(:user
(choice
(string :tag "User")
(const :tag "Auto" nil)))
(:password
(choice
(string :tag "Password")
(const :tag "Auto" nil)))
(:stream
(choice
(const gssapi)
(const kerberos4)
(const starttls)
(const tls)
(const ssl)
(const network)
(const shell)
(const :tag "Auto" nil)))
(:auth
(choice
(const gssapi)
(const kerberos4)
(const digest-md5)
(const cram-md5)
(const login)
(const anonymous)
(const :tag "Auto" nil)))))
Default value:
'( :host nil
:port nil
:machine nil
:user nil
:password nil
:stream nil
:auth nil )
Introduced in version:
- 0.4
Whether to display empty IMAP folders. If nil, empty folders are excluded from the table.
Variable type:
(boolean)
Default value:
nil
Introduced in version:
- 0.1
Enable verbose logging.
If non-nil, all commands and queries are logged to *om-dash* buffer.
Variable type:
(boolean)
Default value:
nil
Introduced in version:
- 0.1
Face used for entire cell in om-dash table header. You can use it so specify header background.
Default value:
'((t (:inherit default)))
Face used for text in om-dash table header. You can use it so specify header font.
Default value:
'((t (:inherit org-table)))
Face used for entire non-header cell in om-dash table. You can use it so specify cell background.
Default value:
'((t (:inherit default)))
Face used for text in om-dash table non-header cell. You can use it so specify cell font.
Default value:
'((t (:inherit default)))
Face used for issue or pull request numbers in om-dash tables.
Default value:
'((t (:inherit org-link)))
Face used for github usernames in om-dash tables.
Default value:
'((t (:inherit org-document-info)))
Face used for TODO keyword in om-dash tables.
Default value:
'((t (:inherit org-todo :weight normal)))
Face used for DONE keyword in om-dash tables.
Default value:
'((t (:inherit org-done :weight normal)))
Face used for OPEN keyword in om-dash tables.
Default value:
'((t (:inherit om-dash-todo-keyword)))
Face used for MERGED keyword in om-dash tables.
Default value:
'((t (:inherit om-dash-done-keyword)))
Face used for CLOSED keyword in om-dash tables.
Default value:
'((t (:inherit org-warning :weight normal)))
Face used for NEW keyword in om-dash tables.
Default value:
'((t (:inherit org-todo :weight normal)))
Face used for UNREAD keyword in om-dash tables.
Default value:
'((t (:inherit org-todo :weight normal)))
Face used for CLEAN keyword in om-dash tables.
Default value:
'((t (:inherit org-done :weight normal)))
See here.







