org-lsp

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.

FeatureParityDone
Highlighting100%21 of 21
Folding and visibility91%10 of 11
Headings and structure96%26 of 27
Lists and checkboxes93%14 of 15
TODO keywords100%14 of 14
Priorities100%4 of 4
Tags88%7 of 8
Properties and column view100%10 of 10
Dates and times100%10 of 10
Agenda97%38 of 39
Clocking100%14 of 14
Capture100%12 of 12
org-protocol86%6 of 7
Notes (org-roam)94%15 of 16
A journal (org-journal)93%14 of 15
Refile and archive100%13 of 13
Links96%23 of 24
Footnotes100%4 of 4
Tables100%19 of 19
Table formulas100%13 of 13
Code blocks (Babel)100%12 of 12
Export and publishing100%9 of 9
Citations82%9 of 11
Diagnostics (org-lint)100%61 of 61
Indentation and formatting100%8 of 8
Notes and logging100%6 of 6
Completion and editing helpers100%5 of 5
Timers100%5 of 5
Attachments100%2 of 2
Encryption100%2 of 2
Inline images and LaTeX previews100%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: descriptivelinks or literallinks); a description and a target shown each in a look of its own, as nvim-orgmode has them, where Org gives the whole link org-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: entitiespretty or entitiesplain): 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-done past their keyword (org-fontify-done-headline at 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_highlighting on. 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.sh puts 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), the VISIBILITY property, 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 unless org-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
  • ✅ TAB on 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 as org-blank-before-new-entry says, 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 and TAB on a new headline two stars at a time, the headlines' faces, LEVEL in matches and %l in 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 commands org.levels.odd and org.levels.oddeven
  • ✅ Inline tasks (org-inlinetask), headlines of org-inlinetask-min-level stars or more, 15 by default: inserted with their END line (C-c C-x t, org-inlinetask-insert-task, around the selection, in org-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 their END line; their stars but the last two hidden as leading stars are, the rest in the org-inlinetask face; listed by the agenda as Emacs lists them
  • ❌ Inline tasks: M-<up> and M-<down> on one (Emacs drags the element), its text as the parser's (inlinetask in org-element: here the text after a task without END line is the task's), the first star in org-warning with org-inlinetask-show-first-star (here no star is hidden then), the END line 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): always by default, where Emacs's default is nil
  • ✅ Moving a subtree up and down
  • ✅ Cutting, copying and pasting subtrees, their level fitted
  • ✅ Yanking subtrees with C-y at 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-k on 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-e and C-k on headlines and items, to the title and the tags (org-special-ctrl-a/e, org-special-ctrl-k)
  • ✅ C-o opening 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 with c (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-d gone with the next change, or kept, following the text, until C-c C-c (org-remove-highlights-with-change); those of a sparse tree by tags or a property kept either way, as org-scan-tags keeps them

Where editors fall short:

  • VS Code ❓: VS Code does not tell an extension which folds are closed: C-k on 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-k and C-y keep Zed's own meaning, and nothing pasted is folded: Zed lets no server fold.
  • Helix ❓: Moving between headings, org-goto and Org's C-a, C-e, C-k and C-y are 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)
  • ✅ RET in 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-c on it (org-update-statistics-cookies), from the boxes or, on a headline, its children's TODO keywords
  • ❌ C-c C-c elsewhere on a headline: org-lsp toggles the boxes below it (org-toggle-checkbox, as C-c C-x C-b does), where Emacs sets the tags (org-set-tags-command, org.tags.set here)
  • ✅ 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 ❓: RET stays Zed's own, and so do Shift and Alt with the arrows, which cycle bullets and move items in Org.
  • Helix ❓: RET stays 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: and org_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-statistics says, 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, ORDERED siblings and checkboxes (org-enforce-todo-dependencies)
  • ✅ A tag that shows the ORDERED property (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-tasks invisible)

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 with S-<left> and S-<right>
  • ✅ Effort (C-c C-x e) and ORDERED
  • ✅ 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-format says, their values joined as org-property-separators says; efforts in the units of org-duration-units (once org-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-format and org-id-include-domain say
  • ✅ IDs looked for where org-id-track-globally, org-id-search-archives, org-id-extra-files and org-id-locations-file say; id: links completing to org-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 toggling ORDERED are 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 with org-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 …), and N r itself: left out, the keys being the editor's; T in 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), in tags-todo too (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-format and 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 of diary-lib and Org (diary-anniversary, -block, -cyclic, -date, -float, org-class …) with and, or, not and 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): .org and 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's appt.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), enter and tab going 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-format says (1d 2:30, 26:30, 1.09d, 1d2h15min) and read with the units of org-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-u for 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 with org-clock-resolve-expert. A clock found running when the server starts shows as the clock, and C-c C-x C-o stops 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 whose CLOCK: 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-clocking under 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 …)
  • ✅ function and file+function targets (the function run by Emacs)
  • ✅ %(…) (Emacs Lisp, through Emacs)
  • ✅ %[file]
  • ✅ %c, %x and %^C (the editor's clipboard)
  • ✅ %:keyword (the properties of the link %a makes: :annotation, :initial, and an id: 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 by org-lsp protocol URL, which scripts/install.sh protocol makes the system's handler of the scheme
  • ✅ New-style (?url=…&title=…) and old-style (:/URL/TITLE) URLs, read as org-protocol.el reads them (org-protocol-data-separator)
  • ✅ store-link: the link stored for C-c C-l, with Emacs's message (org-protocol-store-link)
  • ✅ capture: a capture with the URL's template or org-protocol-default-template-key, its %:link, %:description, %i and %a from the page (org-protocol-capture)
  • ✅ open-source: the file of a published page, through org-protocol-project-alist and 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_editor started 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 an ID, as org-roam-db-sync finds 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 as org_roam_node_display_template shows 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+olp and node targets; capturing to a node (org-roam-capture)
  • ✅ roam: links: following them, completing them, replacing them with id: 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-formatter as 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 with C-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_items matches 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 calendar org.goto.calendar opens
  • ❌ 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 with file_types in 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 ARCHIVE tag
  • ✅ Archive locations, ARCHIVE properties, 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-p says (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.

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 no help: links)
  • ✅ Default descriptions from the link type: an id: link's headline, an info: 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 at org-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-u opens it in the editor, C-u C-u by 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.org in it (org-open-directory-means-index-dot-org)
  • ✅ Following a shell: link: its command runs once the user says yes to Execute … in shell?, or at once when org-link-shell-skip-confirm-regexp matches 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 to Execute … 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 says Links of type "help" are not supported, and they are not completed after [[
  • ✅ Following a bibtex: link, or a file: link into a .bib file, to the entry of the key after :: (org-bibtex-open, org-execute-file-search-in-bibtex)
  • ✅ Following a man: link with ol-man in org_modules (org-man-open): the page org_man_command writes, 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 no man: type (woman is man); unlike Emacs, a link that would give man an 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 of org-info-other-documents open on the web at the node, as Org's export links them (org-info-map-html-url); another manual is the node the info program writes, as text, rather than Emacs's Info reader
  • ✅ org-ctags in org_modules: a link to a headline, a target or a custom ID goes first to the tag of the TAGS file of its directory, or, as org-ctags-open-link-functions says, 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.create and org.ctags.find (org-ctags-find-tag-interactive). The TAGS file 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-tables and #+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 TAB and 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-constants and 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-start and 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 link put 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-v everything is exported.
  • Helix ❌: Not offered as a code action yet.

Citations#

82% (9 of 11)

  • ✅ Bibliographies from #+BIBLIOGRAPHY: and org_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 .bib file (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 by bibtex-generate-autokey through 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 .bib file 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-indentation left 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: num numbers 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: num numbers them.

Notes and logging#

100% (6 of 6)

  • ✅ Notes (org-add-note), in the log or the LOGBOOK drawer
  • ✅ Notes and times on state changes
  • ✅ LOG_INTO_DRAWER and the LOGGING property
  • ✅ 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 as org-attach-method and org-attach-id-dir, are set in emacs_options); the dispatcher has Org's keys but b, O and F (an Emacs buffer, Emacs, Dired), whatever org-attach-commands says
  • ✅ 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): for org-crypt-key or the CRYPTKEY property, or with a passphrase GnuPG's pinentry asks for
  • ✅ Encrypting before saving, with org-crypt-use-before-save-magic in the Emacs configuration (LSP's willSaveWaitUntil, 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, into ltximg/); #+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, the ORG-IMAGE-ACTUAL-WIDTH property) and the most (org-image-max-width)
  • ✅ The images of http: and https: links (org-display-remote-inline-images: download each time they show, or cache once for the session), downloaded with curl into a private directory as org-resource-download-policy and org-safe-remote-resources allow, after asking as org--confirm-resource-safe does (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 !, d and f add 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.

StatusOptionsMeaning
setting350A setting of the same name
missing15org-lsp does what the option is about, but the option cannot be set yet
other11Done another way, as its note says
emacs479Read 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
lisp48Its value is Lisp (a function, a hook), which the server does not run
absent49Part of something org-lsp does not do
emacs-only73About 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-timestamps looks the entry up with assq in 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_info with time decides
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-files
org-lsp protocol takes one URL at a time, as the system gives it: there is no list of file names from emacsclient to put back in order
org-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 TAB on a headline without children skips the CHILDREN state when it cycles.
org-cycle-emulate-tab
What TAB does off a headline (indent, or cycle the whole file at the start of the buffer); the editors run their own Tab there.
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-k in the agenda deletes an entry with its subtree: the agenda has no C-k.
org-agenda-diary-file
The file i in 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 i in the agenda adds an entry to an Org diary file.
org-agenda-insert-diary-extract-time
Whether i in 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-edits checks.
org-keys.el (2)
org-use-speed-commands
Speed keys: single letters at the start of a headline (n, p, t, c …) run commands, as org-speed-commands lists.
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-table
org-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 + TAB and its kin insert #+ascii: and other keywords; <s + TAB for 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.