Parity with Emacs Org
What Emacs Org (9.8.10) does, area by area, and what org-lsp does of it. An area's parity is the share of its features done; all of Org is the mean of the areas. Every feature done is checked against Emacs where Org decides the outcome (see "How the work is checked" in development.org).
All of Org: 97%
Org's options, one by one, are under Options.
| Feature | Parity | Done |
|---|---|---|
| Highlighting | 100% | 21 of 21 |
| Folding and visibility | 91% | 10 of 11 |
| Headings and structure | 96% | 26 of 27 |
| Lists and checkboxes | 93% | 14 of 15 |
| TODO keywords | 100% | 14 of 14 |
| Priorities | 100% | 4 of 4 |
| Tags | 88% | 7 of 8 |
| Properties and column view | 100% | 10 of 10 |
| Dates and times | 100% | 10 of 10 |
| Agenda | 97% | 38 of 39 |
| Clocking | 100% | 14 of 14 |
| Capture | 100% | 12 of 12 |
| org-protocol | 86% | 6 of 7 |
| Notes (org-roam) | 94% | 15 of 16 |
| A journal (org-journal) | 93% | 14 of 15 |
| Refile and archive | 100% | 13 of 13 |
| Links | 96% | 23 of 24 |
| Footnotes | 100% | 4 of 4 |
| Tables | 100% | 19 of 19 |
| Table formulas | 100% | 13 of 13 |
| Code blocks (Babel) | 100% | 12 of 12 |
| Export and publishing | 100% | 9 of 9 |
| Citations | 82% | 9 of 11 |
| Diagnostics (org-lint) | 100% | 61 of 61 |
| Indentation and formatting | 100% | 8 of 8 |
| Notes and logging | 100% | 6 of 6 |
| Completion and editing helpers | 100% | 5 of 5 |
| Timers | 100% | 5 of 5 |
| Attachments | 100% | 2 of 2 |
| Encryption | 100% | 2 of 2 |
| Inline images and LaTeX previews | 100% | 5 of 5 |
Highlighting#
100% (21 of 21)
- ✅ Headlines by level, TODO keywords, priorities and tags
- ✅ Emphasis, verbatim and code
- ✅ Links shown as their description (
org-link-descriptive,#+STARTUP: descriptivelinksorliterallinks); a description and a target shown each in a look of its own, as nvim-orgmode has them, where Org gives the whole linkorg-link - ✅ Emphasis markers hidden (
org-hide-emphasis-markers) - ✅ Timestamps, planning and clock lines
- ✅ Blocks, keywords, drawers, properties and comments
- ✅ Code in its language (
org-src-fontify-natively) - ✅ Tables; the rows of a header (above the first rule, with rows below it) in a look of their own, as nvim-orgmode has them, where Org colors a header only in the header line of
org-table-header-line-mode(org-table-header) - ✅ Lists: bullets, checkboxes, and the terms of description lists in bold (
org-list-dt) - ✅ Footnotes, targets, macros, entities, LaTeX fragments, and LaTeX environments in a look of their own, as nvim-orgmode has them
- ✅ Archived subtrees shaded (
org-archived) - ✅ Radio targets turning their words into links: highlighted, followed, document links
- ✅ Entities shown as their characters (
org-pretty-entities,#+STARTUP: entitiesprettyorentitiesplain): hidden, the character in their place (drawn by the editor where it can, else an inlay hint) - ✅ Entities of one's own (
org-entities-user): parsed, shown, completed and exported as Org's - ✅ Timestamps in formats of one's own (
org-display-custom-times,org-timestamp-custom-formats,#+STARTUP: customtime,C-c C-x C-t): the date and time hidden, the custom form in their place as for entities; in exports through Emacs too - ✅ Headline stars as bullets in the colors of their level, the leading ones hidden (org-bullets:
org_bullets_mode,org_bullets_bullet_list); bullets of lists and marks of checkboxes as org-bullets.nvim shows them (org_bullets_list_bullet,org_bullets_checkboxes) - ✅ Sub- and superscripts raised and lowered (
org-pretty-entities-include-sub-superscripts,org-use-sub-superscripts): where Org raises them, shown in Unicode (x²,H₂O) in place of the hidden text (drawn by the editor where it can, else an inlay hint) where every character has a raised or lowered form; the others left as they are, as an editor cannot raise text - ✅ Done headlines in
org-headline-donepast their keyword (org-fontify-done-headlineat its default), complete statistics cookies as done, the title and the information of the document (org-document-title,org-document-info) - ✅ Headlines past a done or TODO keyword, and the lines of quote and verse blocks, in their own look (
org-fontify-done-headline,org-fontify-todo-headline,org-fontify-quote-and-verse-blocks) - ✅ Emphasis in the looks of
org-emphasis-alist(bold, italic, underline, strike-through, code and verbatim, not colors), or none (org-fontify-emphasized-text); keywords such as#+TITLE:and the braces of macros hidden (org-hidden-keywords,org-hide-macro-markers) - ✅ How many looks headline levels take, and past the last the first again or the last for all (
org-n-level-faces,org-cycle-level-faces); a headline's look to the edge of the window, for looks with a background (org-fontify-whole-heading-line, where the editor can draw it)
Where editors fall short:
- Vim ❓: A headline's line colored to the edge (
org_fontify_whole_heading_line) is a sign without text, which shows the sign column. A line with a long link wraps as if the link's hidden target took room: Vim counts concealed text when it wraps. - Sublime Text ❓: Links, emphasis markers, pretty entities and sub- and superscripts are not concealed: Sublime Text cannot hide text in a view. The colors need LSP's
semantic_highlightingon. A headline's look does not go on to the edge of the window (org_fontify_whole_heading_line): Sublime Text colors a line past its text only with a region filled in one color of the color scheme, as the agenda's clocked line, not in the look semantic tokens give the headline. - Zed ❓: Links, emphasis markers, pretty entities and sub- and superscripts are not concealed: Zed lets no server hide text. The colors need
"semantic_tokens": "combined"; code blocks take their language's colors, inline code does not. A headline's look does not go on to the edge of the window (org_fontify_whole_heading_line): Zed lets no server color a line past its text. - Helix ❓: Helix has no semantic tokens: Org and the agenda are colored by tree-sitter queries of org-lsp's that
install.shputs in Helix's runtime, which see the words of the text, not what the server knows. TODO keywords are the usual ones (TODO,NEXT,WAIT,DONE,CANCELLED…), not those of the settings or#+TODO:; the agenda shows neither today nor the clocked line, and its leaders and prefix are the default ones; options of how things look are not followed. Links, emphasis markers, pretty entities and sub- and superscripts are not concealed: Helix lets no server hide text; inline code is not in its language's colors.
Folding and visibility#
91% (10 of 11)
- ✅ Cycling a subtree (
TAB): folded, children, subtree - ✅ Cycling the file (
S-TAB): overview, contents, everything - ✅ Startup visibility (
org_startup_folded,#+STARTUP:overview,content,show2levels…,showall,showeverything), theVISIBILITYproperty, archived subtrees and drawers folded,hideblocks; where Org shows a headline's children but not its text, the text shows - ✅ Blank lines after a subtree kept outside its fold (
org-cycle-separator-lines) - ✅ Archived subtrees left folded (
org-cycle-hide-archived-subtrees) - ✅ A closed fold shows its first line, then the ellipsis (
org-ellipsis,org_ellipsis) - ✅ Sparse trees (
C-c /), their matches in archived subtrees left folded unlessorg-sparse-tree-open-archived-trees - ✅ Narrowing to a subtree or block (
C-x n s,C-x n b) and the subtree in an indirect buffer (C-c C-x b): it in a file of its own, all there is to see there, written back each time it is saved - ✅ Showing the context of the cursor (
org-reveal,C-c C-r): its entry, the next headline, its siblings and its ancestors, the other folds left as they are;org.reveal.siblings(C-u) each level with its children,org.reveal.tree(C-u C-u) the parent's whole tree - ✅
TABon a new, empty headline or item changing its level (org-cycle-level-after-item/entry-creation), and at the start of the file cycling the file (org-cycle-global-at-bob); list items folding, as part of the outline or not at all (org-cycle-include-plain-lists); headlines folding to a level (org-cycle-max-level) - ❌ The other options of cycling (
org-cycle-emulate-tab,org-fold-show-context-detail: the context shown after a jump is always the same,org-fold-catch-invisible-edits)
Where editors fall short:
- Neovim ❓: Cycling the whole file goes between overview and everything: it has no contents state, which needs folds of a headline's own text that Neovim's fold levels do not make.
<Tab>changes the level of a new entry in Normal mode; in Insert mode it is a tab. - Vim ❓: Cycling the whole file goes between overview and everything: it has no contents state, which needs folds of a headline's own text that Vim's fold levels do not make. A closed fold's line is not highlighted: Vim draws it in one color.
<Tab>changes the level of a new entry in Normal mode; in Insert mode it is a tab. - VS Code ❓: A closed fold ends in VS Code's own
⋯: an extension cannot change it (org_ellipsis). - Sublime Text ❓: A closed fold ends in Sublime Text's own marker: a package cannot change it (
org_ellipsis). - Zed ❓: Zed folds with its own folding: Org's cycling and sparse trees need folds an extension can set, which Zed does not offer.
- Helix ❌: Helix has no folding.
Headings and structure#
96% (26 of 27)
- ✅ New headings (
M-RET,M-S-RET,C-RET,C-S-RET), the line split or not (org-M-RET-may-split-line), with empty lines before them asorg-blank-before-new-entrysays, after the subtree (org-insert-heading-respect-content) - ✅ Promoting and demoting a heading or a subtree; a top-level one to a
#line (org-allow-promoting-top-level-subtree) - ✅ Odd levels only,
***the second (org-odd-levels-only,#+STARTUP: odd): promoting, demoting andTABon a new headline two stars at a time, the headlines' faces,LEVELin matches and%lin the agenda - ✅ Odd levels only where refiling, capturing, archiving and date trees put headlines (
org-get-valid-level), from the target file's#+STARTUP: - ✅ Converting a file to odd levels and back (
org-convert-to-odd-levels,org-convert-to-oddeven-levels), as the commandsorg.levels.oddandorg.levels.oddeven - ✅ Inline tasks (
org-inlinetask), headlines oforg-inlinetask-min-levelstars or more, 15 by default: inserted with theirENDline (C-c C-x t,org-inlinetask-insert-task, around the selection, inorg-inlinetask-default-state); promoted and demoted with it (M-<left>,M-<right>); left out of the outline, of the motion between headings (C-c C-n,C-c C-p) and of the subtrees promoted and demoted around them; folded to theirENDline; their stars but the last two hidden as leading stars are, the rest in theorg-inlinetaskface; listed by the agenda as Emacs lists them - ❌ Inline tasks:
M-<up>andM-<down>on one (Emacs drags the element), its text as the parser's (inlinetaskinorg-element: here the text after a task withoutENDline is the task's), the first star inorg-warningwithorg-inlinetask-show-first-star(here no star is hidden then), theENDline left behind by archiving and refiling (org-inlinetask-remove-END-maybe), and the commands Emacs runs on a selection - ✅ Shift and the arrows selecting text where Org has nothing to do, or everywhere but on timestamps (
org-support-shift-select):alwaysby default, where Emacs's default isnil - ✅ Moving a subtree up and down
- ✅ Cutting, copying and pasting subtrees, their level fitted
- ✅ Yanking subtrees with
C-yat the level around them (org-yank-adjusted-subtrees) - ✅ Yanked subtrees folded, unless that would hide the text after them (
org-yank-folded-subtrees); a subtree cut or copied folded is folded again when it is pasted - ✅
C-kon a folded headline killing what the fold hides, asking first or refusing (org-ctrl-k-protect-subtree) - ✅ Sorting entries (
C-c ^) - ✅ The outline of the file (document symbols)
- ✅ Moving between headings (
C-c C-n,C-c C-p,C-c C-f,C-c C-b,C-c C-u) - ✅ Jumping to a heading (
org-goto,C-c C-j, by outline path) - ✅ The outline path of the entry at the cursor in the echo area, with a count the file's name first (
org-display-outline-path,org.outline.path; not cut to the window's width) - ✅
C-a,C-eandC-kon headlines and items, to the title and the tags (org-special-ctrl-a/e,org-special-ctrl-k) - ✅
C-oopening a line, or in a table inserting a row (org-open-line,org-special-ctrl-o) - ✅ Turning lines into headings and back (
C-c *, through Emacs) - ✅ Toggling
COMMENT(C-c ;, through Emacs) - ✅ Cloning a subtree with its dates shifted (
C-c C-x c, through Emacs) - ✅ Commands on a region, a selection in the editor: the headlines in it promoted, demoted or moved, lines turned into headings or items, checkboxes toggled, the region wrapped in a block, a drawer or emphasis (through Emacs)
- ✅ Sparse trees that tell case apart (
org-occur-case-fold-search), and by a kind of date, cycled withc(org-sparse-tree-default-date-type) - ✅ Sparse trees without their matches highlighted (
org-highlight-sparse-tree-matches) - ✅ The highlights of a sparse tree and the times of
C-c C-x C-dgone with the next change, or kept, following the text, untilC-c C-c(org-remove-highlights-with-change); those of a sparse tree by tags or a property kept either way, asorg-scan-tagskeeps them
Where editors fall short:
- VS Code ❓: VS Code does not tell an extension which folds are closed:
C-kon a folded headline is VS Code's own (org-ctrl-k-protect-subtree), and a subtree cut or copied folded is not folded again when it is pasted. - Zed ❓: A command on a selection acts on the cursor's line: Zed tells a server no selection. The commands go through the keys of keymap.json (Zed's tasks); for cloning, the answer is typed as a rename at the cursor (
F2), as Zed has no box of its own for typed text. Turning a line into a heading (org.toggle.heading) is left out: it has no key in keymap.json and is not among the code actions.C-a,C-e,C-kandC-ykeep Zed's own meaning, and nothing pasted is folded: Zed lets no server fold. - Helix ❓: Moving between headings,
org-gotoand Org'sC-a,C-e,C-kandC-yare left out: they need keys, and Helix cannot bind a key to a server's command; nor are inserting an inline task and the commands run by Emacs (C-c *,C-c ;, cloning) among its code actions. New headings are code actions.
Lists and checkboxes#
93% (14 of 15)
- ✅ New items, numbered and with checkboxes (
M-RET,M-S-RET) - ✅
RETin an item (org-return) - ✅ Indenting, outdenting and moving items, with their children
- ✅ Cycling bullets (
S-<left>,S-<right>) - ✅ Repairing and renumbering a list (
C-c C-c) - ✅ Checkboxes, with their parents and
[1/3]or[33%]cookies - ✅ Counting a cookie again with
C-c C-con it (org-update-statistics-cookies), from the boxes or, on a headline, its children's TODO keywords - ❌
C-c C-celsewhere on a headline: org-lsp toggles the boxes below it (org-toggle-checkbox, asC-c C-x C-bdoes), where Emacs sets the tags (org-set-tags-command,org.tags.sethere) - ✅ Sorting items
- ✅ Moving to the next and previous item
- ✅ Turning lines into items and back (
C-c -, through Emacs) - ✅ Circular motion between items (
org-list-use-circular-motion) - ✅ Two spaces after chosen bullets, a bullet of their own for indented items, a wider indent for sub-items (
org-list-two-spaces-after-bullet-regexp,org-list-demote-modify-bullet,org-list-indent-offset) - ✅ Turning off the automatic rules, and cookies counting every box below them (
org-list-automatic-rules,org-checkbox-hierarchical-statistics) - ✅ Lettered items (
a.,B)) and one terminator for numbers (org-list-allow-alphabetical,org-plain-list-ordered-item-terminator)
Where editors fall short:
- Zed ❓:
RETstays Zed's own, and so do Shift and Alt with the arrows, which cycle bullets and move items in Org. - Helix ❓:
RETstays Helix's own; cycled bullets and lines turned into items are left out: Helix cannot bind a key to a server's command (the commands are code actions,Space a), and those are not among them. New items are code actions.
TODO keywords#
100% (14 of 14)
- ✅ Cycling states, and fast selection by key (
TODO(t)), from a menu or the keys in the prompt alone, or never (org-use-fast-todo-selection) - ✅ Sequences and types from
#+TODO:andorg_todo_keywords - ✅ Several sequences: cycling stays in the entry's sequence, and
C-S-<right>,C-S-<left>switch sets - ✅ Keywords given alone read as a sequence or as types (
org-todo-interpretation) - ✅ Faces of particular keywords and priorities (
org-todo-keyword-faces,org-priority-faces) - ✅ Logging:
CLOSED:, the time or a note on a state change (!,@),LOG_INTO_DRAWER - ✅ TODO statistics of the parent, counting what
org-provide-todo-statisticssays, children only or the subtree (org-hierarchical-todo-statistics); tags set and removed with the state (org-todo-state-tags-triggers);CLOSED:kept without a keyword (org-closed-keep-when-no-todo) - ✅ Repeating entries moving to their next date
- ✅ The parent's statistics cookies recounted
- ✅ Blocking a state change by children,
ORDEREDsiblings and checkboxes (org-enforce-todo-dependencies) - ✅ A tag that shows the
ORDEREDproperty (org-track-ordered-property-with-tag) - ✅
S-<left>,S-<right>changing the state without logging or blocking (org-treat-S-cursor-todo-selection-as-state-change), a new TODO heading logged as a state change (org-treat-insert-todo-heading-as-state-change) - ✅ Dimming blocked tasks in the agenda (
org-agenda-dim-blocked-tasks) - ✅ Hiding blocked tasks in the agenda (
org-agenda-dim-blocked-tasksinvisible)
Where editors fall short:
- Sublime Text ❓: Faces of particular keywords and priorities are not shown in the file: Sublime Text colors text by its color scheme only. The list of TODO states shows them in the color of each item's kind, the nearest of those Sublime Text has.
- Zed ❓: States are picked with buttons; for a note for a state change (
@), the answer is typed as a rename at the cursor (F2), as Zed has no box of its own for typed text. Faces of particular keywords and priorities are not shown: Zed colors tokens by its theme only. - Helix ❓: States are picked from the code actions, where they come first once asked for; for a note for a state change (
@), the answer is typed as a rename at the cursor (Space r), as Helix has no box of its own for a server to ask for text. Switching to another keyword set is left out in an Org file, where it is not among Helix's code actions; on an agenda line it is one. Faces of particular keywords and priorities are not shown.
Priorities#
100% (4 of 4)
- ✅ Raising, lowering, setting and removing
- ✅
#+PRIORITIES:and number priorities - ✅ From the agenda
- ✅ Turning the priority commands off (
org-priority-enable-commands)
Tags#
88% (7 of 8)
- ✅ Setting tags: fast selection by key, exclusive groups, typed
- ✅ Aligning tags (
org_tags_column) - ✅ Inheritance and
#+FILETAGS: - ✅ Completion
- ✅ Group tags in searches
- ✅ A sparse tree by tags
- ✅ Faces of particular tags in headlines (
org-tag-faces) - ❌ The TODO keywords in the tag selection (
org-fast-tag-selection-include-todo, a variable Org calls undocumented)
Where editors fall short:
- Sublime Text ❓: Faces of particular tags are not shown: Sublime Text colors text by its color scheme only.
- Zed ❓: Tags are typed, not set with keys pressed in turn: the answer is typed as a rename at the cursor (
F2), as Zed has no box of its own for typed text. Completion and renaming work. Faces of particular tags are not shown: Zed colors tokens by its theme only. - Helix ❓: Tags are typed, not set with keys pressed in turn: the answer is typed as a rename at the cursor (
Space r), as Helix has no box of its own for a server to ask for text. Completion and renaming work. Faces of particular tags are not shown.
Properties and column view#
100% (10 of 10)
- ✅ Setting and deleting properties, also from the agenda
- ✅ Allowed values (
NAME_ALL) cycled withS-<left>andS-<right> - ✅ Effort (
C-c C-x e) andORDERED - ✅ Inheritance, special properties and property searches
- ✅ Column view (
C-c C-x C-c, through Emacs): the columns over the headlines, the header, summaries; editing, cycling and the allowed values of a column, moving, narrowing, widening and deleting columns, moving entries - ✅ Column view dynamic blocks and summaries (
C-c C-x x, filled in by Emacs) - ✅ Properties written as
org-property-formatsays, their values joined asorg-property-separatorssays; efforts in the units oforg-duration-units(onceorg-effort-durations) - ✅ Custom properties hidden and shown (
org-custom-properties,org-toggle-custom-properties-visibility,org.custom.properties.toggle): their lines hidden whole, where the editor can hide a line - ✅ IDs made as
org-id-method,org-id-prefix,org-id-ts-formatandorg-id-include-domainsay - ✅ IDs looked for where
org-id-track-globally,org-id-search-archives,org-id-extra-filesandorg-id-locations-filesay;id:links completing toorg-id-completion-targets
Where editors fall short:
- Vim ❓: Column view's header is in the window's status line, shown when the window has one (
laststatus). Custom properties are not hidden (org.custom.properties.toggle): Vim cannot hide a line, a closed fold still shows a line of its own, and concealing a line's text leaves the line, empty. - VS Code ❓: Column view's header is in the status bar, with the column picked in brackets. Custom properties are not hidden (
org.custom.properties.toggle): VS Code hides lines only in a fold of the folding ranges, which keeps its first line showing, and a decoration cannot hide a line. - Sublime Text ❓: Column view is left out: it draws over the headlines, which Sublime Text cannot. A custom property hidden (
org.custom.properties.toggle) is in a fold from the end of the line before, which shows the fold's marker: Sublime Text hides text only in folds. - Zed ❓: A property, its value and the effort are typed, without completion: the answer is typed as a rename at the cursor (
F2), as Zed has no box of its own for typed text. Column view is left out: it draws over the headlines. Custom properties are not hidden (org.custom.properties.toggle): Zed lets no server hide text. Deleting a property has no key in keymap.json and is not among the code actions; cycling a property's allowed values needs Shift with the arrows, which stay Zed's. - Helix ❓: A property, its value and the effort are typed, without completion: the answer is typed as a rename at the cursor (
Space r), as Helix has no box of its own for a server to ask for text. Column view is left out: it draws over the headlines. Custom properties are not hidden (org.custom.properties.toggle): Helix lets no server hide text. Deleting a property, cycling a property's allowed values and togglingORDEREDare left out: they are not among Helix's code actions.
Dates and times#
100% (10 of 10)
- ✅ Inserting active and inactive timestamps (
C-c .,C-c !) - ✅ Scheduling and deadlines (
C-c C-s,C-c C-d) - ✅ Org's date prompt:
+2d,fri,2/15,10:00-11:30… - ✅ The calendar with the prompt
- ✅ The calendar on its own, at the date of the line's timestamp (
org-goto-calendar,C-c >) - ✅ Changing the part at the cursor (
S-<up>,S-<down>, the other way withorg-edit-timestamp-down-means-later), with ranges, repeaters and warnings - ✅ Moving a date by days (
S-<left>,S-<right>) - ✅ Removing a scheduled date or a deadline (
C-u C-c C-s,C-u C-c C-d) - ✅ Setting a delay or a warning period (
C-u C-u C-c C-s,C-u C-u C-c C-d) - ✅ A day that ends after midnight (
org-extend-today-until): the agenda's today, the date prompt, the times capture puts in and its datetree,.+and++repeaters
Where editors fall short:
- Sublime Text ❓: Dates are typed, without the calendar: the package asks with an input panel.
- Zed ❓: Dates are typed (
+2d,fri 10:00), with no calendar: the answer is typed as a rename at the cursor (F2), as Zed has no box of its own for typed text. Changing a timestamp works. Removing the scheduled date or the deadline is left out: those commands have no key in keymap.json and are not among the code actions. - Helix ❓: Dates are typed (
+2d,fri 10:00), with no calendar: the answer is typed as a rename at the cursor (Space r), as Helix has no box of its own for a server to ask for text; Helix reads no file again that the server writes, as the calendar is. New timestamps and removing the scheduled date or the deadline are left out: they are not among Helix's code actions. Changing a timestamp works.
Agenda#
97% (38 of 39)
- ✅ Day, week, fortnight, month and year views, going to a date
- ✅ The list of TODO entries
- ❌ The lines under the heading of the TODO list, a tags match and a search that name Emacs's keys (
Press ‘N r’ (e.g. ‘0 r’) to search again: (0)[ALL] (1)TODO …,Press ‘C-u r’ to search again,Press ‘[’, ‘]’ to add/sub word …), andN ritself: left out, the keys being the editor's;Tin the agenda dispatcher asks for the keyword instead - ✅ Directories of agenda files read by a regexp (
org-agenda-file-regexp); a listed file that is not there asked about, removed or aborting, or left out (org-agenda-skip-unavailable-files) - ✅ Tag, property and group tag searches
- ✅ Searches for words, phrases and regexps
- ✅ Stuck projects
- ✅ Tag matches and stuck projects without the entries below one they list, or with them shown indented by dots (
org-tags-match-list-sublevels), in sparse trees too - ✅ Custom commands and block agendas (
org-agenda-custom-commands) - ✅ Sorting by any of Org's strategies, for each kind of view (
org-agenda-sorting-strategy), and limits on how many entries show (org-agenda-max-entries,-todos,-tags,-effort) - ✅ Inherited tags on agenda lines or not, by kind of view (
org-agenda-show-inherited-tags,org-agenda-use-tag-inheritance), and tags hidden by a regexp (org-agenda-hide-tags-regexp) - ✅ How times show: two-digit hours (
org-agenda-time-leading-zero), 12-hour form (org-agenda-timegrid-use-ampm), a default duration (org-agenda-default-appointment-duration), taken from headlines or not (org-agenda-search-headline-for-time,-remove-times-when-in-prefix); date ranges out of headlines (org-agenda-remove-timeranges-from-blocks); diary sexp leaders (org-agenda-diary-sexp-prefix) - ✅ The look of a deadline by the part of its warning time that has passed (
org-agenda-deadline-faces, with Org's three deadline faces) - ✅ For an entry with both a scheduled date and a deadline, one of them left out or held back (
org-agenda-skip-scheduled-if-deadline-is-shown,-deadline-prewarning-if-scheduled,-scheduled-delay-if-deadline,-scheduled-repeats-after-deadline); repeats at their last date (org-agenda-prefer-last-repeat); no deadlines (org-agenda-include-deadlines); one timestamp line a day for an entry (org-agenda-skip-additional-timestamps-same-entry) - ✅ The TODO list leaving out entries for a date of their own (
org-agenda-todo-ignore-scheduled,-deadlines,-timestamp,-with-date), intags-todotoo (org-agenda-tags-todo-honor-ignore-options), and without sublevels (org-agenda-todo-list-sublevels); commented subtrees shown (org-agenda-skip-comment-trees) - ✅ Commands offered by context (
org-agenda-custom-commands-contexts) - ✅ Filters by tag, category, effort, regexp and top headline
- ✅ Filters kept from one view to the next (
org-agenda-persistent-filter) - ✅ Bulk marks and actions
- ✅ Follow mode and entry text
- ✅ The outline path of the cursor's entry as it moves (
org-agenda-show-outline-path) - ✅ Log mode, with or without notes (
org-agenda-log-mode-add-notes), and the clock report, with a header (org-agenda-clock-report-header) and any clock table parameters (org-agenda-clockreport-parameter-plist) - ✅ Priority cookies highlighted, or the rest of their lines, the highest in bold and the lowest in italic (
org-agenda-fontify-priorities) - ✅ Archives mode; archived trees in every view without it (
org-agenda-skip-archived-trees) - ✅ Going to a date (
j) with its own reading of a date to come (org-agenda-jump-prefer-future) - ✅ Inactive timestamps in the agenda once (
[,v [:org-agenda-include-inactive-timestamps) - ✅ Changing an entry from the agenda: state, priority, tags, dates, notes, refile, archive, clock
- ✅ A date of the past moved one day later goes to today (
org-agenda-move-date-from-past-immediately-to-today) - ✅ Changed lines kept where they are until the agenda is rebuilt, the new date at their end (
org-agenda-change-all-lines,org-agenda-show-new-time) - ✅ Lines formatted as Org formats them (
org-agenda-prefix-formatand the rest);%(…)in the format run by Emacs on each entry (through Emacs) - ✅ The time grid
- ✅ Habits (
org-habit): the consistency graph,K - ✅ Groups of org-super-agenda (
org_super_agenda_mode,org_super_agenda_groups): its selectors, automatic groups and options, for each day and each view; not the selectors that run Lisp - ✅ Diary sexps (
%%(diary-…)lines,<%%(…)>timestamps): the date functions ofdiary-liband Org (diary-anniversary,-block,-cyclic,-date,-float,org-class…) withand,or,notand comparisons - ✅ Diary sexps calling other Lisp, evaluated by Emacs (
org-diary-sexp-entry) for each day of the view - ✅ Column view in the agenda (
C-c C-x C-c, through Emacs): each entry's line covered by its columns, the summaries on the date lines and the blocks' headers; editing, cycling and showing the values of the entries, changed in their files - ✅ Column view as soon as the agenda is made (
org-agenda-view-columns-initially) - ✅ Writing the agenda to a file (
C-x C-w):.organd plain text; in plain text, some lines of each entry's text under its line (org-agenda-add-entry-text-maxlines) - ✅ Appointment reminders (
org-agenda-to-appt, through Emacs'sappt.el): today's entries with a time, checked each minute, the reminders shown as messages
Where editors fall short:
- VS Code ❓: Tags are at column 80, not at the window's edge (
org_agenda_tags_column"auto"): VS Code does not tell an extension how many columns an editor shows. - Sublime Text ❓: Column view in the agenda is left out: it draws over the lines, which Sublime Text cannot. The days of a habit's graph take the colors of text, not Org's backgrounds: Sublime Text colors a token by its color scheme.
- Zed ❓: The agenda is a file, its commands keys through Zed's tasks (keymap.json),
enterandtabgoing to an entry; adding today's appointments (org.agenda.appt) has no key and is not among the code actions; for a search and a date, the answer is typed as a rename at the cursor (F2), as Zed has no box of its own for typed text. Follow mode and the outline path of the cursor's entry are left out: Zed reports no cursor moves to an extension. Column view in the agenda is left out: it draws over the lines. The days of a habit's graph have Org's backgrounds for a dark background, a little transparent, with any theme: an extension's colors for tokens are the same with every theme. - Helix ❓: The agenda is a file,
Agenda.org, its commands code actions, a view's choices first in them once asked for; for a search and a date, the answer is typed as a rename at the cursor (Space r), as Helix has no box of its own for a server to ask for text. Follow mode, the outline path of the cursor's entry and the entry in another window are left out: Helix tells a server no cursor moves, and knows no other window of the server's. Column view in the agenda is left out: it draws over the lines. The server's edits leave the agenda's buffer changed::buffer-close!closes it.
Clocking#
100% (14 of 14)
- ✅ Clocking in and out, cancelling, going to the clocked entry, or with none the entry clocked last (
org-clock-goto-may-find-recent-task) - ✅ The clock history and clocking in the last entry
- ✅ The clock in the mode line
- ✅ The time clocked under each headline (
C-c C-x C-d) - ✅ Clock tables, with every parameter
- ✅ Durations written as
org-duration-formatsays (1d 2:30,26:30,1.09d,1d2h15min) and read with the units oforg-duration-units(days of 8 hours) - ✅ Resolving open clocks and idle time (
C-c C-x C-z,org-resolve-clocks): each clock left running asked about with Emacs's prompt and keys (k,K,t,T,g,G,s,S,C,j,J,i,q), the minutes or the time asked next;C-ufor the dangling ones alone; clocking in, in a file or the agenda, resolves first (org-clock-auto-clock-resolution), and a clock cut short is offered as the next one's start; the keys in the prompt alone withorg-clock-resolve-expert. A clock found running when the server starts shows as the clock, andC-c C-x C-ostops it, but for resolving and clocking in it is dangling, as in an Emacs that has just started, until kept (k) or resumed (org-clock-persist) - ✅ Clocking in again on a clock left running (
org-clock-in-resume) - ✅ The running clock and the clock history kept from one session to the next, in Emacs's own
org-clock-save.el(org-clock-persist,org-clock-persist-query-resume); a kept clock whoseCLOCK:line was closed since is not clocked in again, and the server never asks before it saves (org-clock-persist-query-save) - ✅ Clocking from the agenda, the clocked entry highlighted
- ✅ A notice when the clock passes the effort (
org-clock-notify-once-if-expired) - ✅ A note when the clock stops (
org-log-note-clock-out), in a note buffer - ✅ Clock times rounded (
org-clock-rounding-minutes), clocks started when the last stopped (org-clock-continuously) - ✅ Clock tables with
org-clocktable-defaults, words in other languages (org-clock-clocktable-language-setup) and the running clock counted (org-clock-report-include-clocking-task)
Where editors fall short:
- Zed ❓: No clock in the status line: Zed has no place there for an extension's text. In the agenda, the clocked entry's line has the background of
org-agenda-clockingunder its text, not to the window's edge: Zed lets no extension highlight a line, only give its tokens a background, and the tokens end with the text. - Helix ❓: No clock in the status line: Helix has no place there for a server's text. Showing the time clocked under each headline and resolving open clocks are left out: they are not among Helix's code actions.
Capture#
100% (12 of 12)
- ✅ Templates of every type: entries, items, checkboxes, table lines, plain text
- ✅ Targets: files, headlines, outline paths, regexps, date trees, IDs, the clock
- ✅ Prompts and
%-escapes (%^{…},%t,%a,%i,%?…) - ✅ The capture buffer: finishing, aborting, refiling
- ✅ Clock options (
:clock-in,:clock-resume…) - ✅
functionandfile+functiontargets (the function run by Emacs) - ✅
%(…)(Emacs Lisp, through Emacs) - ✅
%[file] - ✅
%c,%xand%^C(the editor's clipboard) - ✅
%:keyword(the properties of the link%amakes::annotation,:initial, and anid:link's:link,:description,:type) - ✅ Template contexts (
org-capture-templates-contexts) - ✅ Capturing from the agenda with the date of the line (
org-capture-use-agenda-date)
Where editors fall short:
- Zed ❓: For a template's prompts, the answer is typed as a rename at the cursor (
F2), as Zed has no box of its own for typed text. The capture buffer's tab stays open once the entry is filed: Zed lets no server close a tab. - Helix ❓: Templates are picked from the code actions, where they come first once asked for; for a template's prompts, the answer is typed as a rename at the cursor (
Space r), as Helix has no box of its own for a server to ask for text. The capture buffer stays open once the entry is filed: Helix lets no server close a buffer.
org-protocol#
86% (6 of 7)
- ✅
org-protocol://URLs from bookmarklets and other programs, handed to the editor with org-lsp byorg-lsp protocol URL, whichscripts/install.sh protocolmakes the system's handler of the scheme - ✅ New-style (
?url=…&title=…) and old-style (:/URL/TITLE) URLs, read asorg-protocol.elreads them (org-protocol-data-separator) - ✅
store-link: the link stored forC-c C-l, with Emacs's message (org-protocol-store-link) - ✅
capture: a capture with the URL's template ororg-protocol-default-template-key, its%:link,%:description,%iand%afrom the page (org-protocol-capture) - ✅
open-source: the file of a published page, throughorg-protocol-project-alistand its rewrites (org-protocol-open-source); unlike Emacs, never a file outside the project's working directory - ✅ With no org-lsp running, the editor of
org_protocol_editorstarted for the URL; a link stored meanwhile kept for the next org-lsp - ❌ Handlers of one's own (
org-protocol-protocol-alist), which are Lisp functions
Where editors fall short:
- Zed ❓: The server starts a capture itself: the template is picked from Zed's question, and for its prompts the answer is typed as a rename at the cursor (
F2), as Zed has no box of its own for typed text. - Helix ❓: The server starts a capture itself: the template is picked from the code actions, and for its prompts the answer is typed as a rename at the cursor (
Space r), as Helix has no box of its own for a server to ask for text.
Notes (org-roam)#
94% (15 of 16)
- ✅ The nodes of
org_roam_directory, files and entries with anID, asorg-roam-db-syncfinds them (org_roam_file_extensions,org_roam_file_exclude_regexp), read again as they change - ✅ Finding a node by its title or an alias (
org-roam-node-find), offered asorg_roam_node_display_templateshows it, the files changed last first; a random node - ✅ Inserting a link to a node (
org-roam-node-insert), on a selection too - ✅ New nodes from
org_roam_capture_templates:${title},${slug},${…}asked for;file,file+head,file+olp,file+head+olpandnodetargets; capturing to a node (org-roam-capture) - ✅
roam:links: following them, completing them, replacing them withid:links as files are saved - ✅ Aliases, tags and references added and removed (
org-roam-alias-add…) - ✅ A node found by a reference (
org-roam-ref-find); a file's one headline made the file's node and back (org-roam-promote-entire-buffer,org-roam-demote-entire-buffer) - ✅ A subtree refiled to a node, or extracted to a file of its own as a node (
org-roam-refile,org-roam-extract-subtree) - ✅ The graph of the nodes, all of them or those near the node at the cursor, drawn by Graphviz (
org-roam-graph) - ✅ The org-roam buffer: backlinks, reflinks and unlinked references (
org_roam_mode_sections), following the cursor, dedicated buffers - ✅ Completing node titles as they are typed (
org-roam-completion-everywhere) - ✅ Daily notes: capturing to and going to a day's note, today, tomorrow, yesterday or a date picked in the date prompt's calendar, and the next and previous notes (
org-roam-dailies-capture-today,org-roam-dailies-goto-date…) - ✅ Daily notes: the days with a note marked in the date prompt's calendar, as in every calendar while org-roam is on (
org-roam-dailies-calendar-mark-entries,org-roam-dailies-calendar-note) - ✅ Daily notes: the directory opened, its notes offered to visit (
org-roam-dailies-find-directory) - ✅ The description of an inserted link by a template (
org-roam-node-formatter), and which links of keyword lines and property drawers count (org-roam-db-extra-links-elements,org-roam-db-extra-links-exclude-keys) - ❌ Lisp that formats a link's description or chooses the nodes (
org-roam-node-formatteras a function,org-roam-db-node-include-function)
Where editors fall short:
- Zed ❓: A node's title is typed, without completion: the answer is typed as a rename at the cursor (
F2), as Zed has no box of its own for typed text. The org-roam buffer does not follow the cursor: Zed reports no cursor moves to an extension. The commands without a key of Org's (a random node, aliases, tags, the buffer of a node and refreshing it) are left out: Zed runs a server's commands only from the keys of keymap.json and the code actions, and those are not among them. - Helix ❌: The commands are not among Helix's code actions yet.
A journal (org-journal)#
93% (14 of 15)
- ✅ A file a day, week, month or year in
org_journal_dir, an entry for each day and one for each time (org-journal-new-entry), today's entry only withC-u - ✅ An entry for a date asked for, and a TODO entry for a day to come with its timestamp (
org-journal-new-date-entry,org-journal-new-scheduled-entry) - ✅ The next and the previous entry, and the file of today (
org-journal-next-entry,org-journal-previous-entry,org-journal-open-current-journal-file) - ✅ Carrying the items
org_journal_carryover_itemsmatches over to the new day, with the headlines above them; deleting the entry or file left empty - ✅ The other entries folded (
org_journal_hide_entries_p) - ✅ The journal's files from yesterday on in the agenda (
org_journal_enable_agenda_integration) - ✅ Searching the journal between two days, every day, from today on, and its TODO entries to come (
org-journal-search…), each result linking to its line - ✅ The entries to come with a timestamp, in a schedule of their own (
org-journal-schedule-view) - ✅ Moving an entry to come to another day (
org-journal-reschedule-scheduled-entry) - ✅ The days with an entry marked in the date prompt's calendar (
org-journal-mark-entries) - ✅ The keys org-journal adds to
M-x calendar(j r,j d,[,],j n,j m,j s f…), in the calendarorg.goto.calendaropens - ❌ Files encrypted whole (
org-journal-encrypt-journal) - ✅ The file of a day in another window, or in the window of the command (
org-journal-find-file-fn) - ✅ Following the calendar:
]and[show the entry of the day (org-journal-follow-mode) - ✅ Remembering the dates between commands (
org-journal-enable-cache) is not needed: it only spares Emacs reading the files again, and the days are the same; the server reads the directory each time
Where editors fall short:
- Sublime Text ❓: The calendar and the keys org-journal adds to it are left out: the package shows no date prompt.
- Zed ❓: For the dates and searches the commands ask for, the answer is typed as a rename at the cursor (
F2), as Zed has no box of its own for typed text. The other entries stay as they show: Zed lets no server fold. Files without an extension are Org files only withfile_typesin Zed's settings. The calendar and the keys org-journal adds to it are left out: Zed shows no date prompt. The entries to come (TODO, and with a date) are left out: they have no key in keymap.json and are not among the code actions. - Helix ❌: The commands are not among Helix's code actions yet.
Refile and archive#
100% (13 of 13)
- ✅ Refiling to a heading, between files too (
org-refile-targets) - ✅ Archiving a subtree to its archive file
- ✅ Archiving to the archive sibling
- ✅ Toggling the
ARCHIVEtag - ✅ Archive locations,
ARCHIVEproperties, date trees,ARCHIVE_…context - ✅ Archiving all done subtrees
- ✅ The archive file saved, or left with its changes in the editor, as
org-archive-subtree-save-file-psays (from the agenda it is not, by default) - ✅ Logging refiles (
org-log-refile) - ✅ Creating parent nodes as the target (
org-refile-allow-creating-parent-nodes) - ✅ Refiling a selection that is not whole subtrees, its first line made a headline (
org-refile-active-region-within-subtree, through Emacs) - ✅ Refiling a region (a selection of whole subtrees)
- ✅ Copying (
C-c M-w), going to a target (C-u C-c C-w) and to the last refiled entry (C-u C-u C-c C-w) - ✅
org-refile-target-verify-function(the function run by Emacs at each headline)
Where editors fall short:
- Zed ❓: Archiving every done subtree (
org.archive.done) is left out: it has no key in keymap.json and is not among the code actions. - Helix ❓: Copying an entry to a target, going to a target and to the entry refiled last, and archiving every done subtree, are left out: they are not among Helix's code actions. Refiling picks the target from the code actions, where the targets come first once asked for.
Links#
96% (23 of 24)
- ✅ Following links: headlines, targets, custom IDs, files with searches, IDs, URLs, timestamps, tags
- ✅ Storing and inserting links, with descriptions, editing the link at the cursor
- ✅ IDs created (
org-id-get-create) - ✅ Completion of file names, headlines and custom IDs in links
- ✅ Backlinks, hovers and clickable links (beyond Emacs: references, document links)
- ✅ Link abbreviations (
#+LINK:,org-link-abbrev-alist) - ✅ Link abbreviations that call a function (
%(…)), through Emacs, when the function is safe - ✅ A region as the search of a stored link, and as the description of a link inserted
- ✅ Completing
id:links to entries, which get an ID (org-id-complete; Org completes nohelp:links) - ✅ Default descriptions from the link type: an
id:link's headline, aninfo:link's command - ✅ Moving to the next and previous link (
C-c C-x C-n,C-c C-x C-p) - ✅ A search by regular expression (
file:x.org::/regexp/): a sparse tree of its matches (org-occur), in the file the link is in - ✅ Making a missing headline a link searches for, or looking for its words in the text (
org-link-search-must-match-exact-headline);doi:links atorg-link-doi-server-url - ✅ Following a link, a timestamp or a citation with
RET(org-return-follows-link) - ✅ Which program opens a linked file (
org-file-apps): the editor, the system's application or a shell command;C-uopens it in the editor,C-u C-uby the system - ✅ Opening a linked file that is not there with its program rather than saying
No such file(org-open-non-existing-files) - ✅ A link to a directory opening the
index.orgin it (org-open-directory-means-index-dot-org) - ✅ Following a
shell:link: its command runs once the user says yes toExecute … in shell?, or at once whenorg-link-shell-skip-confirm-regexpmatches it; what it writes is a message (its first 50 lines, 8000 characters at most), which Emacs shows in a buffer when long - ✅ Following an
elisp:link (org-link--open-elisp): once the user says yes toExecute … as Elisp?, Emacs evaluates the form (or calls the command it names) and its value is said,(+ 1 2) => 3; in a buffer of Emacs's own in the link's directory, not in the file, which only the editor has - ❌ Links that open one of Emacs's own programs (
help:,eshell:,eww:,w3m:,irc:,gnus:,rmail:,mhe:,bbdb:,docview:,shortdoc:): following one saysLinks of type "help" are not supported, and they are not completed after[[ - ✅ Following a
bibtex:link, or afile:link into a.bibfile, to the entry of the key after::(org-bibtex-open,org-execute-file-search-in-bibtex) - ✅ Following a
man:link withol-maninorg_modules(org-man-open): the pageorg_man_commandwrites, as text in a file of the server's rather than a*Man*buffer, at the line before the first match of the search after::; in brackets only, the parser knowing noman:type (womanisman); unlike Emacs, a link that would givemanan option or a file (man:-l /etc/hostname,man:/etc/hostname) is refused - ✅ Following an
info:link (org-info-open): Emacs's manuals and those oforg-info-other-documentsopen on the web at the node, as Org's export links them (org-info-map-html-url); another manual is the node theinfoprogram writes, as text, rather than Emacs's Info reader - ✅
org-ctagsinorg_modules: a link to a headline, a target or a custom ID goes first to the tag of theTAGSfile of its directory, or, asorg-ctags-open-link-functionssays, makes that file again (org-ctags-create-tags), appends a topic (org-ctags-new-topic-template) or opens an Org file of that name;org.ctags.createandorg.ctags.find(org-ctags-find-tag-interactive). TheTAGSfile is the directory's, never asked for (visit-tags-table); of several tags of a name, the first
Where editors fall short:
- Zed ❓: A link's target is typed, without completion: the answer is typed as a rename at the cursor (
F2), as Zed has no box of its own for typed text. Following works through go to definition, for links inside Org files and to files. Creating an ID (org.id.create) is left out: it has no key in keymap.json and is not among the code actions. - Helix ❓: Storing and inserting links in an Org file, and creating an ID, are left out: they are not among Helix's code actions there (the agenda stores a link to its line's entry); moving between links needs a key. Following works through go to definition, and through the code action Open the link or thing at the cursor for the links it cannot open in Helix (web pages, abbreviations, attachments).
Footnotes#
100% (4 of 4)
- ✅ Following a reference to its definition and back
- ✅ Highlighting and checking (
org-lint) - ✅ Creating a footnote (
C-c C-x f, through Emacs) - ✅ Renumbering, sorting, normalizing and deleting footnotes (through Emacs)
Where editors fall short:
- Helix ❓: Making footnotes and their menu are left out: they are not among Helix's code actions. Following them works.
Tables#
100% (19 of 19)
- ✅ Aligning (
C-c C-c, formatting) - ✅ Moving between fields (
TAB,S-TAB), a row made past the last - ✅ Their options: what counts as a number for right alignment, aligning only on
C-c C-c, a row before a rule rather than past it, the shrunk columns' indicator (org-table-number-regexp,org-table-automatic-realign,org-table-tab-jumps-over-hlines,org-table-shrunk-column-indicator) - ✅ Moving, inserting and deleting rows and columns
- ✅ Rules (
C-c -,C-c RET) - ✅ Blanking a field
- ✅ Sorting rows
- ✅ The
#+TBLFM:line following moved columns and rows - ✅ Rectangles: cutting, copying and pasting the cells of a selection (through Emacs)
- ✅ Copying down (
S-RET, through Emacs) - ✅ Editing a field in a file of its own (
org-table-edit-field, through Emacs): put back, the table realigned, each time it is saved - ✅ Shrunk columns (
<5>):C-c TAB,org-startup-shrink-all-tablesand#+STARTUP: shrink; the hidden text concealed where the editor can hide it,…drawn in its place or an inlay hint - ✅ Every table aligned when a file opens (
org-startup-align-all-tables,#+STARTUP: align,noalign) - ✅ Creating an empty table (
C-c |, through Emacs) - ✅ Making a table from a region (
C-c |on a selection, through Emacs) - ✅ Summing (
C-c +) and field information (C-c ?), through Emacs - ✅ Moving the field with the shifted cursor keys (through Emacs)
- ✅ Importing and exporting tables (
org-table-import,org-table-export, through Emacs) - ✅ Plotting with gnuplot as the
#+PLOT:lines say (org-plot/gnuplot,C-c " g, through Emacs with gnuplot.el and gnuplot), and a column of bars in the table (orgtbl-ascii-plot,C-c " a, through Emacs)
Where editors fall short:
- Sublime Text ❓: A shrunk column shows its whole text and
…: Sublime Text cannot hide text in a view. - Zed ❓: Moving between fields with
TABand copying down (S-RET) are left out: those keys stay Zed's own. For a new table's size, the answer is typed as a rename at the cursor (F2), as Zed has no box of its own for typed text. A shrunk column shows its whole text and…: Zed lets no server hide text. - Helix ❓: Moving between fields with
TAB, copying down, summing, field information creating a table and a rule with a move below it are left out: Helix cannot bind a key to a server's command (the commands are code actions,Space a), and those are not among them. The other edits are code actions in a table. A shrunk column shows its whole text and…: Helix lets no server hide text; the…of Shrink or expand the table column shows once the text changes, when Helix asks for inlay hints again (it cannot be told to sooner).
Table formulas#
100% (13 of 13)
- ✅ Column, field and range formulas
- ✅ References by row, column, hline and name
- ✅ Parameters and constants
- ✅ Calc's arithmetic, vectors, dates and durations
- ✅ Modes and formats (
;%.2f,;N,;T) - ✅ Recalculating the line, the table, until stable
- ✅ Their options: constants for every file, references stopping at rules, columns made past the last, durations' format, Calc's default modes, formulas in fields left as text, no recalculation of
#lines (org-table-formula-constantsand the rest, set for Emacs too where it computes) - ✅ Formulas in Emacs Lisp (through Emacs)
- ✅ Remote references (through Emacs)
- ✅ Units (through Emacs)
- ✅ Calc's fractions, symbolic mode and engineering notation (through Emacs)
- ✅ The formula editor (
C-c ', through Emacs): the table's formulas in a file of their own, installed each time it is saved - ✅ The formula debugger (
C-c {, through Emacs): while it is on, recalculating asks after each formula whether to go on, its substitution history with the question; answered no, what was computed so far stays
Where editors fall short:
- Zed ❓: Iterating until the table is stable (
org.table.iterate) is left out: it has no key in keymap.json and is not among the code actions. - Helix ❓: Recalculating the current line only, iterating until the table is stable and the formula debugger are left out: they are not among Helix's code actions, which recalculate the whole table.
Code blocks (Babel)#
100% (12 of 12)
- ✅ Tangling, with Noweb references, comments and header arguments from properties
- ✅ Tangling's options: extensions by language, the link comments' format and paths, comments left uncommented, the Org text of comments as it is, the default file mode, deleting files before writing them, Noweb references between other strings (
org-babel-tangle-lang-exts,org-babel-tangle-comment-format-beg,org-babel-noweb-wrap-startand the others) - ✅ Evaluating a block, a
#+CALL:line and inline code (through Emacs) - ✅ Evaluating the file's and the subtree's blocks
- ✅ Removing results
- ✅ Sessions
- ✅ Asking before evaluating (
org-confirm-babel-evaluate) - ✅ Editing a block in a file of its own (
C-c ', through Emacs): code, example, export and comment blocks, footnote definitions, LaTeX, inline code; each save of the file writes it back and saves the Org file - ✅ Tangling's Emacs Lisp (evaluated header arguments,
<<block()>>; through Emacs) - ✅ Detangling (
org-babel-detangle, through Emacs): the code of a file tangled with:comments linkput back into the blocks of this file it came from, the file asked for among those this file tangles to - ✅ Moving between blocks (
C-c C-v n,C-c C-v p,C-c C-v g,C-c M-f,C-c M-b; through Emacs) - ✅ The Library of Babel (
C-c C-v i, through Emacs)
Where editors fall short:
- Zed ❓: Detangling (
org.babel.detangle) is left out: it has no key in keymap.json and is not among the code actions. - Helix ❓: Only tangling, the block at the cursor and editing it in a file of its own are offered (code actions in a block): the file's and the subtree's evaluation, removing results, detangling and moving between blocks need keys, which Helix cannot give a server.
Export and publishing#
100% (9 of 9)
- ✅ The export menu, with the backends Emacs has (through Emacs)
- ✅ Body only and the subtree at the cursor
- ✅ To a buffer, to a file, and opened
- ✅ Publishing a file, a project, all projects
- ✅ Forcing publishing
- ✅ Exporting in the background: every export runs in the background, the editor never waits for it
- ✅ Only the visible part (
C-v): what the editor has folded left out - ✅ The export stack (
&): what the exports made, the last first, to show again - ✅ Inserting a template (
#, through Emacs)
Where editors fall short:
- VS Code ❓: VS Code does not tell an extension which folds are closed: with
C-veverything is exported. - Helix ❌: Not offered as a code action yet.
Citations#
82% (9 of 11)
- ✅ Bibliographies from
#+BIBLIOGRAPHY:andorg_cite_global_bibliography(BibTeX, CSL-JSON) - ✅ Keys completed
- ✅ A key's entry on hover, following a key
- ✅ Unknown keys reported
- ✅ Inserting, editing and deleting citations (
C-c C-x @) - ✅ No processor to insert citations, or one of Org's that cannot (
org-cite-insert-processor) - ❌ A package's processor to insert citations, citar's (
org-cite-insert-processor) - ✅ BibTeX entries as headlines (
ol-bibtex.el): the entries of the file's headlines written to a.bibfile (org-bibtex,org.bibtex.export), the entry at the cursor copied as BibTeX (org-bibtex-export-to-kill-ring,org.bibtex.copy), with the prefix, the type and key properties, the keywords as tags and the fields of any property (org_bibtex_*) - ✅ A new BibTeX entry, its type and fields asked for in turn (
org-bibtex-create,org-bibtex-create-in-current-entry), and the fields entries lack (org-bibtex-check,org-bibtex-check-all); with a count the optional fields too; keys made bybibtex-generate-autokeythrough Emacs (org_bibtex_autogen_keys) - ✅ A BibTeX entry pasted as a headline (
org-bibtex-yank, from the clipboard), and the entries of a BibTeX file imported (org-bibtex-import-from-file) - ❌ The rest of
ol-bibtex.el: the help on a field while it is asked for (*BibTeX Help*);org-bibtex-headline-format-function, a Lisp function (its default, the title, is what a headline gets); searching the agenda files for entries (org-bibtex-search); reading an entry in a.bibfile and storing a link to it (org-bibtex-read,org-bibtex-store-link): org-lsp serves no BibTeX files
Where editors fall short:
- Zed ❓: The BibTeX commands' fields are asked for in turn, and the answer is typed as a rename at the cursor (
F2), as Zed has no box of its own for typed text. Those without a key of Org's (a new entry, copying, exporting, pasting and importing BibTeX) are left out: they are not among the code actions. - Helix ❓: Inserting citations and the BibTeX commands are not offered as code actions yet. Completion, hover and following work.
Diagnostics (org-lint)#
100% (61 of 61)
- ✅ org-lint's checkers (61 of 61)
Indentation and formatting#
100% (8 of 8)
- ✅ Virtual indentation (
org-indent-mode,#+STARTUP: indent), turned on and off in a file by command (M-x org-indent-mode,org.indent.mode) - ✅ Hidden leading stars (
org-hide-leading-stars) - ✅ Hard indentation (
org-adapt-indentation) - ✅ Indenting lines and regions (
org-indent-line,org-indent-region) - ✅ Aligning tables and tags
- ✅ Lines a long line wraps into indented (
wrap-prefix): under the line's own indentation, a headline's title, an item's text (org-list-item-body-column), past the prefix of virtual indentation where the editor can repeat it - ✅ Other widths of virtual indentation, stars left showing and
org-adapt-indentationleft on with it (org-indent-indentation-per-level,org-indent-mode-turns-on-hiding-stars,org-indent-mode-turns-off-org-adapt-indentation) - ✅ Numbered headlines (
org-num-mode,#+STARTUP: num), as inlay hints, with its options (org-num-max-level,org-num-skip-commented,org-num-skip-footnotes,org-num-skip-tags,org-num-skip-unnumbered)
Where editors fall short:
- Neovim ❓: The lines a long line wraps into line up with its own indentation, a headline's title or an item's text ('breakindent'), without the prefix of virtual indentation before them: Neovim repeats no inline virtual text on them, and 'breakindentopt' shifts all the lines of a window alike. A line with a long link wraps as if the link's hidden target took room: Neovim counts concealed text when it wraps; the org-roam buffer, whose links are long, does not wrap.
- Vim ❓: The lines a long line wraps into line up with its own indentation, a headline's title or an item's text ('breakindent'), without the prefix of virtual indentation before them: Vim repeats no virtual text on them, and 'breakindentopt' shifts all the lines of a window alike.
- VS Code ❓: The lines a long line wraps into are not indented as Org does: VS Code indents them by the line's own leading whitespace (
editor.wrappingIndent), the same way for every line, without the prefix of virtual indentation, a decoration it does not count. - Sublime Text ❓: Virtual indentation shows as phantoms, the leading stars still showing; new lines are not indented as they are typed. The lines a long line wraps into are not indented as Org does: Sublime Text indents them by the line's own leading whitespace (
indent_subsequent_lines). - Zed ❓: Virtual indentation shows as inlay hints, the leading stars still showing; new lines are not indented as they are typed. With soft wrap on, the lines a long line wraps into line up with the prefix and its own indentation, not with a headline's title or an item's text: Zed wraps under a line's leading blanks, inlay hints among them. Numbering the headlines by command (
org-num-mode) is left out: it has no key in keymap.json and is not among the code actions;#+STARTUP: numnumbers them. - Helix ❓: Virtual indentation shows as inlay hints, the leading stars still showing; new lines are not indented as they are typed. With soft wrap on (
soft-wrap.enable), the lines a long line wraps into line up with the prefix and its own indentation, not with a headline's title or an item's text: Helix wraps under a line's leading blanks, inlay hints among them. Numbering the headlines by command (org-num-mode) is left out: it is not among Helix's code actions;#+STARTUP: numnumbers them.
Notes and logging#
100% (6 of 6)
- ✅ Notes (
org-add-note), in the log or theLOGBOOKdrawer - ✅ Notes and times on state changes
- ✅
LOG_INTO_DRAWERand theLOGGINGproperty - ✅ Logging rescheduled dates and deadlines (
org-log-reschedule,org-log-redeadline) - ✅ The headings of notes (
org-log-note-headings), the latest note first or last (org-log-states-order-reversed, for clock lines too), notes after drawers (org-log-state-notes-insert-after-drawers),CLOSED:without the time (org-log-done-with-time) - ✅ Late-night changes counted on the day before (
org-use-effective-time,org-todo-yesterday,org-agenda-todo-yesterday), or at the last clock-out (org-use-last-clock-out-time-as-effective-time)
Where editors fall short:
- Zed ❓: A note is one line, with no buffer to write it in: the answer is typed as a rename at the cursor (
F2), as Zed has no box of its own for typed text. Changing a TODO state as if it were yesterday is left out: it has no key in keymap.json and is not among the code actions. - Helix ❓: A note is one line, with no buffer to write it in: the answer is typed as a rename at the cursor (
Space r), as Helix has no box of its own for a server to ask for text. Adding a note is a code action in the agenda, not in an Org file.
Completion and editing helpers#
100% (5 of 5)
- ✅ Completion: TODO keywords, tags,
#+keywords and#+STARTUP:values, blocks, drawers, properties, entities, link targets - ✅ Structure templates (
C-c C-,, through Emacs) - ✅ Emphasis (
C-c C-x C-f, through Emacs) - ✅ Inserting a drawer (
C-c C-x d, through Emacs) - ✅ The version (
org-version): the server's, with the commit it was built from
Where editors fall short:
- Helix ❓: Structure templates, emphasis and drawers are not among Helix's code actions.
Timers#
100% (5 of 5)
- ✅ The relative timer: starting, inserting its value, pausing and stopping (through Emacs)
- ✅ Timer items in lists (
C-c C-x -, through Emacs) - ✅ Countdowns (
C-c C-x ;), the effort taken when there is one (through Emacs) - ✅ The timer in the status line, as in the mode line (
<0:05:23>,org-timer-display) - ✅ Starting with an offset (
C-u), shifting the timer values of a selection (C-u C-u, or the selection alone; through Emacs)
Where editors fall short:
- Zed ❓: For a countdown's length, the answer is typed as a rename at the cursor (
F2), as Zed has no box of its own for typed text. No timer in the status line: Zed has no place there for an extension's text. - Helix ❌: Timers are left out: Helix cannot bind a key to a server's command (the commands are code actions,
Space a), and they are not among them.
Attachments#
100% (2 of 2)
- ✅ Attaching files to an entry (
C-c C-a): attaching, opening, deleting, synchronizing, the directory set (through Emacs, whose options, such asorg-attach-methodandorg-attach-id-dir, are set inemacs_options); the dispatcher has Org's keys butb,OandF(an Emacs buffer, Emacs, Dired), whateverorg-attach-commandssays - ✅
attachment:links (through Emacs)
Where editors fall short:
- Zed ❓:
attachment:links open; the dispatcher's keys come as buttons, and for the file to attach, the answer is typed as a rename at the cursor (F2), as Zed has no box of its own for typed text. - Helix ❓:
attachment:links open; the dispatcher (C-c C-a) is left out: Helix cannot bind a key to a server's command (the commands are code actions,Space a), and it is not among them.
Encryption#
100% (2 of 2)
- ✅ Encrypting and decrypting an entry, and the entries tagged
crypt(org-crypt, through Emacs and GnuPG): fororg-crypt-keyor theCRYPTKEYproperty, or with a passphrase GnuPG's pinentry asks for - ✅ Encrypting before saving, with
org-crypt-use-before-save-magicin the Emacs configuration (LSP'swillSaveWaitUntil, for editors that send it)
Where editors fall short:
- Zed ❓: Encrypting and decrypting by command are left out: they have no key in keymap.json and are not among the code actions. Encrypting before saving needs an editor that sends LSP's
willSaveWaitUntil. - Helix ❓: Encrypting and decrypting by command are left out: they are not among Helix's code actions. Encrypting before saving needs an editor that sends LSP's
willSaveWaitUntil.
Inline images and LaTeX previews#
100% (5 of 5)
- ✅ Previews of links to images (
org-link-preview,C-c C-x C-v): the link at the cursor, the section, the file, with links with a description (counts 1, 11), cleared (4, 64);#+STARTUP: inlineimages - ✅ LaTeX previews (
org-latex-preview,C-c C-x C-l), made by Emacs as Org makes them (latex,dvipng, intoltximg/);#+STARTUP: latexpreview - ✅ Previews of
attachment:links (the file found through Emacs,org-attach-expand) - ✅ The width an image shows at (
org-image-actual-width,#+ATTR_ORG: :width, theORG-IMAGE-ACTUAL-WIDTHproperty) and the most (org-image-max-width) - ✅ The images of
http:andhttps:links (org-display-remote-inline-images:downloadeach time they show, orcacheonce for the session), downloaded withcurlinto a private directory asorg-resource-download-policyandorg-safe-remote-resourcesallow, after asking asorg--confirm-resource-safedoes (y,n,f,d,!), but not when a file opens. Emacs shows remote files (TRAMP) so, which org-lsp has not, and not URLs; the regexps the answers!,dandfadd are kept for the session, not saved with Customize
Where editors fall short:
- Neovim ❓: From Neovim 0.13 (
vim.ui.img), in a terminal with the Kitty graphics protocol: an image shows below its line, not over the link; images other than PNG need ImageMagick. - Vim ❌: Vim cannot show images.
- VS Code ❓: VS Code cannot leave lines free for an image: an image takes the place of its link only as high as a line, and shows whole on hover (at the width Org gives it, at most 600 pixels). Counts through a key's
args. - Sublime Text ❓: An image shows below its line (a phantom), not over the link; PNG, JPEG and GIF only. Counts through a key's
args. - Zed ❌: Zed lets no extension show images in a file.
- Helix ❌: Helix cannot show images.
Options#
Each of the 1025 options of Org 9.8.10 (its defcustom forms), and what org-lsp does with
it. Of the 376 that change what org-lsp does itself, 96% can be set.
scripts/org-options.json says it for each; scripts/check.sh fails when the
server has a setting that file does not know of, or, with ORG_LISP_DIR,
when Org has an option it does not list.
| Status | Options | Meaning |
|---|---|---|
| setting | 350 | A setting of the same name |
| missing | 15 | org-lsp does what the option is about, but the option cannot be set yet |
| other | 11 | Done another way, as its note says |
| emacs | 479 | Read by Emacs, through which org-lsp does that part of Org (export, Babel, attachments, column view…): set it in emacs_options (or emacs_config); emacs-options.org lists them |
| lisp | 48 | Its value is Lisp (a function, a hook), which the server does not run |
| absent | 49 | Part of something org-lsp does not do |
| emacs-only | 73 | About Emacs itself (windows, faces, menus, the mouse, the mode line): nothing to do in an editor |
Done another way#
org-agenda-skip-timestamp-if-deadline-is-shown- no effect in Org 9.8.10:
org-agenda-get-timestampslooks the entry up withassqin a list of positions, which finds none; none here either org-archive-stamp-time- no effect in Org 9.8.10, which keeps it for old configurations:
org_archive_save_context_infowithtimedecides org-cycle-level-after-item/entry-creation- the setting
org_cycle_level_after_item_entry_creation, its name without the/ org-id-locations-file-relative- org-lsp reads the locations file and never writes it; names in it that are not absolute are relative to its directory, as Emacs reads them
org-tab-follows-link- TAB is the editor's key for folding and tables; a link is followed with org.open (C-c C-o), go to definition, or RET with org_return_follows_link
org-protocol-reverse-list-of-filesorg-lsp protocoltakes one URL at a time, as the system gives it: there is no list of file names fromemacsclientto put back in orderorg-table-formula-use-constants- only for a formula evaluated on its own (
C-c =, a field starting with=), which org-lsp does not do; the formulas of#+TBLFM:lines always use the constants, in Emacs too org-startup-truncated- the editor decides how long lines wrap
org-special-ctrl-a/e- the setting
org_special_ctrl_a_e, its name without the/ org-timestamp-rounding-minutes- the setting
org_time_stamp_rounding_minutes, its name before Org 9.6 org-src-fontify-natively- the editors' option
src_highlight(Neovim, Vim); VS Code and Sublime Text color the code of blocks by their grammars, always
Missing#
Options of what org-lsp does that cannot be set yet, by the file of Org they are in.
- org-agenda.el (3)
org-agenda-menu-show-matcher- Whether the agenda dispatcher shows the match of each custom command.
org-agenda-menu-two-columns- The agenda dispatcher's custom commands in two columns.
org-agenda-bulk-mark-char- The character that marks an agenda line for a bulk action.
- org-clock.el (3)
org-clock-string-limit- How long the running clock's text (
clock_status()in Neovim and Vim) may be. org-clock-mode-line-total- Which time the running clock's text shows: today's, this session's, all of it, or since the last reset.
org-clock-task-overrun-text- The text before the running clock's when it is past the entry's effort.
- org-compat.el (1)
org-imenu-depth- How deep the outline goes: the document symbols have every level.
- org-cycle.el (2)
org-cycle-skip-children-state-if-no-children- Whether
TABon a headline without children skips the CHILDREN state when it cycles. org-cycle-emulate-tab- What
TABdoes off a headline (indent, or cycle the whole file at the start of the buffer); the editors run their ownTabthere.
- org-fold.el (1)
org-fold-show-context-detail- org.el (5)
org-highlight-links- Which kinds of links (bracket, angle, plain, radio, tag, date, footnote) are colored: the server colors all of them.
org-fast-tag-selection-maximum-tags- How many tags the fast tag selection shows, its keys a to z and more.
org-level-color-stars-only- Headlines colored by level in their stars alone, not their text.
org-fontify-whole-block-delimiter-line- The
#+begin_and#+end_lines of blocks colored to the edge of the window. org-highlight-latex-and-related- Which of LaTeX fragments, sub- and superscripts and entities are colored: the server colors LaTeX always.
Not done#
Options of what org-lsp does not do, by the file of Org they are in.
- oc-basic.el (2)
org-cite-basic-sorting-field,org-cite-basic-author-year-separator- ol-bbdb.el (5)
org-bbdb-default-anniversary-format,org-bbdb-general-anniversary-description-after,org-bbdb-anniversary-format-alist,org-bbdb-anniversary-field,org-bbdb-extract-date-fun- ol-gnus.el (2)
org-gnus-prefer-web-links,org-gnus-no-server- ol-mhe.el (1)
org-mhe-search-all-folders- ol.el (3)
org-link-elisp-skip-confirm-regexp,org-link-email-description-format,org-link-from-user-regexp- org-agenda.el (7)
org-agenda-confirm-kill- Asking before
C-kin the agenda deletes an entry with its subtree: the agenda has noC-k. org-agenda-diary-file- The file
iin the agenda adds diary entries to. org-agenda-include-diary- Entries of Emacs's diary (
diary-file) in the agenda; diary sexps in Org files are. org-agenda-clock-consistency-checks- The agenda's clock check (
v c): gaps, overlaps and too long or short clocks in the log. org-agenda-insert-diary-strategy- Where
iin the agenda adds an entry to an Org diary file. org-agenda-insert-diary-extract-time- Whether
iin the agenda reads a time from the entry's text. org-agenda-loop-over-headlines-in-active-region- An agenda command run on a selection of agenda lines acts on each of them, as bulk actions do.
- org-feed.el (5)
org-feed-alist,org-feed-drawer,org-feed-default-template,org-feed-save-after-adding,org-feed-retrieve-method- org-fold.el (2)
org-fold-catch-invisible-edits- An edit in folded text is refused, shown or allowed, as the option says: the editors edit what is folded as they do.
org-fold-catch-invisible-edits-commands- The commands
org-fold-catch-invisible-editschecks.
- org-keys.el (2)
org-use-speed-commands- Speed keys: single letters at the start of a headline (
n,p,t,c…) run commands, asorg-speed-commandslists. org-speed-commands- The keys and commands of speed keys (
org-use-speed-commands).
- org-mobile.el (13)
org-mobile-files,org-mobile-files-exclude-regexp,org-mobile-directory,org-mobile-allpriorities,org-mobile-use-encryption,org-mobile-encryption-tempfile,org-mobile-encryption-password,org-mobile-inbox-for-pull,org-mobile-index-file,org-mobile-agendas,org-mobile-force-id-on-agenda-items,org-mobile-force-mobile-change,org-mobile-checksum-binary- org-table.el (5)
orgtbl-optimized,orgtbl-radio-table-templates,org-table-auto-blank-field,org-table-exit-follow-field-mode-when-leaving-tableorg-table-header-line-p- A table's header row kept in view when the table scrolls past it.
- org-tempo.el (1)
org-tempo-keywords-alist- org-tempo's keyword templates:
<A+TABand its kin insert#+ascii:and other keywords;<s+TABfor blocks is not done either.
- org.el (1)
org-loop-over-headlines-in-active-region- A command run on a selection (a TODO state, a schedule, a deadline, a priority, archiving) acts on each headline in it.