org-lsp

Protocol

org-lsp uses standard LSP. This page says what it offers and lists the names an editor integration deals with: options, commands, the manifest, the agenda document and the semantic tokens.

Capabilities#

The requests the server answers:

textDocument/didOpen, didChange, didSave, didClose
Incremental sync. A save rebuilds an open agenda.
textDocument/willSaveWaitUntil
With org-crypt-use-before-save-magic in Emacs's configuration, the edit that encrypts the entries tagged crypt (org-encrypt-entries), through Emacs. Emacs is asked only for files with a :crypt: tag until it has said it has the magic. Else none.
textDocument/semanticTokens/full, /range
For Org files and the agenda. See Semantic tokens. No deltas.
textDocument/foldingRange
Subtrees, drawers, blocks, LaTeX environments and multi-line list items. Whole lines only. A subtree takes the blank lines before the next headline along, as Emacs hides them; see org_cycle_separator_lines. Headlines deeper than org_cycle_max_level have no fold of their own, nor list items with org_cycle_include_plain_lists false.
textDocument/documentSymbol
The outline of headlines. Hierarchical when the client supports it, flat otherwise.
textDocument/codeAction
The commands that apply at the cursor. See Commands.
workspace/executeCommand
Every command. See Commands.
textDocument/definition
In the agenda: from a line to its entry. In an Org file: where a link or a footnote leads; on a citation key, its entry in the bibliography (org-cite-basic-goto: the start of its line, or for a CSL-JSON file its opening brace; the start of the file when Org finds no entry there), elsewhere in a citation the entries of all its keys.
textDocument/hover
In the agenda: the line's entry, its headline and its text up to the next heading, each drawer folded to its first line as Emacs shows a folded drawer (:PROPERTIES:...), as Org in a fenced block of Markdown. In an Org file, over a citation key, its entry as Org's help echo shows it (oc-basic's plain style: Knuth. The {\TeX}book, Addison-Wesley, 1984.), or for a key no bibliography file has, Suggestions: and the keys at most two edits away from it. Elsewhere none. An editor that shows the entry in an Org buffer of its own can have it highlighted by opening that buffer as an Org document with a URI that is no file (Neovim: org-preview:/1); such a document is no file of an agenda built from the open files.
org-lsp/startupFolds
The folds a file opens with closed, as org-cycle-set-startup-visibility leaves it: org_startup_folded and the file's #+STARTUP: (overview, content, show2levels …, showeverything), then each subtree's VISIBILITY property, archived subtrees, blocks with hideblocks (org_cycle_hide_block_startup) and drawers (org_cycle_hide_drawer_startup). { "folds": [FoldingRange…] }, innermost first, each one of textDocument/foldingRange's. Params: { "textDocument" }. The editors close them when a file opens.
org-lsp/ellipsis
What a closed fold shows after its first line (org_ellipsis, ... unless it is set), a string, for an editor that draws closed folds itself (foldtext). Params: none. The initialize result has the same as capabilities.experimental.orgEllipsis.
org-lsp/journal
Where org-journal's files are, for an editor to open those without an extension as Org files: { "directory" }, the absolute path of org_journal_dir ending in /, or null when org_journal_enabled is off. Params: none. The initialize result has the same as capabilities.experimental.orgJournal.
org-lsp/preview
The same text of an agenda line's entry with its semantic tokens, for an editor that shows it in a popup of its own: { "text", "data" } (data as in SemanticTokens), or null. Params: TextDocumentPositionParams.
org-lsp/faces
The faces of particular TODO keywords, priorities and tags (org_todo_keyword_faces, org_priority_faces, org_tag_faces), for an editor to apply over the semantic tokens of the keyword (todoKeyword) or the priority (priority), and, in Org files only, over the name of each tag of a headline's tag token (:a:b:, the colons left as they are): { "todo": { KEYWORD: face }, "priority": { LETTER: face }, "tag": { TAG: face } }, each face { "foreground", "background", "bold", "italic", "underline", "strikethrough" }, those set. The same is in the initialize result as capabilities.experimental.orgFaces. Params: none.
textDocument/completion
In a headline: TODO keywords for the first word after the stars, and the file's tags after a : in the headline's tags (pcomplete). : triggers it. After @ in a citation ([cite:@…), the keys of the bibliography, each with its authors, year and title as Org's completion table has them (detail).
workspace/textDocumentContent
The text of the agenda. See The agenda document.
textDocument/onTypeFormatting
After a line break: org-indent-line on the new line (Org's RET), following org_adapt_indentation. No edit when the line is indented right, or when Org leaves such a line as it is (headlines, the first line of a list item, the code of a source block).
textDocument/rangeFormatting
org-indent-region over the lines of the range (text, drawers and blocks re-indented, node properties aligned as org-property-format has them), then, as textDocument/formatting does for the whole file, every table with a line in the range aligned whole (org-table-align) and the tags of the headlines in the range put in their column (org-align-tags). A range that ends at the start of a line leaves that line out. One edit per changed line.
textDocument/formatting
Every table of the file aligned (org-table-align) and every headline's tags put in their column (org-align-tags). One edit per changed line.
textDocument/documentLink, documentLink/resolve
The links of an Org file, each with the tooltip Emacs shows over a link (LINK: …). A URL or a file without a search has its target at once; a link to a place in a file (*Heading, #custom-id, id:, file:…::search) gets it when resolved: the file with #L, its line and column (file:///…/notes.org#L12,1). The other links (shell:, a timestamp, a citation…) are left out; org.open follows them.
textDocument/references
Backlinks: the links in the Org files the server knows (the agenda files and those open) that lead to the entry at the cursor, by its ID (id:), by a search for its headline (*Heading, file:x.org::*Heading) or its CUSTOM_ID (#custom-id), from another file or the same one. On a link, the backlinks of the entry it leads to. With includeDeclaration, the entry's headline first. A link to a <<target>> or to a word of the entry is not one of them; the cursor on a target or a tag counts as on its entry.
textDocument/prepareRename, rename
On a tag: the tag in every Org file the server knows, in its headlines (their tags aligned again) and its #+FILETAGS: and #+TAGS: lines. On a headline's title: the title, and the links that search for it (*Old title, file:x.org::*Old title). Elsewhere the rename is refused. While a command waits for a text (see Commands), a rename anywhere is the answer: prepareRename gives what it suggests as the placeholder.
workspace/symbol
The headlines of the Org files the server knows whose title has the letters of the query in order, without regard to case, at most 1000, each with its file and its parent headline as container (notes.org › Projects).
textDocument/inlayHint
What Emacs shows over the text where a client has no other way: org-indent-mode's indentation as blanks at the start of lines (for a client without org-lsp/virtualIndent); the entities, sub- and superscripts and shrunk table fields of org-lsp/display (for a client without it); the numbers of org-num-mode after the stars; and the times of org.clock.display after the headlines, the line filled with dots up to column 60.
textDocument/documentHighlight
Never anything: the request tells the server where the cursor is, which the agenda's keys want.

executeCommandProvider lists the manifest's commands, and org.cycle, org.date.preview and org.emacs.answer, three that are for the editors' code (see their entries in Commands).

The server sends textDocument/publishDiagnostics for the citation keys of a document that no file of its bibliography has (oc-basic shows them with the error face): severity Information, as an Org file is text and nothing in it is an error or a warning, Unknown citation key: @key, with the keys at most two edits away (org-cite-basic--close-keys) in the message and in data.citationKeys, from which textDocument/codeAction offers quick fixes (Replace with @key). The bibliography is the files of the document's #+BIBLIOGRAPHY: lines (relative to it) and of org_cite_global_bibliography: BibTeX files (.bib, read with the biblatex dialect, and .bibtex), parsed as bibtex.el parses them (@String expansion, #, field names in lower case), and CSL-JSON files (.json). A file Org cannot read (malformed, a duplicate key) adds nothing; Emacs then fails for the whole bibliography.

The server sends these requests to the client:

workspace/applyEdit
A command changes an Org file.
window/showDocument
To show the agenda, a capture buffer, or the file of an agenda entry. The editors open the agenda and capture buffers in a window of their own (a split by default), and an entry's file where the agenda was. With "orgOtherWindow": true (not LSP's; org.agenda.goto.other, TAB in the agenda) the editors of this project show the file in another window: one that shows it, else an empty one, else a new one. The org-roam buffer (a file whose name starts with the manifest's roamBuffer.prefix) comes with takeFocus: false: the editors show it beside the file it is for, the cursor staying there. With the option show_document_notification it comes as the notification org-lsp/showDocument instead, { id, params } with these params, which the client answers with the notification org-lsp/showDocumentResult, { id, result }: for an LSP plugin that shows the documents on its own (coc.nvim).
workspace/textDocumentContent/refresh
The agenda has new text.

And these notifications:

org-lsp/columns
What column view (org-columns, through Emacs) shows on a document, for the editor to draw over its headlines: { "uri", "version", "header", "columns": [{ "key", "title", "width" }], "lines": [[line, text, [value…]]] }, each line a headline's, with the text it shows and its values; lines null when it goes off. Sent when it is turned on (org.columns), after each of its commands and each change of the document. Its commands (org.columns.*, in the columns scope of the manifest) take the column picked, from 0, as column in their argument; after one, column is where Emacs's cursor went, the column to pick then (org.columns.move.left takes it along with the column it moves).
org-lsp/timer
{ "seconds", "countdown", "paused" } when the relative timer or a countdown of Org in Emacs starts, pauses, goes on or changes, and null when it stops (unless org-timer-display is nil): its value then, which the editor counts on each second (down for a countdown) unless it is paused, to show as <0:05:23>, as Emacs's mode line does.
org-lsp/save
{ "uris": [uri…] }: with auto_save, the files a command changed other than the one it was run in (an entry's file changed from the agenda, the target of a capture or a refile), once the editor has applied the change. The editor saves those with changes.
org-lsp/virtualIndent
For a client that announces experimental.orgVirtualIndent: true: how the lines of a file with org-indent-mode (org_startup_indented, #+STARTUP: indent, or org.indent.mode) or hidden leading stars (org_hide_leading_stars, #+STARTUP: hidestars) show. { "uri", "version", "lines" }, each line [line, prefix, wrap, hiddenStars]: the columns shown before the line (line-prefix), before the lines it wraps into (wrap-prefix), and how many of a headline's leading stars show as blanks. Lines with nothing to show are left out. Sent after the file opens and after every change while it shows so, and once with no lines when it stops: after org.indent.mode too. Only for the version given.
org-lsp/display
For a client that announces experimental.orgDisplay: true (or sets the option display): what shows in place of hidden text, the entities and sub- and superscripts of org_pretty_entities (α, x²) the bullets of org_bullets_mode, and the shrunk table columns (org-table-shrink). { "uri", "version", "items" }, each item [line, character, endLine, endCharacter, shown, look]: the range hidden, the text shown in its place, and, for a bullet, the token whose colors it takes, as a selector of the manifest's highlights (stars.level1, bullet, checkbox.checked); left out when there is none. Sent after every change while there are some, and once with no items when there are none. Only for the version given. A client that does not announce it gets the same as inlay hints.
org-lsp/images
For a client that announces experimental.orgImages: true (or sets the option images): the images of the LaTeX fragments org.latex.preview asked for, once Emacs has made them, in the form the preview commands answer with (see org.link.preview), kind latex; and those of org.link.preview, kind link, once the images of its URLs are downloaded. With "startup": true, the previews a file opens with: the client says nothing of them.
experimental.orgHiddenLines
A client that announces it (or sets the option hidden_lines) hides the lines a command's result names, { "hiddenLines": { "uri", "lines" } }, each a line from 0, whole, and shows again those it hid before; the hidden lines go with the text, as Emacs's overlays do. org.custom.properties.toggle answers so. Without it, that command fails with This editor cannot hide lines.
org-lsp/lineHighlights
For a client that announces experimental.orgLineHighlights: true (or sets the option line_highlights): the lines of the agenda or of an Org file to highlight from edge to edge, as Emacs's overlays and the faces it extends cover them, past the end of their text. { "uri", "lines" }, each line { "line", "highlight" }; highlight names the look it takes, as a selector of the manifest's highlights: agendaClocking, the agenda's entry the clock runs on (org-agenda-clocking), or headline.level1 to headline.level8, the headlines of an Org file with org_fontify_whole_heading_line in the look of their level. For the agenda, sent once the client shows its current text, after each new text it shows, and when the lines change (clocking in or out); for an Org file, after it opens and after each change that moves its headlines. With no lines when none is highlighted. The text of those lines also has the token, for clients that show only tokens.
org-lsp/codeBlocks
For a client that announces experimental.orgCodeBlocks: true (or sets the option code_blocks): where the code of an Org file is that the client colors in its own language, as Emacs does with org-src-fontify-natively. { "uri", "version", "blocks" }, each block { "range", "language", "name", "kind" }: range covers the code alone, the lines between #+begin_src and #+end_src (to the end of the last, without its newline) or what is between the braces of src_python{…}; name is the language as written (emacs-lisp); language the client's name for it (elisp), the major mode Org edits it in (org-src-lang-modes, and the setting org_src_lang_modes over it) by the names tree-sitter's parsers have (emacs-lisp → elisp, sh and the other shells → bash, C++ → cpp); kind is src, export or inline. The blocks are those the parser finds: what an example block holds is text, and a block without a language or without code is left out. Sent after a file opens, after every change while it has code (the code may change where the ranges do not), and once with no blocks when the last goes. Only for the version given: for older text than the client has, newer blocks are on their way. The server's semantic tokens leave that code out.
org-lsp/syntax
For a client that announces experimental.orgSyntax: true (or sets the option syntax): what a syntax of the client's own needs to color headlines as the tokens do, before they come. { "uri", "todo", "done", "todoHeadline", "doneHeadline", "oddLevels", "levelFaces", "cycleLevelFaces", "inlinetask", "faces" }: the TODO keywords of the file not done and done (its #+TODO: lines, or org_todo_keywords), org_fontify_todo_headline, org_fontify_done_headline, whether its levels are odd only (org_odd_levels_only, #+STARTUP: odd), org_n_level_faces, org_cycle_level_faces, the stars of the shortest inline task or null, and the faces of keywords and tags { "todo": { KEYWORD: face }, "tag": { TAG: face } } as org-lsp/faces gives them. Sent after a file opens and after a change that changes it. The Neovim and Vim plugins keep it with the buffer and load their syntax again.
org-lsp/folds
{ "uri", "open": [FoldingRange…], "close": [FoldingRange…] }: after a journal command has shown a file (window/showDocument), the headlines' folds to open, then those to close (innermost first), as org-journal leaves them (org_journal_hide_entries_p); and once the editor has applied the edit of org.yank or org.paste.subtree (the server sees it in textDocument/didChange), the folds of the subtrees it folds, with those inside them (org_yank_folded_subtrees, and a subtree cut or copied folded). Each is one of textDocument/foldingRange's; the editor's folds may follow an edit a moment later, and a fold that does not cover the range yet is closed once it does.
org-lsp/viewChanged
With the option view_changed: { "uri" }, the file of the agenda or of the date prompt has been written anew, for the client to read it again.
org-lsp/runCommand
For a client that announces experimental.orgRunCommand: true (or sets the option run_command): { "command", "argument" }, a command to run as from its key, where the cursor is, the argument's fields on top of those the client sends there, and its result handled as a command's always is (what it asks asked). A capture an org-protocol URL started comes so: org.capture with the URL's template as keys and orgProtocol, what Org stored of the link ({ "props": [[":link", "https://…"], …] }), which each question's context carries on. Without it, the server runs the command itself and asks as for a client without org-lsp's code (window/showMessageRequest, a rename).
org-lsp/clock
The clock that runs, for a status line: null when none does, or { "heading", "minutes", "effort", "text", "uri", "line" }, the entry's headline, the minutes clocked on it so far (since LAST_REPEAT if it has one), its effort in minutes or null, the text of Emacs's mode line ([0:25/1:00] (Write the report)), and where the entry is. Sent when the clock starts or stops, and when the server starts with a clock running in the files. The editor counts the minutes on from there. When the time clocked reaches the entry's effort, the server shows Task ‘Write the report’ should be finished by now. (1:00) (org-clock-notify-once-if-expired), once for each clock; effortText is the effort as written.

And from the client, these notifications (also taken as requests, for clients that send none of their own):

org-lsp/agendaCursor
{ "textDocument", "position" }: the line of the agenda the cursor is on, each time it changes. In follow mode (org.agenda.follow) the server answers with window/showDocument for the entry of that line, takeFocus: false and orgOtherWindow: true: the client shows it in another window and keeps the cursor in the agenda. Sent as a request, with width the columns of the editor's echo area if it has one, it is answered with { "echo": "work.org/Projects" }: the outline path of the line's entry (org-agenda-show-outline-path), cut to fit as Emacs cuts it, for the client to show as Emacs's org-unlogged-message does (the echo area, the status bar), or null.
org-lsp/cursor
{ "textDocument", "position" }: the line of an Org file the cursor is on, each time it changes, while the editor shows the persistent org-roam buffer. When the cursor is in another node of org-roam's files, the server writes the buffer for it (org-roam-buffer-persistent-redisplay).
org-lsp/setClock
{ "today", "now" }: for tests, moves the fixed clock of a server started with the clock option; ignored otherwise.
org-lsp/agendaWidth
{ "width": N }: how many columns of text the window that shows the agenda has, when it opens and whenever its size changes. With org_agenda_tags_column "auto" the tags end at that column, and the server builds the agenda again when it changes; without it they end at column 80.

Position encoding. The server picks UTF-8 if the client offers it, then UTF-32, and falls back to UTF-16.

Line endings. \n, \r\n and a lone \r all end a line for positions. A file whose every line ends with \r\n keeps its endings in the edits of formatting and the table commands.

Not followed. The server does not register for workspace/didChangeWorkspaceFolders or workspace/didChangeWatchedFiles: a folder added after initialize is read only when the server starts again, and a file renamed outside the editor keeps its old name for the clock's history and the agenda's marks until then.

Options#

Passed as initializationOptions, on top of the shared configuration file the server reads itself (~/.config/org-lsp/config.toml or config.json; see configuration.org): an object such as org_agenda_prefix_format is merged key by key, anything else replaces the file's. The names are Org's variable names with _ for - (org_agenda_files; org-agenda-files is read too), and the values Org's, as JSON; options of the server's own have plain names (auto_save). Defaults are Org's. The names options had before are read and named in a message; unknown options are ignored, and named in a message. org-lsp settings prints them as JSON, and the list below is written from it by scripts/generate-docs.mjs; configuration.org shows the same defaults as a configuration file.

Each option with its type, its default and what it means:

config_file
false, or a path, the shared file, ~/.config/org-lsp/config.toml or config.json. The shared configuration file, whose options this editor's go on top of: false for none, or the path of another file (JSON if it ends in .json, else TOML). Unset, it is $ORG_LSP_CONFIG, else config.toml or config.json in $XDG_CONFIG_HOME/org-lsp (~/.config/org-lsp; %APPDATA%\org-lsp on Windows).
org_agenda_files
string[], []. Files, directories and glob patterns (*, ?, **) the agenda is built from. ~/ is the home directory, and a directory stands for the Org files directly in it. When empty, the agenda is built from the Org files under the workspace folders (hidden directories, node_modules and target left out), or else from the Org files that are open. (org-agenda-files)
org_agenda_file_regexp
string, the .org files whose names do not start with a dot. Which files of a directory in org_agenda_files are agenda files: an Emacs regular expression their names match, such as \\.txt\\' for the names that end in .txt. (org-agenda-file-regexp)
org_agenda_skip_unavailable_files
boolean, false. Leave out the files of org_agenda_files that are not there. With false, opening an agenda view asks about each: r removes it from the list until the server starts again, anything else aborts. (org-agenda-skip-unavailable-files)
org_todo_keywords
string[] | string[][], ["TODO", "|", "DONE"]. The TODO sequence, written like Org's #+TODO: line. | separates the states that count as done; without it the last keyword is the only done state. TODO(t) gives a keyword a key for fast selection, and WAIT(w@/!) makes it log a note (@) or the time (!) on entering and leaving it. Several sequences go in a list of lists, [["TODO", "|", "DONE"], ["REPORT", "|", "FIXED"]]; cycling stays in the sequence of the entry, and C-S-<right> switches to the next. A list that starts with type is a type sequence (#+TYP_TODO:): each of its keywords goes straight to done. A file's own #+TODO: lines take precedence. (org-todo-keywords)
org_todo_interpretation
"sequence", "type", "sequence". What a list of keywords alone in org_todo_keywords is (Org's old syntax): a sequence, or types, each going straight to done. A list that starts with sequence or type says it itself. (org-todo-interpretation)
org_todo_keyword_faces
{ [keyword]: string }, {}. Faces for particular TODO keywords: a color, { "WAIT": "orange" }, or attributes written as Org writes them, { "CANCELLED": ":foreground gray :slant italic :strike-through t" } (:foreground, :background, :weight bold, :slant italic, :underline t, :strike-through t). Shown in Org files and in the agenda by Neovim, Vim and VS Code. (org-todo-keyword-faces)
org_priority_faces
{ [priority]: string }, {}. Faces for particular priorities, by their letter, written as in org_todo_keyword_faces: { "A": ":foreground red :weight bold" }. (org-priority-faces)
org_tag_faces
{ [tag]: string }, {}. Faces for particular tags of headlines, written as in org_todo_keyword_faces: { "work": "orange" }. Shown in Org files (not the agenda, as in Emacs) by Neovim, Vim and VS Code. (org-tag-faces)
org_log_done
false, "time", "note", false. Write CLOSED: with the time when an entry is done, and with note ask for a note too. A file's #+STARTUP: words logdone, lognotedone and nologdone change it there; an entry's LOGGING property (inherited) says what its state changes log instead: those words, logrepeat and its relatives, and keywords with what they log (WAIT(@/!)), or nil for nothing. (org-log-done)
org_log_repeat
false, "time", "note", "time". Record when a repeating entry is done and moves to its next date. #+STARTUP: logrepeat, lognoterepeat and nologrepeat change it in a file, and the LOGGING property in an entry. (org-log-repeat)
org_M_RET_may_split_line
boolean, object, true. Inserting a heading, an item or a table row (M-RET) in the middle of a line splits it, the rest going to the new one; false: it goes in after the line. One by context: { "headline": false, "item": true, "table": true }, default for those not named. (org-M-RET-may-split-line)
org_blank_before_new_entry
object, auto for both. Whether a new heading (heading) and a new item (plain_list_item) get an empty line before them: true, false, or "auto", as the headings or items around them have. (org-blank-before-new-entry)
org_insert_heading_respect_content
boolean, false. M-RET and M-S-RET outside lists put the new heading after the subtree, as C-RET does. (org-insert-heading-respect-content)
org_special_ctrl_a_e
false, true, "reversed", [C-a, C-e], false. How C-a and C-e (org.beginning.of.line, org.end.of.line) move on a headline or an item: true to the start of the headline's title, after the stars, TODO keyword and priority, or after the item's bullet and check-box, and to the end of the title, before the tags; the same key again to the line's own start or end. reversed goes to the line's start or end first, and to those places on the same key right after. A pair, as [true, false], sets C-a and C-e apart. With false the key keeps the editor's own meaning. (org-special-ctrl-a/e)
org_sparse_tree_open_archived_trees
boolean, false. A sparse tree (C-c /, and a link's /regexp/) shows its matches in archived subtrees (tagged ARCHIVE); with false those subtrees stay folded under their headline. (org-sparse-tree-open-archived-trees)
org_occur_case_fold_search
true, false, "smart", true. Whether a sparse tree (C-c /, and a link's /regexp/) ignores case; "smart" ignores it unless what is searched for has an upper-case letter. (org-occur-case-fold-search)
org_highlight_sparse_tree_matches
boolean, true. Highlight the matches of a sparse tree (C-c /, and a link's /regexp/) until the text changes; with false, only their lines show. (org-highlight-sparse-tree-matches)
org_remove_highlights_with_change
boolean, true. The highlights of a sparse tree (C-c / by a regexp, TODO keywords or dates, and a link's /regexp/) and the times of C-c C-x C-d go at the next change of the text; with false they stay until C-c C-c. Those of a sparse tree by tags or a property always stay, as in Emacs. (org-remove-highlights-with-change)
org_sparse_tree_default_date_type
null, "all", "active", "inactive", "scheduled", "deadline", "closed", null. The timestamps the date sparse trees (C-c / b, a, D) look at first: null for scheduled and deadline dates, or one kind; c in the menu turns to the next kind. (org-sparse-tree-default-date-type)
org_yank_adjusted_subtrees
boolean, false. C-y (org.yank, Emacs keys) of one or more subtrees at the start of a line, or after the stars of an otherwise empty headline, pastes them as org.paste.subtree does: at the level of the headlines around them. Anything else is the editor's own paste. (org-yank-adjusted-subtrees)
org_yank_folded_subtrees
boolean, true. C-y (org.yank, Emacs keys) of one or more subtrees at the start of a line folds them, unless that would hide text after them (Inserted text not folded because that would swallow text), and leaves the cursor on the line after them. With false (and org_yank_adjusted_subtrees off) it is the editor's own paste. (org-yank-folded-subtrees)
org_allow_promoting_top_level_subtree
boolean, false. Promoting a headline of level 1 makes it a comment line: # ~ in place of ~* ~, its children a level up with a subtree's promotion. With ~false it is an error. (org-allow-promoting-top-level-subtree)
org_odd_levels_only
boolean, false. Only odd levels: *, ***, *****, each counted as the next level. Promoting and demoting go two stars at a time, and a headline is colored and matched (LEVEL) by the level it counts as. #+STARTUP: odd and oddeven set it for a file. (org-odd-levels-only)
org_inlinetask_min_level
number, false, 15. A headline of at least this many stars (twice as many less one with org_odd_levels_only) is an inline task: a task inside the text of its entry, closed by a line of as many stars and END. It is no part of the outline: it has no subtree, the outline and the motion between headings pass it, and it folds its text up to its END line. false: there are no inline tasks, as in Emacs before org-inlinetask is loaded. (org-inlinetask-min-level)
org_inlinetask_show_first_star
boolean, false. The stars of an inline task but the last two are hidden, as org_hide_leading_stars hides those of a headline; with true none are. (org-inlinetask-show-first-star)
org_inlinetask_default_state
string, no keyword. The TODO keyword of a new inline task (org.inlinetask.insert). (org-inlinetask-default-state)
org_support_shift_select
"always", true, false, "always". Where Shift and the arrows select text, as they do in the editor, instead of running Org's commands (S-<left> and its kin, C-S-<left> and C-S-<right>): always everywhere but on a timestamp and the #+BEGIN: line of a clock table; true everywhere but there, on headlines, list items' bullets, property lines and tables; false nowhere, Org's commands wherever they apply. With text selected, always and true extend it. Emacs's default is false; org-lsp's is always, as editors select with these keys. (org-support-shift-select)
org_treat_S_cursor_todo_selection_as_state_change
boolean, true. S-<left> and S-<right> on a headline change its TODO state as any change does: logged, and blocked by its dependencies. Off, they change it with nothing logged and nothing in the way. (org-treat-S-cursor-todo-selection-as-state-change)
org_treat_insert_todo_heading_as_state_change
boolean, false. The keyword of a heading org.insert.todo.heading (M-S-RET) makes is set as a TODO change: logged as the keyword says (a note wanted is a time only), with its tag triggers. (org-treat-insert-todo-heading-as-state-change)
org_edit_timestamp_down_means_later
boolean, false. S-<down> makes a timestamp later and S-<up> earlier, the other way round from Org's default. (org-edit-timestamp-down-means-later)
org_priority_enable_commands
boolean, true. Whether the priority commands work. With false they refuse (Priority commands are disabled), and S-<up> and S-<down> on a headline do not change its priority. (org-priority-enable-commands)
org_track_ordered_property_with_tag
boolean, string, false. A tag that org.ordered.toggle (C-c C-x o) puts on the headline with the ORDERED property and takes off without it: true for ORDERED, or a tag of your own. Only the property orders the subtasks. (org-track-ordered-property-with-tag)
org_special_ctrl_o
boolean, true. org.open.line (C-o) in a table inserts a row above; with false it opens a line there too. (org-special-ctrl-o)
org_special_ctrl_k
boolean, false. C-k (org.kill.line) on a headline kills the text to the tags, and the tags when the cursor is past the title; at the start of the line, the whole line. With false the key keeps the editor's own meaning, but on a line a closed fold starts on (see org_ctrl_k_protect_subtree). (org-special-ctrl-k)
org_ctrl_k_protect_subtree
false, true, "error", false. C-k (org.kill.line) on a line a closed fold starts on (a headline's only from its start with org_special_ctrl_k) kills what the fold hides with the line, as Emacs's kill-line does: true asks first (Kill hidden subtree along with headline?), "error" refuses (‘C-k’ aborted as it would kill a hidden subtree), false kills. Needs an editor that says which folds are closed (not VS Code). (org-ctrl-k-protect-subtree)
org_list_allow_alphabetical
boolean, false. Whether a letter may stand for the number of an ordered item (a., B)). A list of more than 26 items is numbered. (org-list-allow-alphabetical)
org_plain_list_ordered_item_terminator
true, ".", ")", true. What ends the number of an ordered item: ".", ")", or true for either. (org-plain-list-ordered-item-terminator)
org_list_two_spaces_after_bullet_regexp
false, string, false. An Emacs regexp: the bullets it matches get two spaces after them when Org writes them (a new item, a bullet changed, a list repaired). (org-list-two-spaces-after-bullet-regexp)
org_list_demote_modify_bullet
object, {}. By bullet (-, +, *, 1., 1)), the bullet an item gets when it is indented: { "+": "-", "-": "+" }. (org-list-demote-modify-bullet)
org_list_indent_offset
integer, 0. How many more columns sub-items are indented, past their parent's bullet. (org-list-indent-offset)
org_list_automatic_rules
object, { "checkbox": true, "indent": true }. checkbox: the statistics cookies are counted again when a box changes, and colored as done or not. indent: indenting the first item of a list with its children (M-S-<right>) moves the whole list. A rule left out of the object is off. (org-list-automatic-rules)
org_checkbox_hierarchical_statistics
boolean, true. A checkbox cookie counts the boxes of the items right below it; false counts every box further down too, as recursive in a COOKIE_DATA property does. (org-checkbox-hierarchical-statistics)
org_table_number_regexp
string, Org's: integers, decimals, 2.4e-08, 0x1F, nan, inf and their relatives. An Emacs regexp: the fields it matches are numbers, and a column mostly of numbers aligns right. (org-table-number-regexp)
org_table_number_fraction
number, 0.5. How much of a column's filled fields must be numbers for it to align right. (org-table-number-fraction)
org_table_automatic_realign
boolean, true. TAB and RET in a table align it before they move; false: only C-c C-c and the commands that change rows or columns do. (org-table-automatic-realign)
org_table_tab_jumps_over_hlines
boolean, true. TAB at the end of a row before a horizontal line goes to the row after it; false: it makes a row before the line. (org-table-tab-jumps-over-hlines)
org_table_shrunk_column_indicator
string, "…". What shows at the end of each field of a shrunk column. (org-table-shrunk-column-indicator)
org_table_formula_constants
object, {}. Constants for the table formulas of every file, by name: { "c": "299792458." } gives $c. A file's #+CONSTANTS: come first. (org-table-formula-constants)
org_table_relative_ref_may_cross_hline
true, false, "error", true. Whether a relative reference in a formula (@-1) goes past a horizontal line: false stops at the field next to it, "error" makes the formula fail. (org-table-relative-ref-may-cross-hline)
org_table_formula_create_columns
boolean, false. A field formula past the last column adds the columns it needs, rather than failing. (org-table-formula-create-columns)
org_table_duration_custom_format
"seconds", "minutes", "hours", "days", "hh:mm", "hours". How a formula with ;t writes a duration: a number of seconds, minutes, hours or days, or hours and minutes. (org-table-duration-custom-format)
org_table_duration_hour_zero_padding
boolean, true. Durations of formulas (;T, ;U) have their hours on two digits: 08:32:34 rather than 8:32:34. (org-table-duration-hour-zero-padding)
org_calc_default_modes
object, { "float_format": ["float", 8], "angle_mode": "deg" }. The modes table formulas start with: float_format, ["float", digits], ["fix", decimals] or ["sci", digits], and angle_mode, "deg" or "rad". A formula's own modes (;f2) win; Calc's other modes are not offered. (org-calc-default-modes)
org_table_formula_evaluate_inline
boolean, true. TAB and RET on a field that is a formula (=$1*2, :=...) evaluate it, which org-lsp refuses (the formula goes in a #+TBLFM: line); false leaves the field as text. (org-table-formula-evaluate-inline)
org_table_allow_automatic_line_recalculation
boolean, true. TAB, RET and C-c C-c on a line marked # recalculate it. (org-table-allow-automatic-line-recalculation)
org_list_use_circular_motion
boolean, false. Moving to the next item from the last goes to the first, and back; moving the last item down puts it first, the first up puts it last. (org-list-use-circular-motion)
org_enforce_todo_dependencies
boolean, false. An entry cannot be done while a child is not, or, under a parent with the ORDERED property, while an earlier sibling is not: the change is refused with what blocks it. (org-enforce-todo-dependencies)
org_agenda_dim_blocked_tasks
true, false, "invisible", true. Dim the tasks of the agenda and the TODO list that their dependencies keep from being done (with org_enforce_todo_dependencies or org_enforce_todo_checkbox_dependencies); invisible leaves them out instead, except those blocked by checkboxes, which stay dimmed. (org-agenda-dim-blocked-tasks)
org_enforce_todo_checkbox_dependencies
boolean, false. An entry cannot be done while it has an unchecked box. (org-enforce-todo-checkbox-dependencies)
org_log_refile
false, "time", "note", false. Record when an entry is refiled (Refiled on [2026-05-18 Mon 10:30]), with note asking for a note too. #+STARTUP: logrefile, lognoterefile and nologrefile change it in the file refiled to. (org-log-refile)
org_log_reschedule
false, "time", "note", false. Record when a scheduled date changes or is removed (Rescheduled from "[2026-05-18 Mon]" on …), with note asking for a note too. #+STARTUP: logreschedule, lognotereschedule and nologreschedule change it in a file. (org-log-reschedule)
org_log_redeadline
false, "time", "note", false. Record when a deadline changes or is removed (New deadline from …), with note asking for a note too. #+STARTUP: logredeadline, lognoteredeadline and nologredeadline change it in a file. (org-log-redeadline)
org_log_into_drawer
boolean, string, false. Put state changes and notes into a drawer: true for LOGBOOK, or the name of a drawer. #+STARTUP: logdrawer and nologdrawer change it in a file; an entry's LOG_INTO_DRAWER property (inherited) says which drawer for it (t for LOGBOOK, nil for none). (org-log-into-drawer)
org_log_done_with_time
boolean, true. The CLOSED: timestamp of an entry done has the time, not only the date. (org-log-done-with-time)
org_log_note_headings
object, Org's headings. The heading of each kind of note, by kind: done (CLOSING NOTE %t), state (State %-12s from %-12S %t), note, reschedule, delschedule, redeadline, deldeadline, refile and clock_out. In a heading %t is the time, %T the time active, %d and %D the date, %s the new state or date and %S the old one, %u the login name and %U the full name; an empty heading leaves the note its text only. Kinds left out keep Org's headings. Habits take notes with the done heading for days done. (org-log-note-headings)
org_log_states_order_reversed
boolean, true. Put a new state note, note or clock line above the others (false: below them). #+STARTUP: logstatesreversed and nologstatesreversed change it in a file. (org-log-states-order-reversed)
org_log_state_notes_insert_after_drawers
boolean, false. Without a log drawer, put notes after the drawers right under the headline and planning line, not before them. (org-log-state-notes-insert-after-drawers)
org_log_note_clock_out
boolean, false. Ask for a note when the clock stops (org.clock.out), which goes right after the clock line. #+STARTUP: lognoteclock-out and nolognoteclock-out change it in a file. (org-log-note-clock-out)
org_provide_todo_statistics
boolean, "all-headlines", string[], [string[], string[]], true. Update the [1/3] and [33%] cookies of the parent when a state changes, counting the entries with a keyword (true), every entry (all-headlines, those without a keyword as not done), those with these keywords and the done ones (a list), or those of the first list as not done and of the second as done (two lists). false leaves the cookies. (org-provide-todo-statistics)
org_hierarchical_todo_statistics
boolean, true. TODO statistics count the children only; false: the whole subtree, and the cookies above too. A COOKIE_DATA property with recursive does this for a subtree. (org-hierarchical-todo-statistics)
org_closed_keep_when_no_todo
boolean, false. Keep the CLOSED: timestamp when an entry is left with no keyword. (org-closed-keep-when-no-todo)
org_todo_state_tags_triggers
object, none. Tags that change with the state, by state: a keyword, "" for none, todo for any not done, done for any done; each a list of tags to set (+TAG) or remove (-TAG), in order: { "WAIT": ["+waiting"], "todo": ["-done"], "done": ["+done", "-waiting"] }. (org-todo-state-tags-triggers)
org_tags_column
number, -77. Where tags are aligned after a change to a headline. Negative: they end at that column. (org-tags-column)
org_use_tag_inheritance
boolean, string[], string, true. Which tags entries inherit from their parents and from #+FILETAGS:: true for all, false for none, a list of tags, or a regexp (Emacs syntax) tags must match. Inherited tags count in tag searches and show in the agenda. (org-use-tag-inheritance)
org_tags_exclude_from_inheritance
string[], []. Tags never inherited, when org_use_tag_inheritance is true or a regexp. (org-tags-exclude-from-inheritance)
org_use_property_inheritance
boolean, string[], string, false. Which properties an entry without them takes from its parents, the file's property drawer and #+PROPERTY: lines, in property searches (OWNER="alice"): true for all, false for none, a list of names, or a regexp (Emacs syntax). CATEGORY and ARCHIVE are always inherited. (org-use-property-inheritance)
org_property_separators
[names or regexp, separator][], []. What joins the values of a property with those of its PROPERTY+ lines, and the inherited ones, instead of a space: [["AUTHOR", "COAUTHOR"], ", "] for the properties named, ["^TAG", ";"] for those an Emacs regexp matches, without regard to case. The first that fits counts. (org-property-separators)
org_property_format
string, "%-10s %s". How a property line is written when it is indented (TAB, org.indent) or set: format's %s for the key with its colons, then the value, with a width (%-10s pads the key to 10 columns). (org-property-format)
org_global_properties
{ [name]: string }, {}. Properties every entry inherits, after those of #+PROPERTY: lines: chiefly the allowed values of a property, which setting it offers and S-<right> and S-<left> go through on its line ({ "Effort_ALL": "0:10 0:30 1:00 2:00" }; :ETC allows others too). (org-global-properties)
org_clock_into_drawer
boolean, string, true. Where CLOCK: lines go: true for the drawer of org_log_into_drawer (LOGBOOK when that is not a name), the name of a drawer, or false for the entry itself. (org-clock-into-drawer)
org_clock_out_remove_zero_time_clocks
boolean, false. Clocking out after less than a minute removes the CLOCK: line. (org-clock-out-remove-zero-time-clocks)
org_clock_out_when_done
boolean, true. Marking the clocked entry done stops the clock. (org-clock-out-when-done)
org_clock_display_default_range
"today" | "yesterday" | "thisweek" | "lastweek" | "thismonth" | "lastmonth" | "thisyear" | "lastyear" | "untilnow", "thisyear". The span whose clocks org.clock.display (C-c C-x C-d) adds up. (org-clock-display-default-range)
org_clock_idle_time
integer, none. After how many minutes without a message from the editor a clock that runs asks what to do with the idle time: keep it, subtract it (and clock out), or cancel the clock. (org-clock-idle-time)
org_clock_auto_clock_resolution
boolean, "when-no-clock-is-running", "when-no-clock-is-running". Clocking in first asks about each clock left running in the open and agenda files, as org.clock.resolve does: when-no-clock-is-running when no clock runs, true always (the clock that runs too), false never. A clock found running when the server starts, or written by hand, is no clock the server ran: it is asked about. (org-clock-auto-clock-resolution)
org_clock_resolve_expert
boolean, false. Ask what to do with a dangling clock or idle time with the keys in the prompt alone ([jkKtTgGSscCiq]?), without the list of what each one does. (org-clock-resolve-expert)
org_clock_history_length
integer, 5. How many entries clocked into the clock history keeps, for org.clock.in with a count and org.clock.in.last. (org-clock-history-length)
org_clock_in_resume
boolean, false. Clocking into an entry whose CLOCK: line was left without an end goes on with that clock, from when it started, rather than starting a new line. (org-clock-in-resume)
org_clock_persist
boolean, "clock", "history", false. Keep the running clock and the clock history when the server stops, and take them back when it starts: true both, clock the running clock alone, history the history alone (what C-u C-c C-x C-i offers). The running clock runs again if its CLOCK: line is still open. They are kept in Emacs's own file, in its form, so Emacs and org-lsp take the clock from each other. (org-clock-persist)
org_clock_persist_file
string, "~/.emacs.d/org-clock-save.el". The file org_clock_persist keeps the clock in: Emacs's, org-clock-save.el in its directory. (org-clock-persist-file)
org_clock_persist_query_resume
boolean, true. Ask before the clock the last session kept runs again (Resume clock (…)?). (org-clock-persist-query-resume)
org_clock_goto_may_find_recent_task
boolean, true. With no clock running, org.clock.goto goes to the entry clocked last. With false, it says No active or recent clock task. (org-clock-goto-may-find-recent-task)
org_clock_clocktable_default_properties
string, ":maxlevel 2". The parameters a new clock table gets on its #+BEGIN: line from org.clock.report (C-c C-x C-r), after :scope, as Emacs Lisp reads them (:maxlevel 3 :link t). (org-clock-clocktable-default-properties)
org_clocktable_defaults
string, Org's: :maxlevel 2 :lang "en" :scope file :narrow 40! :indent t, the others nil. The parameters every clock table has unless its #+BEGIN: line gives them, as Emacs Lisp reads them. Set, it replaces Org's whole list. (org-clocktable-defaults)
org_clock_clocktable_language_setup
string[][], Org's: en, de, es, fr, nl, nn, pl, pt-BR and sk. The words of a clock table in each language its :lang names: the language, then its words for File, L, Timestamp, Headline, Time, ALL, Total time, File time and Clock summary at. A word left out stays English. Set, it replaces Org's languages. (org-clock-clocktable-language-setup)
org_clock_report_include_clocking_task
boolean, false. A clock table counts the time of the clock that runs, for its entry, when the table covers a time (:block, :tstart and :tend) and the clock started within it. (org-clock-report-include-clocking-task)
org_clock_rounding_minutes
number, 0. Clocking in and out happens at the multiple of this many minutes nearest now; a clock never starts later than now. Below 1, at the minute. (org-clock-rounding-minutes)
org_clock_continuously
boolean, false. A clock starts when the last one stopped, not now. (org-clock-continuously)
org_clock_total_time_cell_format
string, "*%s*". How a clock table writes its total time and the words before it; %s is the text. (org-clock-total-time-cell-format)
org_clock_file_time_cell_format
string, "*%s*". How a clock table over several files writes the words before a file's time; %s is the text. (org-clock-file-time-cell-format)
org_clock_in_switch_to_state
string, none. The TODO state an entry is put in when the clock starts on it (NEXT), unless it has it already. (org-clock-in-switch-to-state)
org_clock_out_switch_to_state
string, none. The TODO state an entry is put in when the clock stops on it. (org-clock-out-switch-to-state)
org_lint
boolean, true. Org's linter checks the documents and reports what it finds as diagnostics: misplaced headings and planning lines, links to nowhere, duplicate names, footnotes without definitions… What it finds is information, a hint for a checker Org trusts little: an Org file is text, nothing in it is an error or a warning. (org-lint)
org_lint_ignore
string[], []. The org-lint checkers to leave out, by name, as a diagnostic's code shows it ("misplaced-heading"). (org-lint)
org_id_method
"uuid", "org", "ts", "uuid". How a new ID is made (org.id.create, a link stored by ID, org-roam): a random UUID, the time in base 36 (org), or the time as org_id_ts_format writes it (ts). (org-id-method)
org_id_prefix
false, string, false. What a new ID starts with, before a colon: "Org" makes Org:…. (org-id-prefix)
org_id_ts_format
string, "%Y%m%dT%H%M%S.%6N". How the ts method writes the time, as format-time-string does. (org-id-ts-format)
org_id_include_domain
boolean, false. The org and ts methods end a new ID with @ and the machine's domain. (org-id-include-domain)
org_id_track_globally
boolean, true. IDs are looked for in other files than the link's own: those of org_id_search_archives, org_id_extra_files and org_id_locations_file, the agenda files, the open ones and org-roam's. Off, an id: link leads only within its file. (org-id-track-globally)
org_id_search_archives
boolean, true. IDs are looked for in the archive files of the agenda files too. (org-id-search-archives)
org_id_extra_files
string[], org_agenda_text_search_extra_files. More files to look for IDs in: paths or glob patterns. (org-id-extra-files)
org_id_locations_file
string, "~/.emacs.d/.org-id-locations". The file where Emacs keeps the files it found IDs in: org-lsp looks in them too, and never writes it. Names in it that are not absolute are relative to its directory. (org-id-locations-file)
org_id_completion_targets
object[], [{ "files": "current", "all": true }, { "files": "org-id-files", "all": true }]. The headlines an id: link completes to (org.link.insert), as org_refile_targets names them: by default every headline of the file and of the files with IDs. (org-id-completion-targets)
org_link_search_must_match_exact_headline
boolean, "query-to-create", "query-to-create". What a link to a headline that is not there does: "query-to-create" asks whether to make it, at the end of the file, when the link is followed (org.open); true is an error; false looks for its words in the text. (org-link-search-must-match-exact-headline)
org_link_doi_server_url
string, "https://doi.org/". What a doi: link is opened at: this, then the DOI. (org-link-doi-server-url)
org_link_shell_skip_confirm_regexp
string, "". An Emacs regexp: a shell: link whose command it matches runs when followed without asking Execute … in shell? first. Empty asks for every command. (org-link-shell-skip-confirm-regexp)
org_man_command
string, "man". The program that writes the man page of a man: link, when ol-man is in org_modules: the page is shown as text, at the line before the first match of what follows :: (man:ls::-l). "woman", Emacs's own reader, is man too. (org-man-command)
org_info_other_documents
{ [manual]: string }, { "dir": "https://www.gnu.org/manual/manual.html", "libc": "https://www.gnu.org/software/libc/manual/html_mono/libc.html", "make": "https://www.gnu.org/software/make/manual/make.html" }. The pages on the web of Info manuals: following an info: link to one of them, or to one of Emacs's manuals, opens its page at the node. Another manual is shown as text, as the info program writes the node. (org-info-other-documents)
org_ctags_path_to_ctags
string, "ctags". The ctags program (Exuberant or Universal Ctags) that org.ctags.create runs to make the TAGS file of a directory, when org-ctags is in org_modules. (org-ctags-path-to-ctags)
org_ctags_open_link_functions
string[], ["org-ctags-find-tag", "org-ctags-ask-rebuild-tags-file-then-find-tag", "org-ctags-ask-append-topic"]. With org-ctags in org_modules, what following a link to a headline, a target or a custom ID tries first, in turn, until one is done: org-ctags-find-tag (the tag of the TAGS file of the file's directory), org-ctags-ask-rebuild-tags-file-then-find-tag and org-ctags-rebuild-tags-file-then-find-tag (the TAGS file made again, then the tag), org-ctags-ask-append-topic and org-ctags-append-topic (a new topic at the end of the file), org-ctags-ask-visit-buffer-or-file and org-ctags-visit-buffer-or-file (the Org file of that name in the directory, made when asked), org-ctags-fail-silently (nothing more). When none is done, the link is followed as without them. (org-ctags-open-link-functions)
org_ctags_new_topic_template
string, "* <<%t>>\n\n\n\n\n\n". The text of a new topic org_ctags_open_link_functions makes, %t the link's text capitalized. (org-ctags-new-topic-template)
org_id_link_to_org_use_id
boolean, string, false. Whether org.link.store (C-c l) links to an entry by its ID: true makes one when the entry has none, "create-if-interactive" only from the command (not for capture's %a), "create-if-interactive-and-no-custom-id" likewise unless the entry has a CUSTOM_ID, "use-existing" only when it has one already. Off, the link searches for the headline. (org-id-link-to-org-use-id)
org_link_context_for_files
boolean, true. Links to a place in a file search for it (file:notes.org::*Heading); C-u turns it around for one link. (org-link-context-for-files)
org_id_link_use_context
boolean, true. ID links to a place below the entry's headline search for it as well (id:…::name). (org-id-link-use-context)
org_id_link_consider_parent_id
boolean, false. An ID link may use the ID of a parent entry, with a search for the place. (org-id-link-consider-parent-id)
org_link_file_path_type
string, "adaptive". How links to files write the path: "adaptive" relative below the file's directory and absolute elsewhere, "absolute" (with ~), "noabbrev" (without), "relative". (org-link-file-path-type)
org_link_keep_stored_after_insertion
boolean, false. Stored links stay stored once inserted. (org-link-keep-stored-after-insertion)
org_complete_tags_always_offer_all_agenda_tags
boolean, false. Completing a tag offers the tags of every agenda file, after those of the file. Off, only the file's own. Setting tags offers them too. (org-complete-tags-always-offer-all-agenda-tags)
org_cite_global_bibliography
string[], []. Bibliography files for the citations of every document ([cite:@key]), after those its #+BIBLIOGRAPHY: lines name: BibTeX (.bib, .bibtex) or CSL-JSON (.json). Their entries are completed after @, shown over a key, and where following a key goes; a key none has is marked. (org-cite-global-bibliography)
org_cite_insert_processor
string, false, "basic". The citation processor org.cite.insert inserts with: basic, as Org's own does; Org's other processors cannot insert, and those of packages (citar) are not run; false for none. (org-cite-insert-processor)
org_bibtex_autogen_keys
boolean, false. Whether org.bibtex.create and org.bibtex.check make the key of a new BibTeX entry from its author, year and title, as bibtex-generate-autokey makes it (through Emacs), instead of asking for it (id). (org-bibtex-autogen-keys)
org_bibtex_prefix
string, none. What the names of the properties the BibTeX commands write start with (BIB_ gives BIB_AUTHOR), but for the key's; they read the names with it and without. (org-bibtex-prefix)
org_bibtex_treat_headline_as_title
boolean, true. A headline without a TITLE property is the title of its BibTeX entry, and org.bibtex.check does not ask for one. (org-bibtex-treat-headline-as-title)
org_bibtex_export_arbitrary_fields
boolean, false. With org_bibtex_prefix, every property whose name has the prefix is a field of the entry exported (org.bibtex.export, org.bibtex.copy), not only those of its type. (org-bibtex-export-arbitrary-fields)
org_bibtex_key_property
string, "CUSTOM_ID". The property that holds an entry's BibTeX key. ID makes the key a global ID. (org-bibtex-key-property)
org_bibtex_tags
string[], []. Tags given to the entries the BibTeX commands make. (org-bibtex-tags)
org_bibtex_tags_are_keywords
boolean, false. The keywords field of an entry read is its tags (spaces as _, other characters a tag cannot have left out), and an entry's own tags are its keywords when exported, but for those of org_bibtex_tags and org_bibtex_no_export_tags. (org-bibtex-tags-are-keywords)
org_bibtex_no_export_tags
string[], []. Tags that are not exported as keywords, with org_bibtex_tags_are_keywords. (org-bibtex-no-export-tags)
org_bibtex_inherit_tags
boolean, false. With org_bibtex_tags_are_keywords, the tags an entry inherits are keywords too. (org-bibtex-inherit-tags)
org_bibtex_type_property_name
string, "btype". The property that holds an entry's BibTeX type (article); a headline without it is no entry. (org-bibtex-type-property-name)
org_link_abbrev_alist
{ [abbreviation]: string }, {}. Link abbreviations: [[gh:org-lsp]] with { "gh": "https://github.com/%s" } follows https://github.com/org-lsp. %s stands for what follows the colon, %h for it URL-encoded; without either it goes at the end. A file's #+LINK: lines come first. %(my-function) calls an Emacs function with what follows the colon (through Emacs), one emacs_config marks safe, as Org asks: (put 'my-function 'org-link-abbrev-safe t). (org-link-abbrev-alist)
org_file_apps
[match, command][], [["auto-mode", "emacs"], ["directory", "emacs"], ["\\.mm\\'", "default"], ["\\.x?html?\\'", "default"], ["\\.pdf\\'", "default"]]. What opens a linked file, the first entry that matches: a match is an extension (txt), an Emacs regular expression for the file name (\\.pdf\\' in JSON; with groups %1, %2... in the command, it matches the file followed by the link's :: part), directory, remote, system (what C-u C-u C-c C-o uses), auto-mode (every file the editor can show) or t (any other file). A command is emacs (the editor), default (the system entry, else the editor), system or mailcap (the system's application, through the editor), or a shell command where %s is the file. C-u C-c C-o opens the file in the editor. A Lisp function is not a command here. (org-file-apps)
org_open_non_existing_files
boolean, false. Open a linked file that is not there with the application org_file_apps gives it, rather than saying No such file. The editor opens such a file either way. (org-open-non-existing-files)
org_open_directory_means_index_dot_org
boolean, false. Following a link to a directory opens the index.org in it, rather than the directory. (org-open-directory-means-index-dot-org)
org_tag_alist
string, string[], "". The tags offered when setting tags in a file without a #+TAGS: line, written like one: "work(w) home(h) { @office(o) @home(m) } [ GTD : Control Persp ]" gives work the key w, makes @office and @home exclusive, and groups Control and Persp under GTD; \n starts a new line. A list of these words does as well. Unset, the tags used in the file are offered. (org-tag-alist)
org_tag_persistent_alist
string, string[], "". Tags offered in every file, before those of #+TAGS: or org_tag_alist, written the same way. (org-tag-persistent-alist)
org_group_tags
boolean, true. A group tag ([ GTD : Control Persp ], { Context : @home @office } in #+TAGS: or org_tag_alist) in the match string of a tags view stands for itself and the tags of its group. (org-group-tags)
org_use_fast_todo_selection
"auto", "expert", false, "auto". How C-c C-t (org.todo) changes the TODO state where keywords have keys (TODO(t)): auto picks the state by key from a menu of them; expert by key too, the keys listed in the prompt alone (in Neovim and Vim; other editors show their menu); false goes to the next state, as where no keyword has a key. true is auto. (org-use-fast-todo-selection)
org_use_fast_tag_selection
true, false, "auto", "auto". Pick tags by key, each key turning its tag on or off until RET: auto when some tag has a key, true always (keys are given to the tags without one), false never: the tags are typed instead. (org-use-fast-tag-selection)
org_fast_tag_selection_single_key
boolean, false. In fast tag selection, the first key that changes the tags also ends it. (org-fast-tag-selection-single-key)
org_tags_sort_function
"string<", "string>", the order they were picked in. Sort the tags of a headline when they are set: alphabetically, or the other way. (org-tags-sort-function)
org_auto_align_tags
boolean, true. Align the tags of a headline to org_tags_column when they are set. (org-auto-align-tags)
org_todo_repeat_to_state
string, true, the first keyword of the sequence. The state a repeating entry returns to when it is done: a keyword, or true for the state it had. (org-todo-repeat-to-state)
org_priority_highest
letter, or 0 to 64, "A". The highest priority. (org-priority-highest)
org_priority_lowest
letter, or 0 to 64, "C". The lowest priority. (org-priority-lowest)
org_priority_default
letter, or 0 to 64, "B". The priority of an entry without a cookie. A file's #+PRIORITIES: line takes precedence over the three priority options. (org-priority-default)
org_priority_start_cycle_with_default
boolean, true. Raising or lowering the priority of an entry that has none starts at the default. (org-priority-start-cycle-with-default)
org_time_stamp_rounding_minutes
number, 5. The step in which the minutes of a timestamp change (the second number of Org's option). (org-time-stamp-rounding-minutes)
org_read_date_prefer_future
boolean, "time", true. A date typed without a year or month is the next one to come. With time, a time that has passed today is tomorrow's. (org-read-date-prefer-future)
org_agenda_jump_prefer_future
boolean, "time", as org_read_date_prefer_future. How the agenda's j (org.agenda.goto.date) reads a date typed without a year or month, as org_read_date_prefer_future does for every other prompt. (org-agenda-jump-prefer-future)
org_read_date_force_compatible_dates
boolean, true. A typed year is kept within 1970 to 2037. (org-read-date-force-compatible-dates)
org_refile_targets
object[], [{ "files": "current", "level": 1 }]. Where entries can be refiled to. Each entry has files: current (the entry's own file), agenda, org-id-files (the files with IDs), a path or a list of paths; and one of level, maxlevel, tag, todo, regexp (the Rust regex crate's syntax) or all (true), which says which headlines there are targets. (org-refile-targets)
org_refile_use_outline_path
boolean, "file", "full-file-path", "title", false. Name targets by their outline path (Projects/Alpha/). The three names start the path with the file, and offer the file itself, for its top level. (org-refile-use-outline-path)
org_refile_active_region_within_subtree
boolean, false. A selection that is not whole subtrees is refiled too: its first line becomes a headline first (org-toggle-heading, run by Emacs), a level below the entry it is in. (org-refile-active-region-within-subtree)
org_refile_allow_creating_parent_nodes
boolean, "confirm", false. A target that is not there yet can be named after an existing one, Projects/New: it is made, as the last child of Projects, and the entry goes under it. confirm asks first. (org-refile-allow-creating-parent-nodes)
org_refile_target_verify_function
string, none. The name of an Emacs Lisp function that decides which headlines are refile targets: the server's Emacs calls it at the start of each, and keeps those it says yes to. Where it leaves the point, the search goes on: a function can skip a subtree. (org-refile-target-verify-function)
org_reverse_note_order
boolean, false. A refiled entry goes first under its target, not last. (org-reverse-note-order)
org_archive_location
string, "%s_archive::". Where archived subtrees go: a file, ::, and a headline under which they go (they go to the end of the file without one). %s is the name of the file the subtree is in; an empty file part is that file. datetree/ as the headline files them under year, month and day, by when they were closed. An ARCHIVE property of the entry or a parent, or a #+ARCHIVE: line, says otherwise. (org-archive-location)
org_archive_reversed_order
boolean, false. An archived subtree goes first under its archive headline, not last. (org-archive-reversed-order)
org_archive_mark_done
boolean, string, false. Mark archived entries done: true for the first done keyword, or the keyword to use. (org-archive-mark-done)
org_archive_subtree_add_inherited_tags
boolean, "infile", "infile". Give an archived subtree the tags it inherited: always, never, or when it stays in its file. (org-archive-subtree-add-inherited-tags)
org_archive_save_context_info
string[], ["time", "file", "olpath", "category", "todo", "itags"]. What an archived entry keeps as ARCHIVE_… properties: time, file, olpath (its outline path), category, todo, itags (inherited tags), ltags (its own tags) and olid (its parent's ID). (org-archive-save-context-info)
org_archive_sibling_heading
string, "Archive". The headline of the sibling org.archive.sibling archives under. (org-archive-sibling-heading)
org_archive_file_header_format
string, false, "\nArchived entries from file %s\n\n". What a new archive file starts with; %s is the path of the file the subtree came from. (org-archive-file-header-format)
org_archive_default_command
"subtree", "sibling", "tag", "subtree". What org.archive.default does: archive the subtree, archive it under its sibling, or tag it. (org-archive-default-command)
org_archive_subtree_save_file_p
boolean, "from-org", "from-agenda", "from-org". Whether the archive file is saved once a subtree goes there: always (true), when archiving from an Org file (from-org), from the agenda (from-agenda), or never (false). Unsaved, it is left with its changes in the editor, as auto_save does not save it. (org-archive-subtree-save-file-p)
org_capture_use_agenda_date
boolean, false. Capturing from the agenda takes the day of the line the cursor is on, at midnight (or the hour of org_extend_today_until), for %t, %U and the like and for the date of a date tree, which a time_prompt template then does not ask for. (org-capture-use-agenda-date)
org_capture_templates_contexts
object[], []. Where templates are offered. Each has the key of a template, contexts, rules such as { "in_file": "work" } (in_file, in_mode, in_buffer, not_in_file, not_in_mode or not_in_buffer, each with a regexp of the regex crate's syntax, matched ignoring case), and maybe use, the key of the template it stands for there. A template with contexts is offered only where one of their rules holds. The mode is org-mode in an Org file and org-agenda-mode in the agenda, where there is no file; the buffer's name is the file's. (org-capture-templates-contexts)
org_capture_templates
object[], [{ "key": "t", "description": "Task", "target": ["file+headline", "", "Tasks"], "template": "* TODO %?\n %u\n %a" }]. Capture templates. Each has a key, a description, a type (entry, the default, plain, item, checkitem or table-line), a target and a template (text, or a list of lines), and may have prepend, empty_lines, empty_lines_before, empty_lines_after, immediate_finish, tree_type, time_prompt, table_line_pos, clock_in, clock_keep, clock_resume, jump_to_captured and unnarrowed. The target is a list: file and a path; file+headline, a path and a headline; file+olp, a path and the headlines of an outline path; file+regexp, a path and a regular expression; file+olp+datetree, a path and the headlines of an outline path, maybe none, for a date tree under them; id and an ID; clock, the entry clocked now; file+function, a path and the name of an Emacs Lisp function that moves the point there, or function and the name of one that visits the file too (run by the server's Emacs). An empty path is org_default_notes_file, and without a target the entry goes at the end of org_default_notes_file. A template with only a key and a description groups the templates whose keys start with its key. (org-capture-templates)
org_protocol_default_template_key
string, none: the menu of templates. The keys of the capture template an org-protocol://capture URL uses when it names none (template=). (org-protocol-default-template-key)
org_protocol_data_separator
string, "/+\\|\\?". An Emacs regular expression: what separates the parts of an old-style org-protocol URL (org-protocol://capture:/x/URL/TITLE/BODY). (org-protocol-data-separator)
org_protocol_project_alist
object[], []. Where the files of org-protocol://open-source URLs are on this computer. Each has a name, the base_url of the pages (with its last slash) and the working_directory of their files (with its last slash, ~/ for the home directory), and may have an online_suffix taken off the URL (.html), a working_suffix put on in its place (.org), and rewrites, pairs of an Emacs regular expression on the URL, whose first group is taken out of it, and what goes after it, for a URL whose file is not there. The first whose base_url the URL has is tried first. (org-protocol-project-alist)
org_protocol_editor
string, none: a capture waits for an editor with org-lsp. The editor org-lsp protocol starts when no org-lsp runs, as a command line (code, zed, kitty nvim): it opens org_default_notes_file in it, or the file of an open-source URL, and the org-lsp that starts there takes the URL, within two minutes. Read from the shared file only. Without it, a stored link is kept for the next org-lsp that starts, and a capture fails.
org_directory
string, "~/org". Where the relative paths of capture targets are. (org-directory)
org_default_notes_file
string, "~/.notes". The target of a capture template whose file is empty. (org-default-notes-file)
org_link_descriptive
boolean, true. Show a link as its description (or its target, when it has none) and hide the rest: the brackets, and the target of a link with a description. The text is marked hidden in the highlighting, and editors that can conceal text conceal it. (org-link-descriptive)
org_hide_emphasis_markers
boolean, false. Hide the markers around *bold*, /italic/, _underline_, +strike-through+, =verbatim= and ~code~, as for links. (org-hide-emphasis-markers)
org_fontify_emphasized_text
boolean, true. Show *bold*, /italic/, _underline_, +strike-through+, =verbatim= and ~code~ in their looks. With false they look as the text around them, their markers shown. (org-fontify-emphasized-text)
org_emphasis_alist
{ [marker]: face | face[] | false }, Org's: bold, italic, underline, org-verbatim, org-code and :strike-through t. The look of each kind of emphasis, by its marker (*, /, _, =, ~, +): a face of Org's, bold, italic, bold-italic, underline, org-code or org-verbatim, attributes as Org writes them (:weight bold :slant italic :underline t :strike-through t), or a list of them; false for none. As in Emacs, a marker left out has no look. Colors are not shown. (org-emphasis-alist)
org_hidden_keywords
("title" | "subtitle" | "author" | "email" | "date")[], []. The keywords hidden before their values, such as #+TITLE: with ["title"], in editors that conceal text. (org-hidden-keywords)
org_hide_macro_markers
boolean, false. Hide the braces of macro calls, {{{ and }}}, in editors that conceal text. (org-hide-macro-markers)
org_display_custom_times
boolean, false. Show timestamps in org_timestamp_custom_formats: the date and time inside the brackets is hidden and the custom form shows in its place, as entities do. #+STARTUP: customtime turns it on for a file, and C-c C-x C-t (org.timestamp.overlays.toggle) on and off. Exports through Emacs use them too; the date prompt shows its answer in Org's own form. (org-display-custom-times)
org_timestamp_custom_formats
[date, date with time], ["%m/%d/%y %a", "%m/%d/%y %a %H:%M"]. The formats of org_display_custom_times, as format-time-string reads them (%d.%m.%Y); brackets around a format are dropped. (org-timestamp-custom-formats)
org_entities_user
[name, LaTeX, math?, HTML, ASCII, Latin-1, UTF-8][], []. Entities of your own, used as \name: what each is in LaTeX (and whether that needs math mode), HTML, ASCII, Latin-1 and UTF-8, as ["myarrow", "\\to", true, "&rarr;", "->", "->", "→"]. A name is letters only, and one of Org's own is replaced. The server shows them as org_pretty_entities says and completes them; Emacs exports them. (org-entities-user)
org_pretty_entities
boolean, false. Show entities (\alpha, \to) as their character (α, →): the entity is hidden as link brackets are, and its character is an inlay hint in its place. (org-pretty-entities)
org_pretty_entities_include_sub_superscripts
boolean, true. With org_pretty_entities, show sub- and superscripts (x^2, H_{2}O, a_{n}) raised and lowered: in Unicode (x², H₂O, aₙ) where every character has a raised or lowered form, as an inlay hint in place of the hidden text; the others are left as they are. (org-pretty-entities-include-sub-superscripts)
org_use_sub_superscripts
true, "{}" or false, true. Which sub- and superscripts org_pretty_entities shows: all, only those in braces (a_{b}, "{}"), or none. (org-use-sub-superscripts)
return_uses_meta_return
boolean, false. RET on the first line of a list item makes the next item, numbered as M-RET (org-meta-return) makes it (without a checkbox, which M-S-RET adds), the items after it renumbered, as nvim-orgmode's org_return_uses_meta_return does. Off, RET is Org's: a new line in the item. org.return.item (<S-CR>, Shift+Enter, with the vim keys) always does it.
org_return_follows_link
boolean, false. RET (org.return) on a link, a timestamp or a citation follows it, as org.open (C-c C-o) does. In a table RET still moves down. (org-return-follows-link)
org_goto_max_level
number, 5. The deepest headings org.goto (C-c C-j) offers. (org-goto-max-level)
calendar_months
1 | 3, 3. How many months the calendar of the date prompt shows: 3 side by side, as Emacs's calendar shows them, the one with the selected day in the middle; or 1, that month alone, for a narrow window, with the answer on a line under the prompt.
calendar_week_start_day
0 to 6 (0 is Sunday), 0. The day the weeks of the date prompt's calendar start on: 1 starts them on Monday. (calendar-week-start-day)
emacs
string, "emacs". The Emacs program, for what only Org itself does: export (org.export.dispatch). The server starts it (emacs --batch -Q) when that is first asked for and keeps it running, so that Org loads once. Without Emacs, everything else works as before.
emacs_config_file
string, none. A file of Emacs Lisp that Emacs loads before Org, for the variables export reads (org-export-backends, org-html-…, org-latex-…, org-publish-project-alist): a file of its own, or your init file. ~/ is the home directory.
emacs_config
string, none. Emacs Lisp that Emacs evaluates after emacs_config_file and before loading Org, for a few settings without a file that emacs_options cannot say: a function or a hook, or (add-to-list 'load-path "~/src/org-mode/lisp") for another Org. A yes-or-no question Emacs asks while it works (org-confirm-babel-evaluate) is asked in the editor.
emacs_options
{ [option]: value }, {}. Org's options for what Emacs does, by their names in Org, which Emacs sets as Customize does: { "org-attach-method": "mv", "org-export-with-toc": false }. true is t and false nil, a list is a list and a table an association list; a string is a symbol where the option takes one, or a function, by its name. Each is set when Emacs loads the library it is in, after emacs_config_file and emacs_config, and so wins over them. A value the option does not take is left out, with a message naming the part that does not fit. The editor's go over the shared file's option by option. The options, each with Org's documentation of it, are in docs/emacs-options.org; the others are settings of the server, or Lisp (hooks, functions written out), which goes in emacs_config.
auto_save
boolean, true. Save the files a command changes other than the one it was run in: an entry's file changed from the agenda, the target of a capture or of a refile. The editor saves them once it has made the change. Off, they are left with unsaved changes, as Emacs leaves them.
mcp_edits
boolean, false. Let the assistants org-lsp mcp serves change files: its tools set_todo_state, capture, refile, schedule, deadline, set_tags, set_property, delete_property, set_priority, set_effort, add_note, archive and delete_entry, which write the agenda files, the capture targets, the files of org_refile_targets and the archive files directly. Off, it only reads. It is read from the shared configuration file, as everything org-lsp mcp reads.
appt_message_warning_time
number, or number[], 12. How many minutes before an appointment (an entry of today's agenda with a time of day) its reminders start: one then, and one each appt_display_interval minutes after, as Emacs's appt.el reminds; an entry's APPT_WARNTIME property says it for that entry. As org-lsp's own, a list gives the minutes before the appointment of each reminder: [10, 0] reminds ten minutes before and when it is due. org-lsp notify reminds this way; through Emacs (Add today's appointments from the agenda files), a list stands for its largest number. (appt-message-warning-time)
appt_display_interval
number, 3. Minutes between two reminders of an appointment, from the first, appt_message_warning_time minutes before it. (appt-display-interval)
notification_use_timestamp_warning
boolean, false. As org-lsp's own, org-lsp notify also reminds of an appointment from a deadline or a timestamp as many hours before it as the timestamp's warning cookie says: once, 60 minutes before <2026-10-22 Thu 21:00 -1h>, besides the reminders of appt_message_warning_time. A scheduled date's cookie is a delay and does not count, nor do cookies in days, weeks, months or years. Emacs's appt.el reads no cookie.
notification_deadline_summary_time
string, no summary. The time of day, as HH:MM, at which org-lsp notify lists the deadlines the day's agenda shows that are not done: those of the day, those whose warning period has begun, and those past.
notification_match
string, every entry. The entries org-lsp notify reminds of: a match string of the tags view, such as +meeting|+call or -private.
notification_command
string[], none. A program org-lsp notify runs for each notification, and its arguments, in which %t stands for the title, %b for the text and %% for %: ["ntfy", "publish", "--title", "%t", "mytopic", "%b"]. It runs instead of the desktop notification, unless notification_desktop is on. No shell reads it. With a placeholder of an entry (those of notification_title_format), it runs once for each appointment, with that appointment's title, text and values.
notification_title_format
string, the mode line of appt.el, such as Appointment in 10 minutes. The title of an appointment's notification from org-lsp notify, in which %h stands for the headline, %k its TODO keyword, %p its priority, %T its tags, %c its category, %s and %d its scheduled and deadline timestamps, %w the appointment's time, %m the minutes left, %e the effort, %f and %F the file's path and name, %l the headline's line, %a the line appt.el shows and %% %: "%k %h". Appointments due together share the first one's.
notification_body_format
string, %a, the line appt.el shows. The text of an appointment's notification from org-lsp notify, with the placeholders of notification_title_format: "%w %c %T". Appointments due together have a line each.
notification_deadline_line_format
string, %c: %D %a. A line of the deadline summary of org-lsp notify, with the placeholders of notification_title_format and %D for the agenda's leader (In 3 d.:, 2 d. ago:, Deadline:); there %a is the headline as the agenda shows it.
notification_desktop
boolean, on unless notification_command is set. Whether org-lsp notify shows a desktop notification: with notify-send on Linux and the other Unix systems, terminal-notifier on macOS when it is installed and osascript otherwise, PowerShell on Windows (BurntToast if it is installed).
notification_icon
string, the org-lsp logo. The image of the desktop notifications of org-lsp notify: the path of a PNG file (~/ for the home directory), or "" for none. Unset, the logo, which it writes to org-lsp/icon.png in the user's data directory (~/.local/share on Linux). osascript shows no image: on macOS it takes terminal-notifier.
org_cycle_separator_lines
number, 2. With at least this many blank lines after a subtree, the last one stays outside its fold. Negative: all of them stay outside. 0: none does. (org-cycle-separator-lines)
org_cycle_include_plain_lists
true, false, "integrate", true. Whether list items fold, as subtrees do. integrate makes them part of the outline: TAB showing a headline's children folds its lists to their top items too. false: they do not fold. (org-cycle-include-plain-lists)
org_cycle_max_level
number, every level. The deepest headlines that fold; deeper ones are text of the subtree they are in. (org-cycle-max-level)
org_cycle_global_at_bob
boolean, false. TAB at the very start of the file, when its first line is no headline, cycles the whole file as S-TAB does. (org-cycle-global-at-bob)
org_cycle_level_after_item_entry_creation
boolean, true. TAB on a new, empty headline makes it a child of the headline before, then each level up, then a sibling again; on an empty item, it indents and outdents the item the same way. (org-cycle-level-after-item/entry-creation)
org_startup_folded
string, "showeverything". How files show when opened: "overview" (or "fold") only the top headlines, "content" all the headlines, "show2levels" to "show5levels" the headlines down to that level, "showeverything" (or "nofold", "showall") everything. #+STARTUP: decides for a file. Unless everything shows, a subtree's VISIBILITY property (folded, children, content, all) decides for it, archived subtrees are folded, and drawers too. Folds hide whole subtrees, so where Org shows a headline's children but not its text, the text shows. (org-startup-folded)
org_startup_align_all_tables
boolean, false. Align every table of a file when it opens (an edit of the file, as in Emacs). #+STARTUP: align and noalign decide for a file. (org-startup-align-all-tables)
org_startup_shrink_all_tables
boolean, false. Shrink the columns of every table that have a width cookie (<10>) when a file opens. #+STARTUP: shrink decides for a file. Shrunk fields show their first characters and …, in editors that can hide text. (org-startup-shrink-all-tables)
org_cycle_hide_block_startup
boolean, false. Fold blocks when a file opens folded (org_startup_folded). #+STARTUP: hideblocks and nohideblocks decide for a file. (org-cycle-hide-block-startup)
org_cycle_hide_drawer_startup
boolean, true. Fold drawers when a file opens folded (org_startup_folded). (org-cycle-hide-drawer-startup)
org_cycle_open_archived_trees
boolean, false. Leave archived subtrees open when a file opens folded (org_startup_folded). (org-cycle-open-archived-trees)
org_adapt_indentation
boolean | "headline-data", false. Indent the lines of an entry past its headline's stars: true for all of them, "headline-data" for the planning line, drawers and clock lines right below the headline. Applies to new lines, to re-indenting (range formatting) and to what commands write. (org-adapt-indentation)
org_image_actual_width
boolean, number, or [number], true. How wide the image of a link shows: true at its own width; a number, that many pixels; false or a list of one number, the :width of the paragraph's #+ATTR_ORG: or else of another #+ATTR_…: (pixels, 50% or a fraction up to 2 of the text's width, t for its own width), else the list's number. An entry's ORG-IMAGE-ACTUAL-WIDTH property decides for its own text. (org-image-actual-width)
org_image_max_width
"fill-column", "window", number, or null, "fill-column". How wide at most an image shown at its own width is: "fill-column", 70 columns; "window", the window's width; an integer, that many pixels; a float, that part of the window's width; null for no limit. (org-image-max-width)
org_display_remote_inline_images
"skip", "download" or "cache", "skip". Whether the images of http: and https: links show (C-c C-x C-v): "skip" not; "download" downloaded each time they show; "cache" downloaded once and kept for the session. The download follows org_resource_download_policy; an image larger than 20 MB is not downloaded. (org-display-remote-inline-images)
org_resource_download_policy
true, "prompt", "safe" or false, "prompt". Which remote resources are downloaded (the images of links, and in Emacs a file attached from a URL, C-c C-a u, or a remote #+INCLUDE: or #+SETUPFILE: in an export): true all of them; "prompt" those considered safe, and the others when the answer to Emacs's question says so (in Emacs, a yes or no: yes downloads it this once); "safe" only those considered safe; false none but those. (org-resource-download-policy)
org_safe_remote_resources
string[], []. The remote resources considered safe: Emacs regexps matched against a resource's URL and against the file:// URL of the file asking for it. The answers !, d and f to the download question add one for the rest of the session. Emacs has them too, for what it downloads. (org-safe-remote-resources)
org_startup_with_link_previews
boolean, false. Show the images of links to image files in place when a file opens, as C-c C-x C-v (org.link.preview) shows them. #+STARTUP: inlineimages (or linkpreviews) and noinlineimages decide for a file. Editors that can show images: Neovim from 0.13 (vim.ui.img), in a terminal with the Kitty graphics protocol. (org-startup-with-link-previews)
org_startup_with_latex_preview
boolean, false. Show the LaTeX fragments as images when a file opens, as C-c C-x C-l (org.latex.preview) shows them, made by Emacs. #+STARTUP: latexpreview and nolatexpreview decide for a file. (org-startup-with-latex-preview)
org_startup_indented
boolean, false. Show files indented by level without changing them (org-indent-mode): the text under a headline lines up with its title, and leading stars are hidden. #+STARTUP: indent and noindent decide for a file, and org.indent.mode turns it on and off. It turns org_adapt_indentation off in such files, unless that is "headline-data". The lines a long line wraps into go on under its text, a headline's title or an item's text (wrap-prefix) in Neovim and Vim, without the prefix; under the prefix in Zed and Helix. (org-startup-indented)
org_startup_numerated
boolean, false. Number the headlines of files (org-num-mode): 1, 1.1, 1.2~​… after the stars, shown as inlay hints without changing the file. ~#+STARTUP: num and nonum decide for a file, and org.num.mode turns it on and off. (org-startup-numerated)
org_num_max_level
integer, every level. The deepest level org-num-mode numbers. (org-num-max-level)
org_num_skip_commented
boolean, false. org-num-mode leaves COMMENT subtrees unnumbered. (org-num-skip-commented)
org_num_skip_footnotes
boolean, false. org-num-mode leaves the footnotes section (* Footnotes) unnumbered. (org-num-skip-footnotes)
org_num_skip_tags
string[], []. org-num-mode leaves the subtrees of headlines with one of these tags (their own, not inherited) unnumbered. (org-num-skip-tags)
org_num_skip_unnumbered
boolean, false. org-num-mode leaves the subtrees of headlines with an UNNUMBERED property unnumbered. (org-num-skip-unnumbered)
org_hide_leading_stars
boolean, false. Hide all the stars of a headline but the last; they keep their place. #+STARTUP: hidestars and showstars decide for a file. (org-hide-leading-stars)
org_indent_mode_turns_on_hiding_stars
boolean, true. Where org_startup_indented (or #+STARTUP: indent) shows a file indented, hide the leading stars too, whatever org_hide_leading_stars says. (org-indent-mode-turns-on-hiding-stars)
org_indent_mode_turns_off_org_adapt_indentation
boolean, true. Where a file shows indented, org_adapt_indentation is off (unless it is headline-data): new and moved text is not indented to its headline. (org-indent-mode-turns-off-org-adapt-indentation)
org_indent_indentation_per_level
integer, 2. How many columns a file shown indented moves each level of headlines and their text in; 0 shows them as they are. (org-indent-indentation-per-level)
org_duration_format
"h:mm", "h:mm:ss", or a list, [["d", false], ["special", "h:mm"]]. How durations are written (clock tables, clock lines, efforts): "h:mm" or "h:mm:ss", or a list of units each with whether it is written when zero (["d", false]), with perhaps ["special", "h:mm"] (the hours and minutes as H:MM after the larger units), ["special", "h:mm:ss"], ["special", 2] (one unit with 2 decimals) and "compact" (no space between units). The units are those of org_duration_units. (org-duration-format)
org_duration_units
[unit, minutes][], [["min", 1], ["h", 60], ["d", 1440], ["w", 10080], ["m", 43200], ["y", 525960]]. The units of durations and the minutes in each, for reading efforts and writing durations: ["d", 480] for days of 8 hours. (org-duration-units)
org_fontify_done_headline
boolean, true. Show a headline marked done in the look of done headlines past its keyword (org-headline-done). (org-fontify-done-headline)
org_fontify_todo_headline
boolean, false. Show a headline marked with a keyword not done in the look of TODO headlines past its keyword (org-headline-todo, the token modifier todo). (org-fontify-todo-headline)
org_fontify_quote_and_verse_blocks
boolean, false. Show the lines inside quote and verse blocks in their own look (org-quote, org-verse: the token types quote and verse). (org-fontify-quote-and-verse-blocks)
org_custom_properties
string[], []. The properties org.custom.properties.toggle (org-toggle-custom-properties-visibility) hides in the property drawers, and shows again: ["ID", "CUSTOM_ID"]. Editors that can hide them: Neovim from 0.11, and Sublime Text, in a fold. (org-custom-properties)
org_n_level_faces
integer, 8. How many looks headlines take by level, from 1 to 8 (the token modifiers level1 to level8, Org's org-level-1 to org-level-8): with 4, a headline of level 5 looks as one of level 1, or as one of level 4 with org_cycle_level_faces off. (org-n-level-faces)
org_cycle_level_faces
boolean, true. Past the last look of org_n_level_faces, headlines take the looks of the levels from the first again; with false, those deeper all keep the last. (org-cycle-level-faces)
org_fontify_whole_heading_line
boolean, false. Show the look of a headline's level past the end of its text, to the edge of the window: for looks with a background. Editors that can show it: Neovim, Vim and VS Code (org-lsp/lineHighlights, VS Code's colors org.headlineLevel1Background and on). (org-fontify-whole-heading-line)
org_ellipsis
string, the standard three dots, .... What a closed fold shows after its first line, such as " ▾", in the highlight group OrgLspEllipsis (Neovim). Editors that can show it: Neovim and Vim. (org-ellipsis)
org_bullets_mode
boolean, false. org-bullets: the last star of each headline shows as a bullet, those of org_bullets_bullet_list by level, and the stars before it are hidden, as with org_hide_leading_stars. (org-bullets-mode)
org_bullets_bullet_list
string[], ["◉", "○", "✸", "✿"]. The bullets of org_bullets_mode, one a level, repeating after the last. (org-bullets-bullet-list)
org_bullets_list_bullet
false, or a string, "•". What org_bullets_mode shows in place of the -, + or * of an item, as org-bullets.nvim does; false leaves them as they are.
org_bullets_checkboxes
false, or { todo, half, done }, { "todo": " ", "half": "-", "done": "✓" }. What org_bullets_mode shows between the brackets of a checkbox, [ ], [-] and [X], as org-bullets.nvim does; false leaves them as they are. A state left out keeps its default.
org_src_lang_modes
{ [language]: mode }, {}. The major mode, without -mode, of a language of source blocks, over Org's own (elisp → emacs-lisp, sh → sh): { "ipython": "python" }. Neovim and Vim color the code of a block in the language of its mode (org-lsp/codeBlocks), by their name for it (emacs-lisp → elisp, sh → bash); Emacs, where it edits or exports a block, takes it too. (org-src-lang-modes)
org_src_preserve_indentation
boolean, false. Leave the code of source blocks as it is indented when re-indenting. (org-src-preserve-indentation)
org_babel_tangle_lang_exts
object, {}. By language, the extension of the file :tangle yes writes its blocks to, before Org's own (emacs-lisp → el): { "python": "py" }. A language without one gives its name. (org-babel-tangle-lang-exts)
org_babel_tangle_use_relative_file_links
boolean, true. Whether the link comments of tangled files (:comments link) point back to the Org file by a relative path; with false by its whole path. (org-babel-tangle-use-relative-file-links)
org_babel_tangle_comment_format_beg
string, "[[%link][%source-name]]". The comment before a tangled block (:comments link): %link the link back to it, %source-name its name, %file the Org file, %start-line the line its code starts on. (org-babel-tangle-comment-format-beg)
org_babel_tangle_comment_format_end
string, "%source-name ends here". The comment after a tangled block, with the keys of org_babel_tangle_comment_format_beg. (org-babel-tangle-comment-format-end)
org_babel_tangle_uncomment_comments
boolean, false. Write the comments of tangled blocks as they are: not commented, and no line break after them. (org-babel-tangle-uncomment-comments)
org_babel_process_comment_text
string, "org-remove-indentation". The function the Org text of :comments org goes through: org-remove-indentation takes its common indentation away, identity leaves it; Emacs tangles with any other. (org-babel-process-comment-text)
org_babel_tangle_default_file_mode
string, "644". In octal, the mode a symbolic :tangle-mode (u+x) changes. (org-babel-tangle-default-file-mode)
org_babel_tangle_remove_file_before_write
true, false, "auto", "auto". Whether a file tangling writes again is deleted first: true always (a link to it becomes a file of its own), false never (a read-only file refuses), "auto" when it is read-only. (org-babel-tangle-remove-file-before-write)
org_babel_noweb_wrap_start
string, "<<". What opens a Noweb reference in a source block (<<name>>). (org-babel-noweb-wrap-start)
org_babel_noweb_wrap_end
string, ">>". What closes a Noweb reference. (org-babel-noweb-wrap-end)
org_src_content_indentation
number, 2. How far code is indented past its source block: when re-indenting, and when the code of a block edited in a file of its own (C-c ') is written back. Formerly org_edit_src_content_indentation, which is still read. (org-src-content-indentation)
org_agenda_span
"day", "week", "fortnight", "month", "year", or a number of days, "week". How much time the agenda shows. (org-agenda-span)
org_agenda_start_on_weekday
0 to 6 (0 is Sunday), or false, 1. The day a week or fortnight starts on; false starts it today. (org-agenda-start-on-weekday)
org_deadline_warning_days
number, 14. How many days before a deadline it shows up. (org-deadline-warning-days)
org_scheduled_delay_days
number, 0. How many days after its date a scheduled entry shows up. (org-scheduled-delay-days)
org_scheduled_past_days
number, 10000. How many days a scheduled entry that is not done keeps showing up. (org-scheduled-past-days)
org_modules
string[], []. Org modules to load. org-habit turns habits on: entries with the STYLE property habit and a scheduled date with a repeater (.+2d, .+2d/4d for a deadline too) show in the agenda with a graph of the days they were done. ol-man makes [[man:ls]] a link to a man page (org_man_command). org-ctags follows links to the tags of a TAGS file, as loading it and calling org-ctags-enable does (org_ctags_open_link_functions). Others are ignored. (org-modules)
org_habit_graph_column
number, 40. The column the consistency graph of a habit starts at in the agenda. (org-habit-graph-column)
org_habit_preceding_days
number, 21. How many days before today a habit's graph shows. (org-habit-preceding-days)
org_habit_following_days
number, 7. How many days after today a habit's graph shows. (org-habit-following-days)
org_habit_show_habits
boolean, true. Show habits in the agenda. (org-habit-show-habits)
org_habit_show_habits_only_for_today
boolean, true. Show habits only on today's date, not on future days of the agenda. (org-habit-show-habits-only-for-today)
org_habit_show_all_today
boolean, false. Show every habit today, even those not scheduled for today. (org-habit-show-all-today)
org_habit_today_glyph
string, "!". The mark of today in a habit's graph. (org-habit-today-glyph)
org_habit_completed_glyph
string, "*". The mark of a day a habit was done in its graph. (org-habit-completed-glyph)
org_habit_show_done_always_green
boolean, false. A day a habit was done is green in its graph even when it was done late. (org-habit-show-done-always-green)
org_habit_scheduled_past_days
number, org_scheduled_past_days. How many days a habit that is not done keeps showing up. (org-habit-scheduled-past-days)
org_deadline_past_days
number, 10000. How many days a missed deadline keeps showing up. (org-deadline-past-days)
org_agenda_skip_scheduled_if_done
boolean, false. Leave out scheduled entries that are done. (org-agenda-skip-scheduled-if-done)
org_agenda_skip_deadline_if_done
boolean, false. Leave out deadlines of entries that are done. (org-agenda-skip-deadline-if-done)
org_agenda_skip_timestamp_if_done
boolean, false. Leave out timestamps of entries that are done. (org-agenda-skip-timestamp-if-done)
org_agenda_time_leading_zero
boolean, false. Write times with two digits for the hour (08:00). (org-agenda-time-leading-zero)
org_agenda_timegrid_use_ampm
boolean, false. Write the times of the agenda, the time grid's too, in 12-hour form (8:00am). (org-agenda-timegrid-use-ampm)
org_agenda_search_headline_for_time
boolean, true. Take a time in a headline (Call at 15:00) as the time of its entry. (org-agenda-search-headline-for-time)
org_agenda_remove_times_when_in_prefix
boolean, "beg", true. Take a time out of the headline when the prefix shows it; beg only one at the start of the headline. (org-agenda-remove-times-when-in-prefix)
org_agenda_default_appointment_duration
integer, none. Minutes an entry with a start time and no end time lasts: the agenda shows it as a range. (org-agenda-default-appointment-duration)
org_agenda_remove_timeranges_from_blocks
boolean, false. Take a date range out of the headline of its lines. (org-agenda-remove-timeranges-from-blocks)
org_agenda_diary_sexp_prefix
string, none. A regexp (Emacs's syntax): what it matches of a diary sexp's text goes in front of the line, as a scheduled date's Scheduled: does. (org-agenda-diary-sexp-prefix)
org_agenda_show_inherited_tags
boolean, "always", string[], true. Show the inherited tags of an entry on its agenda lines: where org_agenda_use_tag_inheritance has them (true), always, never (false), or in these kinds of views (agenda, todo, search). Sorting by tag and org_agenda_max_tags go by the tags a line shows. (org-agenda-show-inherited-tags)
org_agenda_use_tag_inheritance
boolean, string[], ["todo", "search", "agenda"]. The kinds of views whose lines have inherited tags (true: all). Tags matches always have them. (org-agenda-use-tag-inheritance)
org_agenda_hide_tags_regexp
string, none. A regexp (Emacs's syntax): the tags it matches are not shown on agenda lines, but filters still see them. (org-agenda-hide-tags-regexp)
org_agenda_include_deadlines
boolean, true. Show deadlines in the agenda. (org-agenda-include-deadlines)
org_agenda_skip_additional_timestamps_same_entry
boolean, false. Once a timestamp of an entry has made a line for a day, leave out its other timestamps on that day. (org-agenda-skip-additional-timestamps-same-entry)
org_agenda_fontify_priorities
boolean, "cookies", "cookies". Highlight the priority cookies of agenda lines (cookies), or each line from its cookie on (true; links and tags keep their own look); the highest priority shows in bold, the lowest in italic. false highlights none. Org's list of faces by priority is not read here: org_priority_faces gives them. (org-agenda-fontify-priorities)
org_agenda_prefer_last_repeat
boolean, string[], false. Show a repeating scheduled date, deadline or timestamp at its last repeat up to today instead of its base date, for every entry (true) or for those with one of these TODO keywords. (org-agenda-prefer-last-repeat)
org_agenda_skip_deadline_prewarning_if_scheduled
boolean, "pre-scheduled", number, false. For a scheduled entry, show its deadline only on its date (true), not before its scheduled date (pre-scheduled), or from N days before it (a number). (org-agenda-skip-deadline-prewarning-if-scheduled)
org_agenda_skip_scheduled_delay_if_deadline
boolean, "post-deadline", number, false. For an entry with a deadline, drop the delay of its scheduled date (--2d) (true), or keep it no later than the deadline (post-deadline). A number drops it too, as Org's code does. (org-agenda-skip-scheduled-delay-if-deadline)
org_agenda_skip_scheduled_if_deadline_is_shown
boolean, "not-today", "repeated-after-deadline", false. Leave out a scheduled date on a day its entry's deadline shows (true), only when it was scheduled before today (not-today); repeated-after-deadline is org_agenda_skip_scheduled_repeats_after_deadline. Not for habits. (org-agenda-skip-scheduled-if-deadline-is-shown)
org_agenda_skip_scheduled_repeats_after_deadline
boolean, false. Leave out the repeats of a scheduled date that come after the entry's deadline. (org-agenda-skip-scheduled-repeats-after-deadline)
org_agenda_skip_comment_trees
boolean, true. Leave out of every view the entries of a commented subtree (COMMENT after the stars). (org-agenda-skip-comment-trees)
org_agenda_skip_archived_trees
boolean, true. Leave out of every view the entries of an archived subtree (tagged ARCHIVE), unless archives mode (v a) shows them. Org advises leaving it on and using v a instead. (org-agenda-skip-archived-trees)
org_agenda_todo_list_sublevels
boolean, true. Show in the TODO list the TODO entries below another one. Off, the list skips the subtree of each entry it shows or leaves out for a date. (org-agenda-todo-list-sublevels)
org_agenda_todo_ignore_with_date
boolean, false. Leave out of the TODO list the entries with an active timestamp anywhere in their text, scheduled and deadline dates too. (org-agenda-todo-ignore-with-date)
org_agenda_todo_ignore_scheduled
boolean, "future", "past", "all", number, false. Leave out of the TODO list the scheduled entries: all of them (true, all), those scheduled after today (future), today or before (past), or with a number N, N days from now or later (a negative N: N days ago or before). (org-agenda-todo-ignore-scheduled)
org_agenda_todo_ignore_deadlines
boolean, "near", "far", "all", "future", "past", number, false. Leave out of the TODO list the entries with a deadline: in its warning period, that is, shown in the agenda (true, near), not yet in it (far), all of them (all), after today (future), today or before (past), or with a number as for org_agenda_todo_ignore_scheduled. (org-agenda-todo-ignore-deadlines)
org_agenda_todo_ignore_timestamp
boolean, "future", "past", "all", number, false. Leave out of the TODO list the entries with an active timestamp that is no scheduled or deadline date, with the values of org_agenda_todo_ignore_scheduled. (org-agenda-todo-ignore-timestamp)
org_agenda_todo_ignore_time_comparison_use_seconds
boolean, false. Compare the dates of the org_agenda_todo_ignore_* settings with now to the second instead of by day: future is then later than now, and a number counts seconds. (org-agenda-todo-ignore-time-comparison-use-seconds)
org_tags_match_list_sublevels
true, false, "indented", true. Whether tags matches (agenda, sparse trees) and stuck projects list the entries below one they list: false passes over its subtree, indented shows them with a dot for each level below the first. (org-tags-match-list-sublevels)
org_agenda_tags_todo_honor_ignore_options
boolean, false. Have the org_agenda_todo_ignore_* settings leave entries out of tags-todo matches as well. (org-agenda-tags-todo-honor-ignore-options)
org_agenda_sorting_strategy
{ agenda?, todo?, tags?, search? } of string[], or string[], { "agenda": ["habit-down", "time-up", "urgency-down", "category-keep"], "todo": ["urgency-down", "category-keep"], "tags": ["urgency-down", "category-keep"], "search": ["category-keep"] }. How the lines of a day (agenda), the TODO list (todo), a tags match (tags, tags-todo too) and a search (search) are ordered: the strategies in turn, each deciding when the ones before do not. A view without a list takes agenda's, and without that time-up, category-keep, urgency-down; one list alone is for every view. time-up~​/​-down~ the time of day; timestamp-, scheduled-, deadline-, ts- (active) and tsia- (inactive) up~​/​~down the date of that kind (in the TODO list and a tags match, the entry's); priority- the priority, urgency- the priority with how near or overdue the date is; effort-, category- (and category-keep, the order the entries come in), tag- (the last tag), todo-state- (where the keyword is in the file's list, done ones first), habit-, alpha- (the headline), stats- (the statistics cookie). user-defined-up and -down call Lisp, which the server does not run. (org-agenda-sorting-strategy)
org_agenda_sort_notime_is_late
boolean, true. Lines without a time (or without the date a strategy sorts by) come after those with one. (org-agenda-sort-notime-is-late)
org_agenda_sort_noeffort_is_high
boolean, true. Entries without an effort count as having the highest when sorted, filtered or limited by effort. (org-agenda-sort-noeffort-is-high)
org_agenda_max_entries
integer, or { agenda?, todo?, tags?, search? } of integers, no limit. How many entries a day of the agenda, the TODO list, a tags match or a search shows at most: one number for all, or one for each kind of view. Other lines, such as those of the time grid, go as well; with a negative number they stay. (org-agenda-max-entries)
org_agenda_max_todos
integer, or { agenda?, todo?, tags?, search? } of integers, no limit. How many entries with a TODO keyword a view shows at most, the other lines going as well; with a negative number, those stay. (org-agenda-max-todos)
org_agenda_max_tags
integer, or { agenda?, todo?, tags?, search? } of integers, no limit. How many entries with tags a view shows at most, the other lines going as well; with a negative number, those stay. (org-agenda-max-tags)
org_agenda_max_effort
integer, or { agenda?, todo?, tags?, search? } of integers, no limit. The most minutes of effort the entries of a view add up to: entries show while their efforts, in order, stay within it (an entry without one counts as the highest, or as -1 with org_agenda_sort_noeffort_is_high off). (org-agenda-max-effort)
org_agenda_show_future_repeats
boolean, "next", true. Show the future dates of repeating entries: all of them, none, or only the next. (org-agenda-show-future-repeats)
org_agenda_show_all_dates
boolean, true. Show days without entries. (org-agenda-show-all-dates)
org_agenda_tags_column
number, "auto", "auto". Where tags are aligned in the agenda: a column (negative: where they end), or auto for the right edge of the window. With auto, the editors that tell the server how wide the agenda's window is (Neovim, Vim, Sublime Text) have the tags there, and the agenda follows the window as it is resized; the others (VS Code, Zed) have them end at column 80. (org-agenda-tags-column)
org_agenda_use_time_grid
boolean, true. Draw the time grid. (org-agenda-use-time-grid)
org_agenda_time_grid
[string[], number[], string, string], [["daily", "today", "require-timed"], [800, 1000, 1200, 1400, 1600, 1800, 2000], "......", "----------------"]. The time grid, as Org writes it: the days that have it (daily: a one-day agenda; weekly: every day of a longer one; today: today; require-timed: only days with an entry that has a time; remove-match: no grid line at a time an entry already has), the times of its lines (800 for 8:00), what follows a time that has no end time, and the text of a grid line. (org-agenda-time-grid)
org_agenda_current_time_string
string, "now - - - - - - - - - - - - - - - - - - - - - - - - -". The text of the line for the current time. (org-agenda-current-time-string)
org_agenda_show_current_time_in_grid
boolean, true. Show the current time in the grid. (org-agenda-show-current-time-in-grid)
org_agenda_weekend_days
number[], [6, 0]. The days drawn as the weekend (0 is Sunday). (org-agenda-weekend-days)
org_agenda_start_with_log_mode
boolean, false. Start the agenda in log mode, which shows what was closed and clocked each day (l toggles it). (org-agenda-start-with-log-mode)
org_agenda_start_with_clockreport_mode
boolean, false. Start the agenda with the clock report under it (R toggles it). (org-agenda-start-with-clockreport-mode)
org_agenda_clockreport_parameter_plist
string, ":link t :maxlevel 2". The parameters of the clock report's table, as those of a clock table block (:maxlevel 3 :tags t); :block, :tstart, :tend and :scope are the agenda's. (org-agenda-clockreport-parameter-plist)
org_agenda_clock_report_header
string, none. Text on a line of its own (or lines) before the clock report. (org-agenda-clock-report-header)
org_agenda_start_with_archives_mode
"trees" | "files" | false, false. Start the agenda with entries in archived trees (trees; v a toggles it), or those and the files the agenda files archive to (files; v A). (org-agenda-start-with-archives-mode)
org_agenda_log_mode_items
string[], ["closed", "clock"]. What log mode shows: closed entries, clock lines and state changes. (org-agenda-log-mode-items)
org_agenda_log_mode_add_notes
boolean, true. Show the note of a state change or a clock line after the headline in log mode. (org-agenda-log-mode-add-notes)
org_agenda_move_date_from_past_immediately_to_today
boolean, true. Moving a date of the past one day later from the agenda (S-<right>) takes it to today. (org-agenda-move-date-from-past-immediately-to-today)
org_agenda_persistent_marks
boolean, false. Keep the marks of a bulk action (B) after it (p in its menu toggles this for one action). (org-agenda-persistent-marks)
org_agenda_show_outline_path
boolean, "title", true. As the cursor moves in the agenda, show where the entry of its line is: the file's name and the headlines above it (work.org/Projects/Report), in the echo area or the status bar. With title the file's #+TITLE: comes first instead of its name. (org-agenda-show-outline-path)
org_agenda_start_with_follow_mode
boolean, false. Start the agenda in follow mode, which shows the entry of the cursor's line in another window as the cursor moves (F toggles it). (org-agenda-start-with-follow-mode)
org_agenda_start_with_entry_text_mode
boolean, false. Start the agenda with some text of each entry under its line (E toggles it). (org-agenda-start-with-entry-text-mode)
org_agenda_entry_text_maxlines
integer, 5. The most lines of an entry's text E shows. (org-agenda-entry-text-maxlines)
org_agenda_entry_text_leaders
string, " > ". What each line of an entry's text starts with in the agenda. (org-agenda-entry-text-leaders)
org_agenda_entry_text_exclude_regexps
string[], []. Emacs regexps whose matches are left out of the entry text E shows. (org-agenda-entry-text-exclude-regexps)
org_agenda_add_entry_text_maxlines
integer, 0. The most lines of each entry's text written under its line when the agenda is written to a plain text file (C-x C-w), each after four spaces and >; 0 writes none. The text E shows is not written. (org-agenda-add-entry-text-maxlines)
org_agenda_add_entry_text_descriptive_links
boolean, true. Whether links in the text org_agenda_add_entry_text_maxlines writes show as their descriptions. In Org 9.8.10 a plain text file has the links as they are either way, and so does org-lsp. (org-agenda-add-entry-text-descriptive-links)
org_agenda_view_columns_initially
boolean, false. Show column view (through Emacs) each time an agenda view is made, as C-c C-x C-c there would. (org-agenda-view-columns-initially)
org_agenda_persistent_filter
boolean, false. A new agenda view keeps the filters by tag, category, regexp and effort of the agenda still open, rather than starting without them. (org-agenda-persistent-filter)
org_agenda_block_separator
string | false, "=". What goes between the blocks of a block agenda: one character repeated across 79 columns, a longer text as it is, or false for nothing. In a block's settings, the separator above that block. (org-agenda-block-separator)
org_agenda_compact_blocks
boolean, false. Leave out the separators between blocks and the header over agenda blocks. (org-agenda-compact-blocks)
agenda_hide_empty_blocks
boolean, false. Leave out the blocks of a block agenda that show no entries. Not in Org.
org_super_agenda_mode
boolean, false. org-super-agenda: show the lines of the agenda's views in the groups of org_super_agenda_groups, each under a header. Off, the groups are not used. (org-super-agenda-mode)
org_super_agenda_groups
object[], []. org-super-agenda's groups, in turn taking the lines they select: each an object of selectors and their arguments in Emacs's order, { name = "Today", time-grid = true }, or a list of them in turn; true is t, false is nil (and for name, none: no header). The lines no group takes come last, under org_super_agenda_unmatched_name. In a custom command's settings, the groups of that command or block. (org-super-agenda-groups)
org_super_agenda_unmatched_name
string, "Other items". The header of the lines no group takes. (org-super-agenda-unmatched-name)
org_super_agenda_unmatched_order
integer, 99. Where the lines no group takes come among the groups: groups show lowest order first. (org-super-agenda-unmatched-order)
org_super_agenda_header_separator
string, "\n". What goes before each header: text, or one character repeated across the window, then a newline. (org-super-agenda-header-separator)
org_super_agenda_header_prefix
string, " ". What each header starts with. (org-super-agenda-header-prefix)
org_super_agenda_final_group_separator
string, "". What goes after the last group: text put at the end of its last line, or one character repeated across the window on a line of its own. (org-super-agenda-final-group-separator)
org_super_agenda_date_format
string, "%e %B %Y". The headers of the groups of auto-planning and auto-ts, as format-time-string writes dates. (org-super-agenda-date-format)
org_super_agenda_hide_empty_groups
boolean, false. Leave out the headers of groups whose lines the agenda's filters all hide. (org-super-agenda-hide-empty-groups)
org_super_agenda_keep_order
boolean, false. Sort the lines of each group again, as the view sorts its lines: a group of several selectors puts the lines of its first selector first. (org-super-agenda-keep-order)
org_super_agenda_group_property_name
string, "agenda-group". The property auto-group groups lines by. (org-super-agenda-group-property-name)
org_super_agenda_properties_inherit
boolean, true. Look for the properties of property, auto-property and auto-group in the entries above too. (org-super-agenda-properties-inherit)
org_roam_enabled
boolean, false. org-roam: the files of org_roam_directory are a network of notes, whose nodes (files and entries with an ID) are found, linked to and made with the org.roam.* commands. Off, those commands only say so.
org_roam_directory
string, "~/org-roam/". The directory of org-roam's files, in all its subdirectories. ~/ is the home directory. (org-roam-directory)
org_roam_file_extensions
string[], ["org"]. The extensions of org-roam's files; each may be followed by .gpg or .age, which the server cannot read. (org-roam-file-extensions)
org_roam_file_exclude_regexp
string or string[], ["data/"]. Emacs regexps for the files that are not org-roam's, matched against their names relative to org_roam_directory; the default leaves out attachments. (org-roam-file-exclude-regexp)
org_roam_node_display_template
string, "${title}". How a node is offered: ${field} for its title, tags, todo, file, olp, aliases and the other fields of org-roam-node, ${field:N} in N columns, ${field:*} in what is left of the window's 79 columns. (org-roam-node-display-template)
org_roam_node_formatter
string, "". The description of a link org.roam.node.insert makes, a template as org_roam_node_display_template is (${title} (${file})); empty for the node's title. (org-roam-node-formatter)
org_roam_db_extra_links_elements
array, ["node-property", "keyword"]. Where else org-roam finds links than where Org does: in property drawers (node-property) and keyword lines (keyword). (org-roam-db-extra-links-elements)
org_roam_db_extra_links_exclude_keys
object, { "node-property": ["ROAM_REFS"], "keyword": ["transclude"] }. By node-property and keyword, the properties and keywords whose links are not links, in any case. A list given replaces the default one. (org-roam-db-extra-links-exclude-keys)
org_roam_graph_executable
string, "dot". The Graphviz program that draws org.roam.graph's graph, found on PATH or a path. (org-roam-graph-executable)
org_roam_graph_viewer
string, the editor's: it opens the file as the system does. The program that shows the graph, given its file. (org-roam-graph-viewer)
org_roam_graph_filetype
string, "svg". What Graphviz draws the graph as (its -T): svg, png, pdf~​… (~org-roam-graph-filetype)
org_roam_graph_extra_config
object, {}. Graphviz's attributes of the graph, in their order: { "rankdir": "LR" }. (org-roam-graph-extra-config)
org_roam_graph_edge_extra_config
object, {}. Graphviz's attributes of the links: { "dir": "back" }. (org-roam-graph-edge-extra-config)
org_roam_graph_node_extra_config
object, { "id": { "style": "bold,rounded,filled", "fillcolor": "#EEEEEE", "color": "#C9C9C9", "fontcolor": "#111111" }, "http": { "style": "rounded,filled", "fillcolor": "#EEEEEE", "color": "#C9C9C9", "fontcolor": "#0A97A6" }, "https": { "style": "rounded,filled", "fillcolor": "#EEEEEE", "color": "#C9C9C9", "fontcolor": "#0A97A6" } }. Graphviz's attributes of the nodes, by the type of the link to them: id for org-roam's nodes, https for the web pages linked to. (org-roam-graph-node-extra-config)
org_roam_graph_link_hidden_types
string[], ["file"]. The types of links the graph leaves out. (org-roam-graph-link-hidden-types)
org_roam_graph_max_title_length
integer, 100. The width a title takes in the graph, at most. (org-roam-graph-max-title-length)
org_roam_graph_shorten_titles
"truncate", "wrap", false, "truncate". What becomes of a title wider than org_roam_graph_max_title_length: cut with ... (truncate), over lines (wrap), or nothing (false). (org-roam-graph-shorten-titles)
org_roam_extract_new_file_path
string, "%<%Y%m%d%H%M%S>-${slug}.org". The file org.roam.extract offers for a node, relative to org_roam_directory: %<…> is the time as format-time-string writes it, ${title}, ${slug} and ${id} the node's. (org-roam-extract-new-file-path)
org_roam_link_auto_replace
boolean, true. Turn the roam: links of org-roam's files into id: links to their nodes as the files are saved, and as a link is followed. (org-roam-link-auto-replace)
org_roam_completion_everywhere
boolean, false. In org-roam's files, offer the titles of the nodes for the word at the cursor, not only in a link; the one picked becomes a link to its node. (org-roam-completion-everywhere)
org_roam_mode_sections
string[], ["backlinks", "reflinks"]. The sections of the org-roam buffer, in turn: backlinks (the nodes that link to the node), reflinks (those that link to or cite its references) and unlinked-references (the places that name it without a link, found by the server itself). (org-roam-mode-sections)
org_roam_capture_templates
object[], [{ "key": "d", "description": "default", "type": "plain", "target": ["file+head", "%<%Y%m%d%H%M%S>-${slug}.org", "#+title: ${title}\n"], "template": "%?", "unnarrowed": true }]. The templates of new nodes, as org_capture_templates writes them, with org-roam's targets: file and a path, file+head, a path and the text a new file starts with, file+olp, a path and the headlines of an outline path, file+head+olp, both, and node and the title, alias or ID of a node. The path, relative to org_roam_directory, and the texts may have ${title}, ${slug}, ${id} and ${name}, which asks for name (${name=default} starts the answer with default), besides the escapes of org_capture_templates. unnarrowed shows the whole file in the capture buffer. (org-roam-capture-templates)
org_roam_dailies_directory
string, "daily/". Where the daily notes are, relative to org_roam_directory. (org-roam-dailies-directory)
org_roam_dailies_capture_templates
object[], [{ "key": "d", "description": "default", "type": "entry", "target": ["file+head", "%<%Y-%m-%d>.org", "#+title: %<%Y-%m-%d>\n"], "template": "* %?" }]. The templates of the daily notes, as org_roam_capture_templates writes them, with paths relative to org_roam_dailies_directory; %<…> is the note's day. (org-roam-dailies-capture-templates)
org_journal_enabled
boolean, false. org-journal: a journal in org_journal_dir, a file a day (or week, month, year), written with the org.journal.* commands. Off, those commands only say so.
org_journal_dir
string, "~/Documents/journal/". The directory of the journal's files. ~/ is the home directory. (org-journal-dir)
org_journal_file_type
string, "daily". A file a day (daily), week (weekly), month (monthly) or year (yearly); but daily, each entry has its date in a CREATED property. (org-journal-file-type)
org_journal_start_on_weekday
number, 1. The day a weekly file starts on: 1 is Monday, 7 Sunday. (org-journal-start-on-weekday)
org_journal_file_format
string, "%Y%m%d". The names of the files, as format-time-string writes the date their entries start on: with %Y, %m and %d (a yearly file needs only %Y, a monthly one %Y and %m). A name without .org is an Org file to org-journal, but not to most editors. (org-journal-file-format)
org_journal_date_format
string, "%A, %x". The date of an entry, after org_journal_date_prefix, as format-time-string writes it, in the C locale: %x is 10/09/26. (org-journal-date-format)
org_journal_date_prefix
string, "* ". What comes before the date of an entry: a headline, or #+title: ~ in a daily file. (~org-journal-date-prefix)
org_journal_time_format
string, "%R ". The time of a new entry of the day, as format-time-string writes it; empty for none. (org-journal-time-format)
org_journal_time_format_post_midnight
string, "". The time of an entry made after midnight while it is still yesterday (org_extend_today_until); empty for org_journal_time_format. (org-journal-time-format-post-midnight)
org_journal_time_prefix
string, "** ". What comes before the time of an entry: its stars give its level. (org-journal-time-prefix)
org_journal_hide_entries_p
boolean, true. Fold all but the new entry. (org-journal-hide-entries-p)
org_journal_follow_mode
boolean, false. In the calendar (org.goto.calendar), the entry of the day ] and [ move to shows in another window. (org-journal-follow-mode)
org_journal_find_file_fn
"find-file-other-window", "find-file", "find-file-other-window". Where a new entry and today's file (org.journal.open.current) show: in another window, or ("find-file") in the window of the command. (org-journal-find-file-fn)
org_journal_carryover_items
string, "TODO=\"TODO\"". The items of the entry before that move to today's, with the headlines above them: a match of the tags view (m); empty for none. (org-journal-carryover-items)
org_journal_skip_carryover_drawers
string[], []. Drawers left out of the items carried over. (org-journal-skip-carryover-drawers)
org_journal_carryover_delete_empty_journal
string, "never". What happens to an entry or file left empty by the carryover: never deleted, always, or ask. (org-journal-carryover-delete-empty-journal)
org_journal_file_header
string, "". What a new file starts with, as format-time-string writes it: #+title: Journal %Y. (org-journal-file-header)
org_journal_created_property_timestamp_format
string, "%Y%m%d". The date in the CREATED property of an entry of a file that is not daily. (org-journal-created-property-timestamp-format)
org_journal_scheduled_string
string, "". What comes before the timestamp of an entry for a day to come (org.journal.new.scheduled.entry). (org-journal-scheduled-string)
org_journal_enable_encryption
boolean, false. Tag the date of a new entry with crypt, for org-crypt to encrypt (org.crypt.encrypt.all, or as the file is saved with org-crypt-use-before-save-magic in the Emacs configuration). (org-journal-enable-encryption)
org_journal_enable_agenda_integration
boolean, false. Add the journal's files of today and the days to come to the agenda's files. (org-journal-enable-agenda-integration)
org_journal_search_result_date_format
string, "%A, %x". The date of each result of a search of the journal, as format-time-string writes it. (org-journal-search-result-date-format)
org_journal_search_results_order_by
string, "asc". The order of the results of a search of the journal: asc, the first day first, or desc, the last. (org-journal-search-results-order-by)
org_extend_today_until
number, 0. The hour before which it is still yesterday: for the agenda's today, the date prompt with nothing to start from, the times capture templates put in and the day of a datetree, .+ and ++ repeaters, clock report ranges and org-journal's new entries. (org-extend-today-until)
org_use_effective_time
boolean, false. Before the hour org_extend_today_until, a TODO change records 23:59 of the day before: in CLOSED:, LAST_REPEAT and the notes' timestamps. org.todo.yesterday does so at any hour. (org-use-effective-time)
org_use_last_clock_out_time_as_effective_time
boolean, false. A TODO change records the end of the first closed clock of the subtree instead of the time now, when there is one; this comes before org_use_effective_time. (org-use-last-clock-out-time-as-effective-time)
org_agenda_search_view_always_boolean
boolean, false. Read every search string of the search view (s) as words that must (+word, word) or must not (-word) occur, regexps in braces ({regexp}) and "quoted phrases". Off, it is a phrase whose spaces match any whitespace, unless its first word starts with +, - or {. (org-agenda-search-view-always-boolean)
org_agenda_search_view_force_full_words
boolean, false. The words of a Boolean search match whole words only, as a search string starting with : asks. (org-agenda-search-view-force-full-words)
org_agenda_search_view_max_outline_level
number, 0. The search view shows headlines down to this level, a match below one counting for the headline above: 0 for every level. (org-agenda-search-view-max-outline-level)
org_agenda_text_search_extra_files
string[], []. Files the search view (s) searches besides the agenda files, after them, as org_agenda_files names them. agenda-archives first adds the files the agenda files archive to. A file listed twice is searched at its last place. (org-agenda-text-search-extra-files)
org_agenda_prefix_format
{ agenda?, todo?, tags?, search? }, { "agenda": " %i %-12:c%?-12t% s", "todo": " %i %-12:c", "tags": " %i %-12:c", "search": " %i %-12:c" }. What comes before the headline on a line of the agenda (agenda), the TODO list (todo), tags searches (tags) and text searches (search): %c the category, %t the time, %s the leader (Scheduled: ~), ~%e the effort, %l a blank per level, %T the last tag, %b the headlines above (breadcrumbs), %i the icon (none). A width pads (%-12c on the right, %12c on the left), .N cuts, %? leaves out an empty field, and a character before the letter follows a value that is not empty (%-12:c). %(…) is Emacs Lisp, run by Emacs (the emacs option) on the entry's headline with category, extra, level … bound, as Org runs it: %(org-entry-get nil "X"), or a function of emacs_config. Without Emacs it is empty. (org-agenda-prefix-format)
org_agenda_todo_keyword_format
string, "%-1s". How a TODO keyword is written in the agenda: %-4s pads it to four columns, so that the titles line up; an empty format leaves keywords out. (org-agenda-todo-keyword-format)
org_agenda_scheduled_leaders
string[], ["Scheduled: ", "Sched.%2dx: "]. The leader of a scheduled entry on its day, and on today when its day has passed (%d: the days since). (org-agenda-scheduled-leaders)
org_agenda_deadline_leaders
string[], ["Deadline: ", "In %3d d.: ", "%2d d. ago: "]. The leader of a deadline on its day, on today before it (%d: the days left), and on today after it (%d: the days since). (org-agenda-deadline-leaders)
org_agenda_deadline_faces
[part, face][], [[1, "org-imminent-deadline"], [0.5, "org-upcoming-deadline"], [0, "org-upcoming-distant-deadline"]]. The look of a deadline in the agenda by the part of its warning time that has passed: the first whose part is no more than that, none past the last. The faces are Org's: org-imminent-deadline (or org-warning), org-upcoming-deadline, org-upcoming-distant-deadline; any other name is the plain look. (org-agenda-deadline-faces)
org_agenda_timerange_leaders
string[], ["", "(%d/%d): "]. The leader of a time range within a day, and of a range over days (%d: which day of it, %d: how many days). (org-agenda-timerange-leaders)
org_agenda_inactive_leader
string, "[". What goes before an inactive timestamp's line, when the agenda shows them ([, v [). (org-agenda-inactive-leader)
org_agenda_remove_tags
boolean, "prefix", false. Leave the tags out of the agenda's lines; prefix only when the prefix shows a tag (%T). (org-agenda-remove-tags)
org_stuck_projects
[string, string[], string[], string], ["+LEVEL=2/-DONE", ["TODO", "NEXT", "NEXTACTION"], [], ""]. What the stuck projects view (#) lists: the projects the match string finds whose subtree has no entry with one of the TODO keywords (* for any not done) or tags (* for any), and no match of the regexp. (org-stuck-projects)
org_agenda_breadcrumbs_separator
string, "->". What goes between the headlines of %b. (org-agenda-breadcrumbs-separator)
org_agenda_format_date
string, as Wednesday 7 October 2026, the week's number added on Mondays. How the agenda writes a day, as format-time-string does: %A %d %B %Y, %a %Y-%m-%d. (org-agenda-format-date)
org_agenda_start_day
string, today. The day the agenda starts from, as the date prompt reads it: -1d, +2d, 2026-10-01. (org-agenda-start-day)
org_agenda_custom_commands_contexts
object[], []. Where the commands of org_agenda_custom_commands are offered, as for org_capture_templates_contexts. (org-agenda-custom-commands-contexts)
org_agenda_custom_commands
object[], []. Commands of the agenda menu. Each has a key and a description, and either a type (agenda, alltodo, todo, tags or tags-todo) with a match (keywords such as NEXT|WAIT for todo, a match string such as work-home or PRIORITY="A" for tags), or blocks, a list of such views shown one after the other. header replaces a view's header (empty: none), and settings holds agenda options for the command or a block (org_agenda_span, org_agenda_start_day …). A command with only a key and a description groups the commands whose keys start with its key. (org-agenda-custom-commands)
virtual_documents
boolean, from the client's capabilities. Whether the client fetches the agenda with workspace/textDocumentContent. A client that announces that capability need not set this.
show_document
boolean, from the client's capabilities. Whether the client shows the documents the server asks it to show (window/showDocument): the agenda, capture buffers, an entry's file. A client that announces that capability need not set this; the Vim plugin does, for the LSP clients that leave the request to it.
show_document_notification
boolean, false. Whether the server asks the client to show a document with the notification org-lsp/showDocument, { id, params } with window/showDocument's params, which the client answers with org-lsp/showDocumentResult, { id, result }, rather than with window/showDocument: the Vim plugin sets it for coc.nvim, which shows those documents on its own and not as win_split_mode says.
refusal_results
boolean, false. Whether a command that does not apply at the cursor answers { notApplicable: true, message } rather than an error whose data says notApplicable, so that the key keeps its own meaning: the Vim plugin sets it for coc.nvim, which passes on only an error's message.
create_files
boolean, from the client's capabilities. Whether an edit may make the files it is for (a create resource operation), as a new archive file from the agenda; else the server writes them itself. The Vim plugin turns it off: coc.nvim has the empty file it makes as one empty line, which the edit's text would then end with.
org_client
boolean, false. The client has org-lsp's editor code: it knows the server's own token types and does what a command's result asks. A client that can announce it does so with experimental.orgClient; the Vim, Sublime Text and Zed plugins set this. Without it, the server sends the standard token types of LSP, which editors color without being told, message_prompts is on, and so are more code actions when the client shows message requests (window.showMessage) or message_prompts is set.
message_prompts
boolean, true for a client without org-lsp's editor code (org_client). Ask what commands ask for with window/showMessageRequest (a key, one of a list) or, for text and dates, through a rename at the cursor (textDocument/rename, whose new name is the answer), and say what they have to say with window/showMessage, for a client that does nothing with a command's result.
message_requests
boolean, true. Whether the client shows the questions of message_prompts that have choices, and Emacs's yes-or-no questions (window/showMessageRequest). Off, for a client that cannot (Helix), the server says PROMPT: pick the answer from the code actions, and until it is answered the code actions start with the choices; a rename with the choice's key answers too. A client with org-lsp's editor code that runs commands when told (run_command) is asked Emacs's questions as a command's (org.emacs.answer): the Vim plugin, as some of Vim's LSP clients answer no message request.
message_notifications
boolean, false. Whether the client shows the server's messages (Emacs's, as its echo area shows them) sent as org-lsp/message, { type, message } as window/showMessage's, rather than with window/showMessage, as a client announcing experimental.orgMessages does: for the Vim plugin, as some of Vim's LSP clients show no messages, or show them after their own name.
line_highlights
boolean, false. Whether the client highlights lines from edge to edge as the server sends them (org-lsp/lineHighlights): the agenda's entry the clock runs on, and headlines with org_fontify_whole_heading_line. As a client announcing experimental.orgLineHighlights does: for the Vim plugin and the Sublime Text package.
code_blocks
boolean, false. Whether the client colors the code of source, export and inline source blocks in its language where the server says (org-lsp/codeBlocks), as a client announcing experimental.orgCodeBlocks does: for the Vim plugin.
syntax
boolean, false. Whether the client's own syntax colors headlines before the semantic tokens come, with the TODO keywords of each file and the looks of headlines the server sends (org-lsp/syntax), as a client announcing experimental.orgSyntax does: for the Vim plugin.
run_command
boolean, false. Whether the client runs a command when the server asks (org-lsp/runCommand: a capture an org-protocol URL starts), as one it runs from a key, as a client announcing experimental.orgRunCommand does: for the Vim plugin and the Sublime Text package. Without it, the server runs the command itself, and asks what it asks with window/showMessageRequest.
display
boolean, false. Whether the client shows what stands in for hidden text, which the server sends (org-lsp/display: entities, sub- and superscripts, the bullets of org_bullets_mode, shrunk table fields), as a client announcing experimental.orgDisplay does: for the Vim plugin. Without it, they are inlay hints.
hidden_lines
boolean, false. Whether the client hides the lines a command's answer names (hiddenLines: the custom properties of org.custom.properties.toggle), as a client announcing experimental.orgHiddenLines does: for the Sublime Text package.
images
boolean, false. Whether the client shows images in place of links to image files and of LaTeX fragments (org.link.preview, org.latex.preview, org-lsp/images). As a client announcing experimental.orgImages does: for the Sublime Text package.
view_changed
boolean, false. Whether the server says when it has written the agenda's or the date prompt's file anew (org-lsp/viewChanged { uri }), for a client that does not see the file change on disk and reads it again when told: the Vim plugin.
date_prompt
boolean, false. Whether the client shows the date prompt's calendar, for a client that cannot announce experimental.orgDatePrompt: the Vim plugin. Without documents fetched from the server, the calendar is a file the server writes, which the client reads again when told (view_changed).
virtual_indent
boolean, false. Whether the client shows org-indent-mode's prefixes and hidden stars that the server sends (org-lsp/virtualIndent), as a client announcing experimental.orgVirtualIndent does: for the Vim plugin and the Sublime Text package, whose LSP clients announce nothing of the kind. A client that shows neither gets the prefixes as inlay hints instead.
command_actions
boolean, false. Offer more commands as code actions: the agenda, capture, refile, a TODO state or a priority picked from a list, a new heading or item (M-RET and its neighbours), for a client that cannot run a command from a key. The agenda's commands go through a local port instead: the server writes a script (command_script) that runs SCRIPT COMMAND [ROW COLUMN] in the agenda, where the cursor is when no row is given (the server follows the cursor through the document highlights the client asks for), for the editor's keys to call; with no agenda open, the commands that need none (the agenda, the TODO list, the agenda menu, capture). With org-lsp's editor code (org_client), the agenda's commands are not code actions and its file is beside the script, the same one for the same folders, and the server takes over the one the editor opens again when it starts. The Zed extension sets it; a client without the editor code needs none of it.
command_script
string, "~/.local/state/org-lsp/agenda-command". Where the server writes the script of command_actions. Of several servers, the one whose agenda the cursor was last in has it, and a server that starts takes it when no other answers there. It stays when the server stops: run then, it opens the Org file last opened, in its folder, with the editor's command line (zed), and sends the command to the server that starts for it.

A document that has #+TODO:, #+SEQ_TODO: or #+TYP_TODO: lines uses those keywords instead of org_todo_keywords, and one with a #+PRIORITIES: line uses its priorities instead of the three org_priority_… options; the agenda sorts each entry by the priorities of its own file.

Without org_agenda_files, the agenda is built from the Org files under the workspace folders (hidden directories, node_modules and target left out). Without workspace folders too, it is built from the Org files that are open. A file that is open in the editor is always read from the editor, not from disk.

Commands#

Commands run through workspace/executeCommand. The one argument says where the cursor is, in a document the server knows:

{
  "command": "org.todo.next",
  "arguments": [{ "textDocument": { "uri": "file:///home/me/org/work.org" }, "position": { "line": 3, "character": 0 } }]
}

This is TextDocumentPositionParams, with one optional field more: count, a number the user typed before the key (Emacs's prefix argument, Vim's count). The commands that move something by steps take it as the number of steps; the others ignore it. Commands that open a view work without the argument.

range, the selection the command was run on, is Emacs's active region, with position at one of its ends (the point) and the mark at the other. The commands marked "region": true in the manifest act on it as Org does: org-do-promote and org-do-demote on the headlines in it, items outdented and indented, lines turned into headings or items (org-toggle-heading, org-toggle-item), checkboxes toggled (org-toggle-checkbox), lines made a table (org-table-convert-region, C-c |), the region moved (org-metaup, org-metadown), wrapped in a block, a drawer or emphasis markers. These run in the server's Emacs (see Emacs below). The server itself refiles the subtrees selected together (Refile region to; The region is not a (sequence of) subtree(s) otherwise; with org_log_refile, Org's time note in the last headline it set one up for), stores a link whose search is the text selected (org-link-precise-link-target, no description), and inserts a link with the text selected as its description, in its place. An empty range is no selection. Code actions requested over a selection carry it in their commands, unless it is a single character (Helix's cursor).

folded, for the commands marked "folds": true in the manifest (org.export.dispatch, whose C-v exports only what shows; org.kill.line, which kills what a fold hides on its line; org.cut.subtree and org.copy.subtree, whose subtree is folded again when it is pasted if it was folded), is the editor's closed folds in the window, [[first, last]…], each the first and last line of a fold, from 0. clipboard, for those marked "clipboard": true, is the text of the editor's clipboard.

A command's result may carry "message": what Emacs says in the echo area when it is done, for the editor to show the same way (Neovim's messages, VS Code's notifications): TODO state changed to DONE (from the agenda, where the entry is out of sight), TODO state was already TODO, Priority of current item set to B, Priority removed, Scheduled to <2026-05-22 Fri>, Deadline on <…>, Timestamp updated, Refile to "Projects" in file /home/me/org/work.org: done, Switched to day view, Capture process aborted and target buffer cleaned up.

A command that runs as a key is typed returns its edit instead of sending it: org.return answers { "edits": [TextEdit…], "cursor": Position }, and the editor applies the edits to the document at hand and puts the cursor there before the next key is handled. (A workspace/applyEdit from the server, and a cursor moved after it, would race with what is typed next.) org.meta.return and its neighbours answer the same way. With "apply": true in the context the server applies the edit itself and moves the cursor with window/showDocument; the code actions of command_actions run them so. With command_actions every code action that stands for a command (a TODO state, a priority, a timestamp, a heading moved) runs that command with "apply": true instead of carrying its edit: Zed puts the cursor at the end of an edit that starts where it is, and the server puts it back where Org leaves point, and says what Org says. With "below": true, org.meta.return and its neighbours put the new heading, item or table row below the cursor's line, as nvim-orgmode's <Leader><CR> does: never above it and splitting nothing, as Emacs does from the end of the line with org-M-RET-may-split-line nil (in a table, org-table-insert-row with its argument).

A command that cannot run answers with error code -32803 (RequestFailed) and a message meant for the user, such as No agenda is open. When the command means nothing at the cursor (a timestamp key off a timestamp, a headline command before the first headline), the error's data is { "notApplicable": true }. An editor that bound the command to a key with a meaning of its own (see native in the manifest) then lets the key do that instead: Vim's <C-a> on a timestamp changes the date and elsewhere increments a number. With the option refusal_results, for an LSP plugin that passes on only an error's message (coc.nvim), such a command answers with the result { "notApplicable": true, "message" } instead.

The commands#

Before org.agenda.dispatch, org.agenda.list and org.agenda.todos
org-check-agenda-file: for a file of org_agenda_files that is not there (unless org_agenda_skip_unavailable_files), the command first asks Non-existent agenda file ~/gone.org. [R]emove from list or [A]bort? (input kind key, unavailable in the context). r removes it until the server starts again (Removed from Org Agenda list: …) and the command goes on; anything else is Abort.
org.agenda.dispatch
org-agenda (C-c a): asks for a view by its key, as Emacs's menu does (input kind key; a for the agenda, t for the TODO list, m / M for a tags search, s / S for a search, # for the stuck projects (org-agenda-list-stuck-projects, as org_stuck_projects says what a project is and what makes it not stuck), and the commands of org_agenda_custom_commands, of the types agenda, alltodo, todo, tags, tags-todo, search and stuck), and opens it. Group tags in a match string (org_group_tags) stand for the tags of their group, from the #+TAGS: lines of the agenda files (or org_tag_alist). With org_agenda_custom_commands_contexts, only the commands whose contexts hold where the menu was asked for are offered (org-contextualize-keys: the textDocument of the argument, the agenda's view, or none). A prefix key of custom commands asks again, with the keys so far in the input's context (keys); m and M then ask for the match string, s and S for the search string (input kind text, ask in the context).
org.return
org-return (RET): in a table, aligns it and goes to the same column of the next row, adding a row when there is none or the next is a rule; on a headline, puts the rest of the title on a new line with the tags kept in their column; in a list item, keeps the rest of the line in the item; else a new line. The new line is indented as electric-indent-mode indents in Org (org-indent-line), the blanks left at the end of the line removed. Returns { "edits", "cursor" } (see above); in a source block's code, notApplicable.
org.meta.return
org-meta-return (M-RET): in a table, splits the field at the cursor, what follows it going in front of the field one row down (org-table-wrap-region); in a list, a new item (org-insert-item), what follows the cursor in it, before the item when the cursor is before its text, the bullets numbered again; else a new heading (org-insert-heading): above a headline from its start, the rest of the title in it from within the title, after the headline elsewhere on it, and a line of text turned into a heading from its start. Empty lines before the new heading as before the one the cursor is in (org-blank-before-new-entry's auto). Returns { "edits", "cursor" }.
org.meta.left, org.meta.right, org.shiftmeta.left, org.shiftmeta.right, org.meta.up, org.meta.down :: Org's meta keys (M-<left>, M-<right>, M-S-<left>, M-S-<right>, M-<up>, M-<down>): on a headline, org-do-promote and org-do-demote (the headline, its tags aligned again, its text with org-adapt-indentation), org-promote-subtree and org-demote-subtree, org-move-subtree-up and org-move-subtree-down (past count siblings); M-<right> on a drawer or a block indents it (org-indent-drawer, org-indent-block). On a list item, org-outdent-item and org-indent-item (the item alone; on the first item of a list the whole list moves a column, with M-S- only), org-outdent-item-tree and org-indent-item-tree (with its children), org-move-item-up and org-move-item-down (with its children, the cursor going along): bullets, numbers and checkboxes put right after, the cookies counted again. In an Org table, org-table-move-column left and right, org-table-delete-column and org-table-insert-column, org-table-move-row up and down (see org.table.next.field). Returns { "edits", "cursor" }; elsewhere notApplicable. Also code actions on a headline, an item or a table, where they would change something.
org.table.next.field, org.table.previous.field, org.shiftmeta.up, org.shiftmeta.down, org.table.insert.row.below, org.table.hline, org.table.hline.above, org.table.hline.move, org.table.blank.field :: The commands of org-table.el in an Org table, as Emacs runs them: org-table-next-field (TAB: the table aligned, then the next field, over a rule to the next row, a new row after the last field) and org-table-previous-field (S-TAB), which the editors send for TAB and S-TAB on a table line, where they would cycle folds elsewhere; org-table-kill-row (M-S-<up>, the row in copy for the editor's register or clipboard), org-table-insert-row above (M-S-<down>) and below (its prefix argument); org-table-insert-hline below (C-c -) and above, org-table-hline-and-move (C-c RET), org-table-blank-field (C-c SPC in orgtbl-mode; Org mode 9.8 binds it to no key). Columns count as Org shows them: the hidden parts of links take none. The #+TBLFM: lines under the table follow the rows and columns that move, go or come (org-table-fix-formulas): $INVALID for a deleted column, the formulas of a deleted row or column gone. A field that is a formula (=…) or a line marked #, which Org evaluates on TAB, is refused with a message. Returns { "edits", "cursor" }; out of a table notApplicable.
org.cut.subtree, org.copy.subtree, org.paste.subtree
org-cut-subtree (C-c C-x C-w), org-copy-subtree (C-c C-x M-w) and org-paste-subtree (C-c C-x C-y). Cutting and copying take the subtree at the cursor and count - 1 siblings after it; the result has the text in copy, for the editor's clipboard or register, and cutting also { "edits", "cursor" }. Pasting reads clipboard from the context (the command has "clipboard": true in the manifest), or else the server's last cut or copy: before the headline at the cursor, else before the next one, its levels shifted to the deeper of the headlines around it, or to count; "The clipboard is not a (set of) tree(s)" otherwise. Before the first headline cutting and copying are notApplicable. A subtree cut or copied while the editor had it folded (a fold of folded starting on its headline) is folded again when it is pasted (org-subtree-clip-folded): its folds come in org-lsp/folds. In a table, as org-cut-special and its neighbours do, they cut, copy and paste the cells of the selection, or the field at the cursor, as a rectangle (org-table-cut-region, org-table-copy-region, org-table-paste-rectangle), in the server's Emacs, whose own clipboard keeps them. Code actions too (commandActions), with the server's own clipboard.
org.yank
org-yank (C-y): a clipboard of one or more subtrees, yanked at the start of a line or right after the stars of an otherwise empty headline, goes in as org.paste.subtree puts it with org_yank_adjusted_subtrees, else as it is. With org_yank_folded_subtrees (on by default) the cursor goes to the line after it, and the subtrees yanked at the start of a line are folded, their folds in org-lsp/folds once the editor has the edit; unless that would hide the text after them (Inserted text not folded because that would swallow text). Returns { "edits", "cursor" }; anything else, and everything with both options off, is notApplicable: the editor pastes as it does.
org.sort
org-sort (C-c ^) on entries, as org-sort-entries does: the children of the entry at the cursor, or the top-level entries before the first headline. Asks for the sorting type (input kind key): a alphabetic, n numeric, p priority, r property, o TODO order, t time, s scheduled, d deadline, c created, k clocking, a capital for the reverse order; for r and R then the property (kind choice, with answers in its context). Text compares by character code, as in Emacs's C locale; an entry without the date sorts by now. Returns { "edits", "cursor" }, the cursor on the parent (or the first top-level headline). On a list item, org-sort-list. In a table, org-table-sort-lines: the rows between the rules around the cursor (or all of them), by the field of the cursor's column: a alphabetic, n numeric or t time (a timestamp, a duration, a H:MM), a capital for the reverse order; before the first column it first asks which (kind text, step column, then the type with the column in answers).
org.sparse.tree
org-sparse-tree (C-c /): asks what to show (input kind key): r a regexp (org-occur, Emacs's regexp syntax, case folded), t TODO entries, T entries with these keywords (KWD1|KWD2), m a tags and properties match, p a property and its value, d deadlines due within org_deadline_warning_days, b and a scheduled and deadline dates before or after a date, D between two; then what that needs (kinds text, choice and date, the answers so far in answers, a line each). Returns { "sparse": { "lines", "highlights" } } and Org's message: the editor folds everything, then opens the folds around each line, as org-occur hides everything but the matches and the headlines above them, and highlights the ranges until the text changes; with "keepHighlights": true (org_remove_highlights_with_change off, or a tags or property match, which org-scan-tags highlights for good) until other highlights replace them. C-c C-c (org.checkbox.toggle) with highlights shown takes them away instead of what it does, saying Temporary highlights/overlays removed from current buffer, and returns { "sparse": { "keep": true, "unfold": [], "highlights": [] } }: with keep, highlights, when there, replace those shown. An editor's folds show the siblings of the headlines above as closed folds, where Org hides them.
org.insert.todo.heading
org-insert-todo-heading (M-S-RET): in a list, a new item with a checkbox, the cookies that count them updated; else a new heading with the keyword of the heading before it at its level, unless that one is done or has none, then the first keyword. Returns { "edits", "cursor" }.
org.insert.heading.after, org.insert.todo.heading.after
org-insert-heading-respect-content (C-RET) and org-insert-todo-heading-respect-content (C-S-RET): a heading, or a TODO heading, at the level of the one the cursor is in, after its subtree. Returns { "edits", "cursor" }.
org.agenda.list
Opens the agenda for the current week or day.
org.agenda.todos
Opens the list of all TODO entries.
org.agenda.later, org.agenda.earlier
Moves the agenda one span forward or backward.
org.agenda.today
Moves the agenda to today.
org.agenda.query.add, org.agenda.query.subtract, org.agenda.query.add.regexp, org.agenda.query.subtract.regexp :: org-agenda-manipulate-query ([, ], {, }) in a search view: asks for its search string again (input kind text), with a space and +, -, +{} or -{} after it (only the space when it was not Boolean), and searches for the answer. In an agenda view it builds the view again once with inactive timestamps, as org.agenda.inactive does. In a TODO list or a tags view it refuses.
org.agenda.inactive
v [: builds the agenda view again with org-agenda-include-inactive-timestamps, which shows the inactive timestamps and date ranges of the entries, their lines marked with org_agenda_inactive_leader ([), and says "Display now includes inactive timestamps as well". The next rebuilding leaves them out again, whether org.agenda.redo or a change in the files makes it. Refuses in other views.
org.agenda.goto.date
Asks for a date and shows the agenda from that day, over as many days as its span (org-agenda-goto-date); a week or a fortnight still starts on the first day of the week.
org.agenda.day, .week, .fortnight, .month, .year
Changes the span, keeping the day under the cursor in view.
org.agenda.redo
Rebuilds the agenda.
org.agenda.goto
Shows the entry of the agenda line under the cursor (org-agenda-switch-to, RET).
org.agenda.goto.other
The same in another window (org-agenda-goto, TAB): see window/showDocument above.
org.agenda.save
org-save-all-org-buffers: returns { "save": [uri…] }, the Org files the editor has open; the editor saves those with changes. Its message is Emacs's, Saving all Org buffers... done.
org.agenda.log, org.agenda.clockreport
Turn log mode (org-agenda-log-mode: what was closed and clocked each day) or the clock report under the agenda (org-agenda-clockreport-mode) on or off.
org.agenda.habits
org-habit-toggle-display-in-agenda (K), with org-habit in org_modules: hide habits or show them again (Habits turned off); with a count above 1 (C-u K), show every habit today or only those due (org_habit_show_all_today). Each day of a habit's consistency graph is a token of type agendaHabit, its modifier the face Org gives it: none before the habit is due (org-habit-clear-face), ready, alert or overdue, and future for the days to come.
org.table.import, org.table.export
org-table-import: asks for a file (relative to the document's directory) and makes its tab-, comma- or space-separated values a table at the cursor. org-table-export: the table written to a file, TABLE_EXPORT_FILE or else asked for (an existing one only once Overwrite file …? is answered yes), in a format, TABLE_EXPORT_FORMAT or else picked among Org's orgtbl-to-… functions, the one of the file's extension first. Both run in the server's Emacs (see "Emacs" below).
org.attach
org-attach (C-c C-a): Org's dispatcher of attachment commands, by key (input kind key): a, c, m, l, y attach a file asked for (relative to the document's directory) as org-attach-method (Emacs's option, set in emacs_options) says, by copying, moving or linking it; u one from a URL; n a new one, which the editor opens; z synchronizes; o opens one (picked among them when there are several), f the directory, by the system; d deletes one (picked), D all of them (after Emacs asks); s and S set and unset the DIR property; q aborts. b, O and F (an Emacs buffer, Emacs, Dired) are left out, and org-attach-commands does not change the keys. Run by the server's Emacs (see "Emacs" below), which makes the directory, gives the entry an ID or DIR and the ATTACH tag. org.open on an attachment: link opens the file there (org-attach-expand).
org.agenda.write
org-agenda-write (C-x C-w): asks for a file (relative to org_directory) and writes the view to it, asking Overwrite existing file …? first when it exists. A .org file gets each entry of the view once, without its children and promoted to level 1, in view order; any other name gets the view as plain text. .html, .ps, .pdf and .ics are refused.
org.agenda.bulk.mark, org.agenda.bulk.unmark, org.agenda.bulk.toggle
org-agenda-bulk-mark (m), -unmark (u), -toggle (M-m): mark the cursor's line for a bulk action (a count marks that many lines with entries), or take the mark away (with a count, all of them); the cursor goes to the next line with an entry. A marked line starts with > in the face of a TODO keyword, as Emacs's overlay shows it. The result's message says how many lines are marked. Marks stay as the view is built again, and a new agenda command clears them.
org.agenda.bulk.unmark.all, org.agenda.bulk.mark.all, org.agenda.bulk.toggle.all :: org-agenda-bulk-unmark-all (U), -mark-all (*), -toggle-all (M-*).
org.agenda.bulk.mark.regexp
org-agenda-bulk-mark-regexp (%): asks for a regexp (input kind text) and marks the lines whose entry's text it matches, searching the agenda as Emacs does (which stops at a match on a line without an entry).
org.agenda.bulk.action
org-agenda-bulk-action (B): asks for the action by key (input kind key, step action in the context): $ archive, A archive to the archive sibling, t a TODO state, + / - a tag to add or remove, s / d a date to schedule or set as deadline (read once, as a day), r a refile target (of the first entry's file), S scatter over the next N days (with a count, weekdays); p toggles whether the marks stay after it (org_agenda_persistent_marks). Then runs the command for each marked entry, by file and place in it, without asking for notes (a time is logged instead), and sends one edit a file. Without marks it acts on the cursor's line. The result's message: Acted on N entries.
org.agenda.follow
org-agenda-follow-mode (F): toggles follow mode, in which the entry of the cursor's line shows in another window (as org-agenda-show shows it, the agenda keeping the focus) at once and as the client reports the cursor on other lines (org-lsp/agendaCursor). org_agenda_start_with_follow_mode starts with it on.
org.agenda.entry.text
org-agenda-entry-text-mode (E, v E): shows some text of each entry under its line, as org-agenda-get-some-entry-text takes it (up to the next headline, without drawers, planning and clock lines, and what org_agenda_entry_text_exclude_regexps matches; the common indentation removed; each line after org_agenda_entry_text_leaders), at most org_agenda_entry_text_maxlines lines, or as many as a count says (which turns it on). Again turns it off. The lines belong to the entry above them, as commands and hovers there see it. Refused while tags, categories, a regexp or a top headline filter the view; setting a filter turns it off.
org.agenda.filter
org-agenda-filter (/): asks for a filter string (input kind text, completed from the tags and categories of the view) such as +work-home<1:00/report/: + or - and a category or tag, <, > or = and an effort, a regexp between slashes. A count negates it; starting with + keeps the filters there are. The lines that do not pass are hidden until the filters change or another view opens. The result's message says what filters there are, as Emacs's mode line does.
org.agenda.filter.tag
org-agenda-filter-by-tag (\): asks for a tag by its key in the agenda files' tag tables (input kind key, step in the context), TAB for one typed, SPC for any tag, . for the line's tags, \ for none, and - / + to exclude or keep. A count excludes. Group tags stand for their groups.
org.agenda.filter.category, org.agenda.filter.top.headline
org-agenda-filter-by-category (<) and org-agenda-filter-by-top-headline (^): keep the lines of the cursor's line's category or top-level headline, or with a count hide them; again removes the filter.
org.agenda.filter.regexp
org-agenda-filter-by-regexp (=): asks for a regexp and keeps the lines matching it (with a count, hides them); again removes the filter.
org.agenda.filter.effort
org-agenda-filter-by-effort (_): asks for <, > or = and then an effort by its digit, from Effort_ALL of org_global_properties (input kind key); _ removes the filter. Entries without an effort count as more than any.
org.agenda.filter.remove
org-agenda-filter-remove-all (|): shows every line again.
org.agenda.archives, org.agenda.archives.files
org-agenda-archives-mode (v a, v A): show the entries of archived trees too, which the agenda leaves out otherwise; with .files, also the files the agenda files archive to (their #+ARCHIVE: or org_archive_location, and their ARCHIVE properties) that exist. Each turns its mode off when it is on.
org.clock.in, org.clock.out, org.clock.cancel
org-clock-in, org-clock-out, org-clock-cancel, on the entry at the cursor or of an agenda line. Clocking in stops a clock that runs elsewhere, in the same edit; the clock is a CLOCK: line in the LOGBOOK drawer, as org_clock_into_drawer says. org.clock.in with a count of 4 (C-u) asks which entry to clock into (input kind choice, prompt Clock-in on task: ~): the default task (~d), the entry whose clock the last clock-in stopped (i), the clocked one (c) and the clock history (1, 2 …, at most org_clock_history_length); with 16 (C-u C-u) the entry becomes the default task; with 64 the clock starts when the last one stopped.
org.clock.in.last
org-clock-in-last (C-c C-x C-x): the clock on the entry clocked last ("Clocking back: …"); with a count of 4 the question of org.clock.in, with 16 from when the last clock stopped. The history lives as long as the server.
org.clock.resolve
org-resolve-clocks (C-c C-x C-z): each clock that runs in the open and agenda files, the last of each file first, is asked about in turn (input kind key, prompt Dangling clock started N mins ago [jkKtTgGSscCiq]?, step resolve in the context), with the keys of org-clock-resolve: k keeps some of its minutes, asked next (input kind text, prompt Keep how many minutes (default N):, empty for all of them: the clock runs on, the one that ran stops), t the same up to a time (input kind date), g "got back" some minutes ago (Got back how many minutes ago (default N):), s cancels it and starts it again now, C cancels it, j shows it, i and q leave it; the uppercase keys stop the clock instead (K, T, G, S, J). Each choice's label is the text of Emacs's *Org Clock* window; with org_clock_resolve_expert the input has "expert": true, the prompt alone. With a count (C-u), only the dangling clocks, those that are not the clock. Clocking in (org.clock.in, org.clock.in.last, in a file or on an agenda line) asks the same first, when no clock runs or always (org_clock_auto_clock_resolution), each clock then stopped rather than started again; a clock kept for less than its time without being started again is offered as the start of the next one (You stopped another clock N mins ago; start this one from then?, input kind key, y or n). A clock the server found running when it started, or written by hand, is the clock it shows and the one org.clock.out stops, but here it is dangling, as it is in an Emacs that has just started, until it is kept. With org_clock_idle_time, the first message from the editor after that many minutes without one, while a clock runs, makes the server ask the same with window/showMessageRequest (Clocked in & idle for N mins [jkKtTgGSscCiq]?), answered by org.clock.resolve.idle (org-resolve-clocks-if-idle).
org.clock.goto
org-clock-goto: shows the entry the clock runs on, or the one clocked last.
org.clock.display
org-clock-display (C-c C-x C-d): the time clocked under each headline, its subtree included, within org_clock_display_default_range (thisyear), or with a count within a range picked from a list (input kind choice); shown as inlay hints after the headlines (dots to column 60, then the time) until the file changes (with org_remove_highlights_with_change off, following their headlines) or org.checkbox.toggle (C-c C-c) takes them away. The result's message says the file's total. A client shows them if it shows inlay hints.
org.clock.report
org-clock-report (C-c C-x C-r): the clock table (#+BEGIN: clocktable) the cursor is in filled in again, or a new one on the line after the cursor, with :scope file before the first headline and :scope subtree under one, then org_clock_clocktable_default_properties; with a count, the first clock table of the file. Written as org-dblock-write:clocktable writes it: the scopes file, subtree, tree, treeN, agenda, agenda-with-archives, file-with-archives and a list of files; :block, :tstart, :tend, :wstart, :mstart, :step with :stepskip0, :maxlevel, :match, :link, :narrow, :compact, :indent, :level, :emphasize, :tags, :timestamp, :properties with :inherit-props, :tcolumns, :fileskip0, :filetitle, :hidefiles, :lang, :header, :formula (% or a formula) and :sort; a #+TBLFM: line of the table before is kept and calculated. org.checkbox.toggle (C-c C-c) on a dynamic block's #+BEGIN: or #+END: line fills it in again too, and the shifted cursor keys on a clock table's #+BEGIN: line move its :block (org-clocktable-shift: today to today+1, 2026-W20 to 2026-W21). The result carries the edit and the cursor.
org.dblock.update
org-dblock-update (C-c C-x C-u): the dynamic block the cursor is in filled in again, or with a count every block of the file (org-update-all-dblocks). Clock tables are written by the server; other blocks (columnview, with its summaries, and those of the user's org-dblock-write: functions) by the server's Emacs (see "Emacs" below), as is C-c C-c on their #+BEGIN: line.
org.custom.properties.toggle
org-toggle-custom-properties-visibility (no key in Emacs either), for a client that hides lines (experimental.orgHiddenLines): the lines of the properties of org_custom_properties in the property drawers, as Org finds them, in { "hiddenLines": { "uri", "lines" } }; run again, while they are hidden, no lines, for the client to show them again.
org.link.preview
org-link-preview (C-c C-x C-v), for a client that announces experimental.orgImages: true (others are told it cannot show images): the links to image files whose images show in place of them, as Org 9.8 picks them (no description, or a description that is a sole file: link). Answers { "preview": { "kind": "link", "uri", "scope", "range", "remove", "includeLinked", "items": [{ "range", "path" }] } }: on a link, that link (remove null: the client takes its image away if it shows one, else shows it); elsewhere the current section (remove false: shown anew); with a region, the region; count 4 clears there (remove true), 16 or 11 shows the whole file, 64 clears it, 1 and 11 take links with a description too. scope is what Emacs names in its messages. With "startup": true in the argument, the whole file when it opens with previews (org_startup_with_link_previews, #+STARTUP: inlineimages), else null. attachment: links are left out. With org_display_remote_inline_images download or cache, http: and https: links to images are among them, the path of each the file the server downloaded it to, in a private directory of its own (by curl, 20 MB at most, the same file for a URL each time). When there are images to download, the command answers with the images of files only (null when there are none), and the preview comes again in org-lsp/images, with all its images, once the downloads are there, so that the server does not wait for them (Emacs does). The previews download one after the other; one whose document changed or closed meanwhile is not sent, nor downloaded if its turn had not come. A URL that org_resource_download_policy and org_safe_remote_resources do not let through is first asked about as Emacs asks (org--confirm-resource-safe): an input of kind key, the choices !, d, f, y and n, with the URL as step and the answers so far as answers in its context. When the file opens nothing is asked, and those URLs are left out. An item has "width" when the image shows at a width of its own (org_image_actual_width, #+ATTR_ORG: :width, org-display-inline-image--width): { "pixels" }, or { "fraction" } of the width of the window's text; else "maxWidth", the most it shows at (org_image_max_width): { "columns" }, { "pixels" } or { "fraction" } of the window, unless there is no limit.
org.latex.preview
org-latex-preview (C-c C-x C-l), for a client that announces experimental.orgImages: true: the same parts and counts as org.link.preview, the images made by Emacs as Org makes them (org--latex-preview-region: latex and dvipng by default, into ltximg/ beside the file), in the colors foreground and background given in the argument. Answers that it is making them, and sends them in org-lsp/images; clearing answers at once.
org.dblock.insert
org-dynamic-block-insert-dblock (C-c C-x x): asks which block (input kind choice), then a clock table as org.clock.report makes it, or a column view (org-columns-insert-dblock) of the scope asked for, local, global or an entry's ID, made and filled in by Emacs.
org.todo
org-todo: when the keywords have keys (TODO(t)), asks for one (org-fast-todo-selection) and sets the state it selects, a space clearing it; without keys, the next state. With org_use_fast_todo_selection expert, the input has "expert": true and its prompt lists the keys as Emacs's message does ([a-z..]:Set [SPC]:clear, then {[t] TODO [d] DONE } for each sequence): an editor that can shows the prompt alone, without the menu of choices; with false, the next state, keys or not. In an Org file or on an agenda line. With org_enforce_todo_dependencies or org_enforce_todo_checkbox_dependencies, a change to a done state that a child not done, an earlier sibling under ORDERED or an unchecked box blocks is refused with Org's message (TODO state change from TODO to DONE blocked (by "TODO Child")).
org.tags.set
org-set-tags-command (C-c C-q; org-agenda-set-tags on an agenda line): the tags of the headline, from the file's #+TAGS: lines, or org_tag_alist, with org_tag_persistent_alist (or else the tags used in the file, and with org_complete_tags_always_offer_all_agenda_tags the agenda files'). When a tag has a key (work(w)), or org_use_fast_tag_selection is true, they are picked as org-fast-tag-selection picks them: an input of kind key whose choices are the tags with their keys ((on) for those set, (inherited)), RET to accept, SPC to clear them all, TAB to type one, ! to turn exclusive groups ({ @office @home }) off and on; each key turns its tag on or off, the others of its group off, and asks again with the tags so far in the prompt and in the input's context (answers). Otherwise the tags are typed (kind text, the current ones as :a:b:). The tags are written as org-set-tags writes them, sorted by org_tags_sort_function and aligned to org_tags_column.
org.todo.next, org.todo.previous
Changes the TODO state of the entry at the cursor, in an Org file or on an agenda line.
org.priority.up, org.priority.down
Raises or lowers the priority of the entry at the cursor, in an Org file or on an agenda line.
org.capture
org-capture: asks for a template's key (input kind key, groups one key at a time; with org_capture_templates_contexts, only the templates whose contexts hold where the capture starts), then for what its %^{…} and %^t escapes want (kinds text and date; %^C and %^L, when the editor's clipboard differs from the initial content, kind text with both as completions), with context carrying the keys and answers so far. %c and %x are the editor's clipboard (clipboard in the context: the manifest marks the command as reading it). %[file] puts in the file's text (~/ the home directory, a relative name relative to the file captured from); %(sexp) is evaluated by the server's Emacs (see "Emacs" below) once a capture, the escapes inside it expanded first with \ and " escaped, as org-capture-fill-template does, an error in it becoming %![Error: …]; without Emacs the capture fails with why. %:keyword is a property of the link %a makes (org-store-link-plist): :annotation and :initial are %a and %i, and an id: link (org_id_link_to_org_use_id) has :link, :description and :type; other keywords are empty, as Emacs leaves them for a link to an Org file. It then writes the filled template, as it will stand in its target (the whole target with unnarrowed), to a capture buffer (a file named CAPTURE-<target> in a directory of the server's own) and shows it with the cursor where %? was.
org.capture.finish
org-capture-finalize (C-c C-c in the capture buffer): the buffer's text goes into the target file, and the result { "close": uri } asks the editor to close the buffer (saving it first). A target that does not exist yet is written by the server. The argument may carry the buffer's text as text (also for org.capture.refile, and for a note buffer): a client that tells the server of changes only a while after they are made (coc.nvim) sends it, and it is used when the command runs in that buffer.
org.capture.abort
org-capture-kill (C-c C-k): closes the capture buffer; nothing changes.
org.capture.refile
org-capture-refile (C-c C-w): the entry goes to its target and from there under a refile target picked as for org.refile.
org.roam.node.find, org.roam.node.insert, org.roam.capture, org.roam.node.random :: org-roam's org-roam-node-find, org-roam-node-insert, org-roam-capture and org-roam-node-random, with org_roam_enabled (see Notes (org-roam)); without it they fail with why. They need no document but org.roam.node.insert, which inserts at the cursor or in place of the selection (range). They ask for the node (input kind text, prompt Node, the selection as value, every title and alias of the nodes as completions, as org_roam_node_display_template writes them, and "select": true; context { "step": "node" }). A node is visited with window/showDocument; a link goes in with workspace/applyEdit, the cursor after it. A title no node has, and org.roam.capture, go on with a capture of the node: the template's key when there is more than one (kind key), its questions (kind text), the context carrying the title, keys and answers so far; then a capture buffer as org.capture shows one, filed by org.capture.finish, which writes a new file, and for org.roam.node.insert inserts the link where the command ran.
org.roam.ref.find
org-roam-ref-find: asks for a reference (input kind text, prompt Ref, completions and select, context { "step": "ref" }) and shows its node.
org.roam.promote, org.roam.demote
org-roam-promote-entire-buffer and org-roam-demote-entire-buffer on the file at the cursor, an edit of it; or Emacs's error.
org.roam.refile
org-roam-refile: asks for a node (input kind text, prompt Node, completions and select, context { "step": "node" }), then edits both files. A file refiled whole is deleted by the same edit (a delete resource operation) when the client announces workspace.workspaceEdit.resourceOperations with delete.
org.roam.graph
org-roam-graph: draws the graph with Graphviz and shows it with window/showDocument (external true), or runs org_roam_graph_viewer on it; count limits it to the node at the cursor and those near it.
org.roam.extract
org-roam-extract-subtree: asks for the file (input kind text, prompt Extract node to: ~, its ~value the name offered, context { "step": "file" }), writes the new file itself and edits the one at the cursor.
org.roam.alias.add, org.roam.alias.remove, org.roam.tag.add, org.roam.tag.remove, org.roam.ref.add, org.roam.ref.remove :: org-roam-alias-add and the like, on the node at the cursor: they ask (input kind text; prompts Alias, Tag, Ref and Remove, the tags with completions and separator :; context { "step": "value" }) and change the file, or fail with Emacs's No node at point or No tag to remove. A roam: link followed with org.open visits its node; for a new node, the capture's questions come back to org.open with title and step in their context. With org-roam on, the server answers textDocument/willSaveWaitUntil for org-roam's files with the edits that turn their roam: links into id: links, and completion in a link ([[, [[roam:, [[id:) offers node titles, each with a textEdit from after the [[ to the cursor (to the end of the title typed), whose text ends with ]] only when the link has none yet: the ]] a closing pair typed stays, whatever the editor does with the text after the cursor. filterText is the title after the roam: or id: typed.
org.roam.buffer.toggle, org.roam.buffer.dedicated, org.roam.buffer.refresh :: org-roam-buffer-toggle, org-roam-buffer-display-dedicated and org-roam-buffer-refresh. The buffer is an Org file of the server's (org-roam-buffer.org, or org-roam-buffer-SLUG.org for a dedicated one, in the server's directory roam), shown with window/showDocument and takeFocus: false. Its sections, as org_roam_mode_sections lists them, are headings whose items link to the line they come from. The toggle reads "visible" in its context, whether the editor shows the persistent buffer (else whether the editor has it open), and then answers { "close": uri } for the editor to close it. The dedicated buffer asks for a node (input kind text, prompt Node, context { "step": "node" }), or with a count takes the node at the cursor. When the buffer's text changes and the editor has it open, the server sends the edit with workspace/applyEdit and then org-lsp/save for it, whatever auto_save says: the file is the server's.
org.roam.dailies.goto.date, org.roam.dailies.capture.date
org-roam-dailies-goto-date and org-roam-dailies-capture-date: in a client that shows the date prompt, the prompt opens and returns nothing, its minibuffer line starting with Find daily-note: or Capture to daily-note:, as org-read-date puts their prompt before its own; the day picked goes to the note or captures to it. Other clients get an input of kind date (prompt Find daily-note or Capture to daily-note, context { "step": "date", "goto" }).
org.roam.dailies.find.directory
org-roam-dailies-find-directory: the notes of org_roam_dailies_directory, an input of kind choice whose keys are their names relative to it (context { "step": "file" }); the one picked is shown with window/showDocument.
org.journal.new.entry, org.journal.new.date.entry, org.journal.new.scheduled.entry, org.journal.next.entry, org.journal.previous.entry, org.journal.open.current, org.journal.reschedule :: org-journal's org-journal-new-entry, org-journal-new-date-entry, org-journal-new-scheduled-entry, org-journal-next-entry, org-journal-previous-entry, org-journal-open-current-journal-file and org-journal-reschedule-scheduled-entry, with org_journal_enabled (see A journal (org-journal)); without it they fail with why. Next and previous need the document and position of a journal file; the others need none, and a count above 1 is Emacs's C-u. The date commands ask for a date as the date prompt does (input kind date, prompt Date), or take it as "date" in their argument. A missing org_journal_dir is asked about first (kind key, Journal directory … doesn't exists. Create it? ~, ~context { "step": "directory" }), and org-journal's own questions, such as Delete empty journal entry/file?, the same way (context { "step": "question", "answers" }, and date). The files changed are edited in the editor when open (workspace/applyEdit) and written to disk when not; the file of the entry is then shown with window/showDocument, the cursor where org-journal leaves it, and its folds come in org-lsp/folds.
org.journal.search, org.journal.search.forever, org.journal.search.future, org.journal.search.future.scheduled, org.journal.schedule.view :: org-journal-search and the like, and org-journal-schedule-view. The searches ask for the string (kind text, context { "step": "search" }); org.journal.search then for its first and last day (kind date, prompts Enter the search start and Enter the search end, context carrying search, start and step), unless with a count above 1; a client that shows the date prompt gets it for each, its prompt line starting with those words, and the prompt stays open from the first to the second. The results and the schedule are Org files of the server's (org-journal-search.org, org-journal-schedule.org), shown with window/showDocument; each result's date is a file:…::LINE link to the line found. When the journal is on, the date prompt's calendar marks the days with an entry with the token calendarJournal, future for those after today. While org-roam is on, it also marks the days with a daily note (a date in the name of a file under org_roam_dailies_directory) with the token calendarDailies, a journal's day keeping its own.
org.journal.read.entry, org.journal.display.entry, org.journal.mark.entries, org.journal.search.calendar.week, org.journal.search.calendar.month, org.journal.search.calendar.year :: The keys org-journal adds to the calendar (org-journal-read-entry, org-journal-display-entry, org-journal-mark-entries, org-journal-search-calendar-week …), keys in the calendar scope with org.journal.next.entry, org.journal.previous.entry, org.journal.new.date.entry, org.journal.search.forever and org.journal.search.future. Run from the date prompt's document (its URI, or for a client that reads it from its file, that file's) they act on the day under the cursor: the entry shown with window/showDocument and orgOtherWindow, takeFocus: false for display and for follow mode; the selected day moved by next and previous; the days marked again. Elsewhere, read and display fail with Not on a date!, and the searches of the calendar with org-journal's message once the string is asked for. A search's question carries the day in its context (day, YYYY-MM-DD).
org.refile
org-refile (org-agenda-refile on an agenda line): offers the targets (an input of kind choice), named as Emacs names them (Projects, Home (other.org), Projects/Alpha/), and moves the subtree under the one picked, as its last child, promoted or demoted to fit, into another file if need be (one workspace/applyEdit over both). With org_log_refile (or #+STARTUP: logrefile) the refiled entry gets Refiled on [2026-05-18 Mon 10:30]; with note, a note buffer is shown for it once it is refiled. With org_refile_allow_creating_parent_nodes, an answer that names a target and a new child of it (Projects/New) makes the child (org-refile-new-child) and refiles there; with confirm, Create new node "New"? ~ is asked first, an input of kind ~key whose context carries the target back in answers. An answer of that form when nothing is made refiles nothing, as in Emacs.
org.refile.copy, org.refile.goto, org.refile.goto.last
org-refile-copy (C-c M-w): as org.refile, the entry kept where it was too (Copy subtree "…" to, Copy to "…" in file …: done). org-refile with C-u: the targets offered (Goto), and the cursor goes to the one picked (window/showDocument), nothing moved; with C-u C-u (org.refile.goto.last), to the entry the last refile or copy put somewhere.
org.archive.subtree
org-archive-subtree (org-agenda-archive on an agenda line): moves the subtree to its archive location: the ARCHIVE property of the entry or a parent, #+PROPERTY: ARCHIVE, the first #+ARCHIVE: line, or org_archive_location. Under the location's headline (made when missing, datetree/ for year, month and day headlines by the entry's CLOSED: date or today), or at the end of the file; with the properties org_archive_save_context_info names, inherited tags as org_archive_subtree_add_inherited_tags says, done as org_archive_mark_done says, and the parent's statistics cookies recounted. A new archive file starts with org_archive_file_header_format. An archive file no editor has open is written by the server, as Emacs saves it; one that is open gets an edit.
org.archive.sibling
org-archive-to-archive-sibling: moves the subtree under its sibling org_archive_sibling_heading tagged :ARCHIVE:, made at the end of the parent's subtree when there is none, with an ARCHIVE_TIME property; the parent's TODO statistics are recounted.
org.archive.tag
org-toggle-archive-tag: sets or removes the ARCHIVE tag of the headline. Archived subtrees are left out of the agenda.
org.archive.default, org.archive.confirm
org-archive-subtree-default: one of the three, as org_archive_default_command says; org.archive.confirm (a in the agenda) asks first (input kind key, y or n).
org.archive.done, org.archive.tag.done
org-archive-subtree and org-toggle-archive-tag with C-u: each subtree without open TODO items (the children of the headline at the cursor, or the top-level ones before the first headline) is archived or tagged when the answer to its question is yes. One question at a time, input kind key (y or n), with the answers so far in the input's context (answers, a string of y and n).
org.priority
Asks for a priority (Priority A-C, SPC to remove, an input of kind priority) and sets it, or removes it for a space; in an Org file or on an agenda line.
org.table.recalculate, org.table.recalculate.line, org.table.iterate
org-table-recalculate (C-u C-c *, C-c *) and org-table-iterate (C-u C-u C-c *): apply the formulas of the #+TBLFM: line under the table at the cursor, to every line, to the cursor's line (with every field formula), or again until the table no longer changes (at most ten times; the result's message says how many it took). On a #+TBLFM: line, that line's formulas apply to every line, as C-c C-c there applies them (org.checkbox.toggle does that there too). Formulas are read as Org reads them and evaluated as Calc evaluates them, results written as Calc writes them; a table with Emacs Lisp formulas, remote references, units, ;F, ;S or ;e is recalculated by Org in Emacs instead (org-table-recalculate, org-table-iterate, org-table-calc-current-TBLFM; see emacs), the cursor left where Emacs leaves its point. org.table.recalculate is also a code action in a table whose formulas would change it.
org.timestamp.up, org.timestamp.down
Changes the part of the timestamp the cursor is on. Org files only.
org.date.later, org.date.earlier
Moves a date by days: in an Org file the timestamp at the cursor, on an agenda line the date the line is listed for. Right after one of the commands below, on an agenda line, by the unit that one moved by (Emacs's S-<right> after C-u S-<right>).
org.date.later.hours, org.date.earlier.hours, org.date.later.minutes, org.date.earlier.minutes :: org-agenda-date-later-hours and its siblings (Emacs's C-u S-<right>, C-u C-u S-<right>): on an agenda line, move its timestamp by hours, or by org_time_stamp_rounding_minutes; a count is how many. A date without a time stands for its midnight: an hour later it is the same day, an hour earlier the day before.
org.shift.up, .down, .left, .right
Org's shifted cursor keys in an Org file: on a timestamp they change it, on a headline they change its priority (up, down) or TODO state (left, right). On a list item, left and right cycle the bullets of its list (org-cycle-list-bullet: -, +, * when indented, 1., 1), no numbers for a description list), up and down go to the previous or next item (org-previous-item, org-next-item; with org_list_use_circular_motion from the last to the first and back, and M-<up> and M-<down> then send the first item to the end and the last to the start, in a list without blank lines between its items as Org does); on a property line, left and right go to the previous or next of its allowed values (org-property-next-allowed-value: those of NAME_ALL, or [ ] and [X]); these return { "edits", "cursor" }. In a table, off a timestamp, they move the field up, down, left or right (org-table-move-cell-up and the rest), run by Emacs (see "Emacs" below).
org.property.set
org-set-property (C-c C-x p; org-agenda-set-property on an agenda line): asks for the name (kind text, completing the file's property names and those Org uses, the one on the cursor's property line or the one set last by default), then the value: one of its allowed values (kind choice), which NAME_ALL gives (inherited, from #+PROPERTY: lines and org_global_properties too; :ETC allows others, kind text then), or else any (kind text, completing the values the file has, the entry's own by default). The steps come back with step in the context (name, then value with the name in answers). The value goes in the entry's property drawer, made when there is none (before the first headline, the file's), aligned as org-indent-line aligns it; TODO and PRIORITY change the keyword and the priority instead. SCHEDULED, DEADLINE and Org's other special properties are refused.
org.property.delete, org.property.delete.globally
org-delete-property, which asks which of the entry's properties (kind choice), and org-delete-property-globally, which asks for a name (kind text) and takes it out of every entry of the file; a drawer left empty goes too.
org.effort.set, org.effort.increase
org-set-effort (C-c C-x e; e in the agenda): one of Effort_ALL (kind choice) or any duration Org reads (1:30, 2h, 1d 3:00); org-inc-effort (C-c C-x E): the allowed value after the entry's.
org.ordered.toggle
org-toggle-ordered-property (C-c C-x o): sets ORDERED to t, or takes it out.
org.cite.insert, org.cite.insert.prefix
org-cite-insert (C-c C-x @) with Org's basic processor, and with the prefix argument (C-u C-c C-x @). Elsewhere than on a citation: keys one at a time (kind choice, step keys, the keys picked so far in answers separated by ;, each choice labelled with its line of Org's completion table, and (done) once one is picked), then with the prefix argument a style (step new-style; (default) or one of oc-basic's styles); the citation goes in at the cursor with the keys last picked first, as Org puts them, and the cursor after it. On a citation's style, another style (step style); on its global prefix or suffix, a key (step key) before the first reference or after the last; on a reference, a key before it (at its prefix or the @), after it (at its suffix), or in place of its key. With the prefix argument on a citation, it goes with the blanks around it as org-cite-delete-citation takes them, or on a reference that reference. Refused where Org allows no citation (Cannot insert a citation here: a keyword line, a block other than a verse block, a drawer's lines, a link, a timestamp, a headline's stars or tags, …) and without a bibliography (No bibliography set).
org.bibtex.export, org.bibtex.copy
org-bibtex and org-bibtex-export-to-kill-ring: the BibTeX entry of each headline with a type (org_bibtex_type_property_name) written to the file asked for (input kind text, prompt BibTeX file, the Org file's name with .bib as value, relative to its directory), with Emacs's Successfully exported N BibTeX entries to FILE; or the entry at the cursor in copy, for the editor's clipboard.
org.bibtex.create, org.bibtex.create.here, org.bibtex.check, org.bibtex.check.all :: org-bibtex-create (a new heading at the cursor), org-bibtex-create-in-current-entry, org-bibtex-check and org-bibtex-check-all: their questions one at a time, as Emacs asks them (input kind text): the type (prompt Type, completed from Org's types, "select": true), the title, each field the type requires and the entry lacks (prompt the field's name; an empty answer leaves it out), one of two fields where either will do (prompt Field), the key (prompt id); with a count (Emacs's prefix argument) the optional fields too. The answers so far come back in the input's context (replies, a list). With org_bibtex_autogen_keys the key is not asked for: Emacs's bibtex-generate-autokey makes it, through Emacs. Emacs's errors are the refusals (Type::paper is not known).
org.bibtex.yank
org-bibtex-yank ("clipboard": true): the last BibTeX entry of the clipboard as a heading at the cursor, its fields as properties; with a count, added to the entry at the cursor.
org.bibtex.import
org-bibtex-import-from-file: the entries of the BibTeX file asked for (input kind text, prompt File) as headings after the cursor, with Parsed N entries.
org.heading.next, org.heading.previous, org.heading.forward, org.heading.backward, org.heading.up, org.link.next, org.link.previous :: Org's motion commands: org-next-visible-heading (C-c C-n), org-previous-visible-heading (C-c C-p), org-forward-heading-same-level (C-c C-f), org-backward-heading-same-level (C-c C-b), outline-up-heading (C-c C-u), org-next-link (C-c C-x C-n), org-previous-link (C-c C-x C-p). The count repeats them (backwards when negative; the link search takes none). Headings are found as Org finds them, by ^\*+ ~ (a line of stars in a block counts); everything is taken to be visible. The result carries the cursor as ~org.return's does ({ "edits": [], "cursor" }) and Org's message (No further link found); a link search that found nothing makes the same command right after start from the other end of the file (Link search wrapped back to beginning of buffer). org.heading.up on a top heading fails with Already at top level of the outline.
org.beginning.of.line, org.end.of.line, org.kill.line
org-beginning-of-line (C-a), org-end-of-line (C-e) and org-kill-line (C-k), as org_special_ctrl_a_e and org_special_ctrl_k make them; with those false they are notApplicable, so that the keys keep the editor's meaning. C-a goes to the start of a headline's title (after the stars, TODO keyword and priority) or after an item's bullet and check-box, C-e to the end of a headline's title before its tags, the same key again to the line's own start or end; with reversed the other way round. C-k on a headline kills to the tags, or the tags from the cursor, and aligns them again (org_auto_align_tags); at the start of the line, and off headlines, it kills as kill-line does (the newline too when only blanks follow; End of buffer at the end). The count moves that many lines first, as Emacs's does. The same command again from where the last one left the cursor is a repeat (Emacs's last-command): reversed goes on to the special place, and a kill adds to the one before. The motions carry the cursor ({ "edits": [], "cursor" }); org.kill.line carries its edit and the kill in copy, with "copyCharacters": true for an editor whose registers are by lines or by characters (Neovim, Vim). On a line a closed fold of folded starts on (the command has "folds": true), where org_special_ctrl_k does not kill only to the tags, C-k kills to the end of the fold's last line, what the fold hides with it, as kill-line kills to the end of the visible line, whatever org_special_ctrl_k is; with org_ctrl_k_protect_subtree true it asks first (input kind key, Kill hidden subtree along with headline? /, the answer in input), and with "error", or the answer no, it fails with /‘C-k’ aborted as it would kill a hidden subtree.
org.goto
org-goto (C-c C-j) with its outline-path-completion interface: kind choice, prompt Goto, the file's headings to org_goto_max_level by their outline path (A/B/, as org-refile names them); the answer moves the cursor to the heading ({ "edits": [], "cursor" }).
org.footnote.action, org.footnote.menu, org.toggle.item, org.toggle.heading, org.toggle.comment, org.emphasize, org.structure.template, org.drawer.insert, org.subtree.clone :: Run by Emacs itself (see "Emacs" below), on the document as the editor has it, at its cursor: org-footnote-action (C-c C-x f: a new footnote, or between a reference and its definition; on a reference without one Emacs asks whether to make it, as window/showMessageRequest), its menu (C-u C-c C-x f: kind key, s sort, r renumber fn:N, S both, n normalize, d delete), org-toggle-item and org-toggle-heading (also C-c -, org.table.hline, and C-c *, org.table.recalculate.line and org.table.recalculate, off a table), org-toggle-comment (C-c ;), org-emphasize (C-c C-x C-f: kind key, the marker), org-insert-structure-template (C-c C-,: kind key, the keys of Emacs's org-structure-template-alist), org-insert-drawer (C-c C-x d: kind text, the file's drawer names as completions), org-clone-subtree-with-time-shift (C-c C-x c: kind text, how many, then with step shift the shift per clone, +1w or empty). The command returns at once; when Emacs is done, what it changed comes as workspace/applyEdit and the cursor goes where Emacs leaves the point (window/showDocument), unless the document changed meanwhile.
org.table.copy.down, org.table.sum, org.table.field.info, org.table.create, org.babel.next, org.babel.previous, org.babel.goto, org.block.next, org.block.previous :: Run by Emacs itself, as the row above: org-table-copy-down (S-RET, the count as its argument; off a table notApplicable, so that the key keeps its own meaning), org-table-sum (C-c +: the sum in the message, as Emacs says it), org-table-field-info (C-c ?: the field's references in the message), org-table-create (C-c |: kind text, the size as 3x2, empty for org-table-default-size), org-babel-next-src-block and org-babel-previous-src-block (C-c C-v n, C-c C-v p), org-babel-goto-named-src-block (C-c C-v g: kind choice, the names of the file's code blocks), org-next-block and org-previous-block (C-c M-f, C-c M-b); the motions take the count.
org.timer.start, org.timer.insert, org.timer.item, org.timer.pause, org.timer.stop, org.timer.set :: Org's timers, kept by the server's Emacs (they last as long as it does): org-timer-start (C-c C-x 0; with a count of 4, C-u, it asks Restart timer with offset [h:mm:ss], the value at the cursor by default; with 16, C-u C-u, or on a selection, org-timer-change-times-in-region shifts the values in it by the difference asked for, the first to zero by default), org-timer (C-c C-x .: the value, started first if need be), org-timer-item (C-c C-x -), org-timer-pause-or-continue (C-c C-x ,), org-timer-stop (C-c C-x _), org-timer-set-timer (C-c C-x ;: kind text, minutes or h:mm:ss, offered org-timer-default-timer; on an entry with an effort Org takes it and nothing is asked). What Org says comes as window/showMessage. Emacs in batch runs no timers, so the server ends the countdown when it is over and shows what Org says then (Heading: time out).
org.export.dispatch
org-export-dispatch (C-c C-e), run by Emacs itself (the emacs option; see "Emacs" below). Without an answer, a key input (prompt Export command) whose choices are the options as Org's dispatcher shows them (\u0002 C-b Body only: Off, \u0013 C-s Export scope: Buffer, \u0006 C-f Force publishing: Off: each answer turns one on or off and asks again), then the first keys of the menus of the backends Emacs has (h Export to HTML, l, t, o, c, and those of backends the configuration loads), P Publish and q Exit. The context carries the options on as letters in answers (b, s, f) and the menu in step (empty for the first). A backend's key asks for one of its entries (step its key, prompt its label, q back to the first menu); P for f, p, x (then a project of org-publish-project-alist, kind choice, step P:x) or a. The entry then runs in Emacs on the document as the editor has it, the point where the cursor is, and the command returns at once (As HTML file…). Emacs is told first where the entries of the document's id: links are, as the server finds them (org-id-add-location), and, with org-roam, of its roam link type: links the server follows export as Emacs with org-roam exports them, not as links it cannot resolve. When Emacs is done: an export to a buffer is written to a file of the server's (Org HTML Export.html) and shown with window/showDocument; a file to be opened is shown in the editor when it is text (.org, .txt, .md, .tex, …), else by the system (external); any other file is announced (Exported to /path/notes.html); an error is shown with window/showMessage. A yes-or-no question Emacs asks meanwhile (Evaluate this emacs-lisp code block on your system?) comes as window/showMessageRequest with Yes and No. # asks for an options category (input kind choice: default and the backends Emacs has; step #) and inserts its template at the cursor (org-export-insert-default-template, for the subtree with C-s).
org.babel.execute, org.babel.execute.buffer, org.babel.execute.subtree, org.babel.remove_result :: Babel, run by Emacs itself (see "Emacs" below): org-babel-execute-maybe (C-c C-v e: the code block, #+CALL: line, inline block or call at the cursor), org-babel-execute-buffer (C-c C-v b), org-babel-execute-subtree (C-c C-v s), org-babel-remove-result-one-or-many (C-c C-v k). C-c C-c (org.checkbox.toggle) does as org-ctrl-c-ctrl-c does on a code block, a #+CALL: line, src_…{} or call_…(): Emacs runs org-ctrl-c-ctrl-c there. The command returns at once; when Emacs is done, what it changed in the document comes as workspace/applyEdit (the file stays unsaved, as Emacs leaves it), unless the document changed meanwhile (The file changed while Emacs ran the code; nothing was changed. Run it again.). Emacs asks before it evaluates (org-confirm-babel-evaluate) with window/showMessageRequest; the languages are those org-babel-load-languages loads (set in emacs_options). Sessions (:session) live as long as the server's Emacs. org.babel.lob.ingest (C-c C-v i) adds the file's named code blocks to the Library of Babel of the server's Emacs (org-babel-lob-ingest), for #+CALL: lines in any file while it runs.
org.checkbox.toggle
C-c C-c in a property drawer is org-property-action: asks for s (set), d (delete), D (delete globally) or c (compute, refused: org-lsp has no column view), as kind key with step action, then goes on as those commands. C-c C-c on a list item (org-ctrl-c-ctrl-c): toggles its checkbox if it has one, and puts the list right: indentation, bullets, numbers, the boxes of parents (ORDERED entries unchecking what follows an unchecked box). At the start of a list's first line only that item's box is toggled; on a statistics cookie the cookies are counted again. On a headline, org-toggle-checkbox: the boxes of the items below it. On a #+TBLFM: line, org.table.recalculate; in a table, org-table-align (at the very start of the table, where Emacs finds the table itself, org.table.recalculate). The cookies that count checkboxes follow.
org.schedule, org.deadline
Asks for a date and sets the entry's SCHEDULED: or DEADLINE:, in an Org file or on an agenda line (org-agenda-schedule, org-agenda-deadline). Changing a date the entry had is logged as org_log_reschedule and org_log_redeadline say (and the file's #+STARTUP: words): Rescheduled from "[2026-05-20 Wed]" on [2026-05-18 Mon 10:30] with time; with note, a note buffer is shown once the date is changed, as for a TODO state's note (an editor without one logs the time).
org.schedule.remove, org.deadline.remove
org-schedule and org-deadline with C-u: the entry's SCHEDULED: or DEADLINE: dates taken out (org-remove-timestamp-with-keyword), on an agenda line its entry's. Entry was not scheduled when it was not. With org_log_reschedule or org_log_redeadline the removal is logged (Not scheduled, was "[…]" on […]).
org.schedule.delay, org.deadline.warning
org-schedule and org-deadline with C-u C-u: ask for a day (Delay until, Warn starting from; input kind date, starting from the date) and set the delay or warning period from the date to it (SCHEDULED: <2026-05-20 Wed -3d>), in the headline and the line after it. No scheduled information to update when there is no such date.
org.timestamp.insert, org.timestamp.insert.inactive
Asks for a date and inserts a timestamp at the cursor, or changes the one there. Org files only.
org.timestamp.overlays.toggle
org-toggle-timestamp-overlays (C-c C-x C-t): the file's timestamps shown in org_timestamp_custom_formats, or not, the other way from org_display_custom_times and #+STARTUP: customtime. What shows is sent as entities are (org-lsp/display, else hidden text and inlay hints); Org's message (Time stamps are overlaid with custom format, Time stamp overlays removed).
org.date.preview
Not for users: what an answer to a date prompt means; see below. Not in the manifest.
org.emacs.answer
Not for users: the answer to a question of Emacs's (a yes-or-no question of a command run in Emacs), for a client that does not show it with window/showMessageRequest (message_requests off). Run with no argument, it gives the question as a command's input, a key of y or n; run with { "input": "y" } (or "n"), it answers it. Not in the manifest.
org.cycle
Not for users: what an editor's own TAB in an Org file does before it folds (org-cycle). Not in the manifest. On a new, empty headline (the cursor at its end, with stars and perhaps a TODO keyword) its level changes as org-cycle-level changes it: a child of the headline before, then each level up, then a sibling again; on an empty item, its indentation as org-cycle-item-indentation changes it, the same command again from where the last one left the cursor going on with that item's cycle (Cannot move item where it cannot). The edit is carried in the result as org.return's is. Both need org_cycle_level_after_item_entry_creation. At the start of the file, with org_cycle_global_at_bob and no headline there: { "global": true }, for the editor to cycle the whole file. Else { "integrateLists" }: the editor cycles its folds, and when a headline's children show, folds its list items too only when this is true (org_cycle_include_plain_lists integrate).
org.calendar.day.later, .day.earlier, .week.later, .week.earlier, .month.later, .month.earlier, .year.later, .year.earlier :: In the date prompt: move the selected day.
org.calendar.scroll.later, org.calendar.scroll.earlier
In the date prompt: show the next or previous months.
org.calendar.today, org.calendar.select, org.calendar.type, org.calendar.time, org.calendar.cancel :: In the date prompt: go to today; take the day at the cursor; type the answer; pick a time, or go back to the day; give up. See The date prompt document.
org.goto.calendar
org-goto-calendar: the date prompt's document with no date asked for, the calendar alone without its minibuffer lines, on the day of the timestamp at the cursor (active or not) or of the line's last active one, or today (with a count above 1, today). Its keys move it and org.calendar.cancel closes it; those that answer a prompt fail. A client without the date prompt is told it has no calendar.

How they work#

TODO state changes do what Org's org-todo does. The cycle runs through "no keyword" between the last and first states. The tags of the headline return to their column, and statistics cookies ([1/3], [33%]) in the parent headline are recounted. CLOSED: and state notes are written as org_log_done and the keywords ask; where Org would prompt for the text of a note, the note is written without text. An entry with a repeater that is marked done moves to its next date and is open again, with LAST_REPEAT and a state note recorded.

The entry is the innermost headline whose subtree contains the cursor, so the cursor may be anywhere in the entry's body.

Priorities change as org-priority-up and org-priority-down do them, within the file's priorities. Past the highest or lowest the cookie is removed; the same key pressed again goes on from the other end. "Pressed again" means the same command on the same entry with no other command in between; the server cannot see the cursor move, as Emacs can.

Timestamps change as org-timestamp-up and org-timestamp-down do them (S-<up>, S-<down> in Emacs): the year, month, day, hour or minute the cursor is on, the end of a time range together with its start, a repeater or warning period, or, on a bracket, active against inactive. Minutes move in steps of org_time_stamp_rounding_minutes unless a count is given. On a CLOCK: line the duration is recomputed. In a file, org.date.later and org.date.earlier are org-timestamp-up-day and org-timestamp-down-day. On an agenda line they are org-agenda-date-later and org-agenda-date-earlier: the first step forward takes a date that has passed to today, and a date range moves as a whole.

Commands that ask for something. In the manifest such a command has "input": { "kind", "prompt" }. Run without an answer, it changes nothing and returns what to ask:

{ "input": { "kind": "date", "prompt": "Schedule", "value": "10:00" } }

value is the text the prompt starts with, as Emacs fills it in: the time of the date being changed (10:00+1:30 for a range), or nothing. The editor asks with its own input box and runs the command again with the answer as input in the argument:

{ "textDocument": { "uri": "…" }, "position": { … }, "input": "fri 10:00" }

A client that does nothing with a command's result (message_prompts, on for a client without org-lsp's editor code) is asked by the server itself. A choice comes as window/showMessageRequest, a button a choice, and the one picked runs the command again. A client that shows no message requests (message_requests off: Helix) is told PROMPT: pick the answer from the code actions (with window/showMessage) instead: until a command runs, the code actions start with the choices, of kind org.answer, titled as the buttons would be (Agenda for the current week or day [a]), each running the command again with its key; a rename whose new name is a choice's key answers too. LSP has no request for text, so for text and dates the server says PROMPT: answer with a rename at the cursor (with window/showMessage) and the next rename answers: textDocument/prepareRename offers value as the placeholder, and the new name of textDocument/rename is the answer, the rename itself an empty edit. A new name of - alone is the empty answer (the prompt's default), for a client that sends no empty new name (Zed). Another command first drops the question, and rename renames again.

An input may say more:

  • "choices": [{ "key": "t", "label": "TODO" }, …] with kind key: the answer is one key, as Emacs reads it at its fast selection prompts. The prompt is a title (Select a TODO state); the editor shows the choices, as Emacs shows them in a window of their own. It can list them and read a single key press (Neovim) or offer them as a list (VS Code). A space is shown as SPC. A TODO keyword comes with its look, to be shown in it as org-fast-todo-selection shows it: "highlight", the selector of its token (todoKeyword, todoKeyword.done), and "face" when org_todo_keyword_faces gives it one, as in org-lsp/faces.
  • "completions": ["Owner", …] with kind text: what may be typed, offered as it is typed (Emacs's completing-read); anything else may be typed too. An empty answer stands for the default the prompt shows in brackets (Property [Owner]); with "select": true there is none, and a completion picked with nothing typed is the answer, as completion frameworks take it.
  • "complete": "file" or "directory" with kind text: the answer is a file's or a directory's name, which the editor completes as it is typed (Emacs's read-file-name, read-directory-name); "value" then starts with the directory of the Org file, as the minibuffer starts with default-directory. An editor without file name completion asks as for any text.
  • "context": { … }: fields to send back with the answer. A TODO state change that records a note (@, or org-log-done set to note) is not made until the note's text comes: it asks with kind note (Note for state change from "TODO" to "WAIT") and "context": { "state": "WAIT" }, and the answer then sets that state and writes the note under the heading line, as org-store-log-note does. A client that announces experimental.orgDatePrompt (one of this project's integrations) gets a note buffer instead, as Emacs's *Org Note*: a file named like a capture buffer (CAPTURE-Note.org), shown with window/showDocument, which starts with # Insert note for state change from "TODO" to "WAIT". and has the cursor on its third line. org.capture.finish there makes the change with the text below the comment lines as the note, and org.capture.abort makes it without any (Emacs's C-c C-k); both return { "close": uri }.

An answer may lead to another question; the editor asks again until the command asks for nothing more.

A date answer is read as Org's date prompt reads it (org-read-date): +2d, fri, 2/15, feb 15 3pm, w12, 10:00-11:30, ++1w, and so on, against the date being changed or else today. While it is typed, an editor can show what it means with org.date.preview, whose argument is the same plus "command", the command being answered; it returns { "timestamp": "<2026-05-22 Fri 10:00>" }, or fails while the answer means nothing.

Scheduling works as org-schedule and org-deadline do: the timestamp goes on the planning line under the headline, which is made when there is none; a CLOSED: timestamp is taken out; the repeater of the old date stays. Timestamps work as org-timestamp does: on a timestamp the command changes it (keeping its repeater), elsewhere it inserts one (org.timestamp.change only changes one, active or inactive as it is, and refuses elsewhere); right after inserting one, the same command adds the end of a date range (<…>--<…>). After a timestamp is inserted, the server moves the cursor after it with window/showDocument, as Emacs leaves it.

Code actions. The commands that apply at the cursor are also offered as code actions, with the command name as the action's kind. In an Org file the actions carry their edit (versioned when the client supports documentChanges), except clocking (org.clock.in, org.clock.out, org.clock.cancel), which may change another file too and carries its command; in the agenda they carry the command to run. A client can therefore also bind a key by requesting code actions with context.only set to a kind, which matches hierarchically: org selects every action.

Edits to files that are not open. A command run from the agenda edits the entry's file with workspace/applyEdit. Editors apply such an edit to a buffer and leave saving to the user, as Emacs does (unless auto_save). The agenda follows the edit at once and again when the file is saved.

Reporting edits at once. The server builds on the text it was last told about. A key held down sends the next command before an editor that batches its didChange notifications (Neovim waits 150 ms) has reported the previous edit, and that press is lost. An integration should send the change as soon as it has applied a workspace/applyEdit.

org-protocol#

org-lsp protocol URL is what the system runs for an org-protocol:// URL (org-protocol.org). Every server listens for such URLs from the start, for any client, in protocol/ of the state directory ($XDG_STATE_HOME/org-lsp, ~/.local/state/org-lsp, %LOCALAPPDATA%\org-lsp on Windows; the directory only its owner may enter):

PID-ID.json
{ "pid", "socket" }: the Unix socket it listens on (mode 0600); on Windows { "pid", "address", "token" }, a loopback port and the token it asks for. Written again, at most every three seconds, when the client sends anything: the subcommand tries the entry written last first, and removes one whose server does not answer. Removed when the server stops.
pending-TIME-PID.json
{ "url", "time" }: a URL left by the subcommand for the server of the editor it started (org_protocol_editor). A server takes those of the last two minutes a second after it starts, renaming each first so that one server alone takes it, and removes the others.
stored-links.jsonl
a line ["URL", "TITLE" or null] for each link stored while no server ran; the next server to start takes them all among its stored links.

The subcommand writes one line of JSON, { "url" } (with "token" on Windows), and the server answers with one: { "message" }, what Org said, which the subcommand prints, or { "error" }, which makes it fail. Only URLs of the org-protocol: scheme are taken, of at most 256 KiB, sent within two seconds.

Emacs#

What only Org itself can do, the server has Emacs do: export (org.export.dispatch), Babel's evaluation (org.babel.execute and its relatives, C-c C-c on code), footnotes (org.footnote.action) and a few editing commands (C-c - and C-c * off a table, C-c ;, emphasis, structure templates, drawers, cloning subtrees, copying down, summing and creating tables, moving between blocks, timers, the %(sexp) of capture templates). It also does what org-lsp's own code leaves to Org: tables whose formulas are Emacs Lisp, remote references or Calc's units, fractions, symbolic mode and engineering notation (org.table.recalculate and its relatives), and tangling a file whose header arguments are Emacs Lisp or whose Noweb references call a block (org.babel.tangle). Emacs is optional; without it those commands fail with Cannot start Emacs (…) and nothing else changes.

The %(…) of org_agenda_prefix_format are Emacs's too. A view is built at once with what Emacs last made of them (empty the first time), and the forms on its lines go to Emacs in one request in the background, each run as org-agenda-format-item runs it: in the entry's file as the editor has it, point at the start of the headline (Org leaves it where its search stopped, on that line or its timestamp), with category, extra, time, level, tag, effort and breadcrumbs bound to the line's; a line of the time grid is in no Org buffer. Once Emacs answers, the view is built again with what they gave, and the editor told that it changed. A form that signals an error stops Org's agenda; here the agenda shows, the field empty, and the error is said once. Without Emacs the fields are empty, and org-lsp agenda in a terminal leaves them so.

The server starts one emacs --batch -Q the first time it is needed and keeps it running, so that Org loads once (a second or so) and each request costs only its own work. It talks to it over standard input and output with the Lisp in server/org-lsp/src/bridge.el, from a thread of its own: an export never holds up the server's other answers. Emacs loads, in this order, emacs_config_file, then evaluates emacs_config, then loads Org (org, ox, ox-publish): settings made before Org loads are kept (org-export-backends to add Markdown, a load-path for another Org), and the configuration may load Org itself. A command the editor asks for (workspace/executeCommand) that needs an answer of Emacs's (the export menu, a capture template's %(…) and a target function, the block org-edit-special edits, the attachments to pick, refile targets a function verifies, the countdown's default, the named blocks, the structure templates, org-agenda-to-appt, a heading made of a region) holds up no other answer: the request is answered once Emacs has answered, the server answering the others meanwhile (responses may come in another order than their requests), and Emacs may ask the user its questions. It runs again from the start then, Emacs's answer at hand; a command asks Emacs nothing before it has taken a step of its own. $/cancelRequest gives up such a request (answered RequestCancelled), and stops Emacs if it works on it (a %(…) that loops), with the programs it started; the next request starts Emacs again. The rest waits for Emacs and holds up the server's other answers meanwhile: what is not a command (a diary sexp and an agenda prefix's %(…) while the agenda is built, the attachment of an image to preview, org-crypt before a save, a link abbreviation that calls a function), a command from the command port, and what the timers run (appt-check, the end of a countdown). Each request has a time of its own (10 to 120 seconds), past which Emacs is taken for stuck and started again (Emacs did not answer in time: `eval` took over 30 s …); the time Emacs takes to start is not counted in it. One that holds up the server waits for Emacs to start 15 seconds at most (Emacs is still starting …, and Emacs goes on starting for the next request), and for another command (an export) 3 seconds (Emacs is busy with another command …). When the server exits, it stops its Emacs, busy or not, with the programs Emacs started. Then each option of emacs_options is set when the library it is in loads (org-attach-method when org-attach does), as Customize sets it, its :set function and all, and so after the user's Lisp; the value is read as JSON, made what the option's custom-type wants (a string a symbol, a table an association list…) and checked against that type. A value it does not match is left out, and the editor told with window/showMessage (a warning, as for the options the server cannot read), once in a session though Emacs starts again. A request carries the document's text as the editor has it, unsaved changes and all, in a buffer that visits the file's path (so that #+INCLUDE:, #+SETUPFILE: and the output's name work as they would in Emacs), with the file's safe local variables. org-agenda-files is the server's agenda files.

Emacs must not read the terminal: a yes-or-no question it asks comes to the editor as window/showMessageRequest; any other question it would ask fails the command with Emacs asked a question org-lsp cannot answer: …. A download Org does not consider safe (org-attach-url, a remote #+INCLUDE:) is such a question, yes downloading it this once; the settings org_resource_download_policy and org_safe_remote_resources are Emacs's too. What Emacs says last (message) is shown after the command's edit, as the echo area shows it, and what Babel shows of a block that fails (*Org-Babel Error Output*: its standard error and exit code) as a warning. When Emacs stops (an error in the configuration), the command fails with what it last wrote on its standard error, or its exit status, and the next one starts it again.

The manifest#

What an editor integration has to know beyond LSP's own fields, the server announces itself, so that integrations carry no tables about Org. The manifest is capabilities.experimental.org in the initialize result, and org-lsp manifest prints it for integrations that are generated ahead of time.

{
  "commands": [
    {
      "command": "org.todo.next",
      "title": "Cycle TODO state forward",
      "edits": true,
      "keys": [
        { "key": "C-c C-t", "in": "org", "preset": "emacs" },
        { "key": "cit", "in": "org", "preset": "vim" },
        { "key": "t", "in": "agenda", "preset": "vim" }
      ]
    },
    {
      "command": "org.paste.subtree",
      "title": "Paste the subtree",
      "edits": true,
      "keys": [{ "key": "C-c C-x C-y", "in": "org", "preset": "emacs" }],
      "clipboard": true
    },
    {
      "command": "org.export.dispatch",
      "title": "Export the file through Emacs",
      "edits": false,
      "keys": [{ "key": "C-c C-e", "in": "org", "preset": "emacs" }],
      "input": { "kind": "key", "prompt": "Export command" },
      "folds": true
    }
  ],
  "agenda": {
    "scheme": "org-agenda",
    "uri": "org-agenda:/Org%20Agenda",
    "fileName": "Agenda.org-agenda",
    "languageId": "org-agenda"
  },
  "datePrompt": {
    "scheme": "org-agenda",
    "uri": "org-agenda:/Org%20Date",
    "fileName": "Date.org-date",
    "languageId": "org-date"
  },
  "capture": { "prefix": "CAPTURE-" },
  "roamBuffer": { "prefix": "org-roam-buffer" },
  "tokenTypes": [{ "id": "headline", "description": "The title text of a headline", "standard": false }],
  "tokenModifiers": [{ "id": "level1", "description": "Headline level 1" }],
  "highlights": [
    { "token": "headline.level1", "vim": ["@org.headline.level1", "Title"], "textmate": ["markup.heading.1.org"] }
  ]
}
commands
Every command with its title and default keys. edits marks commands that change an Org file, for editors that can repeat the last change. A key applies in Org files (org), the agenda (agenda) or everywhere (global). There are two presets: emacs has Org's own keys in Emacs notation (C-c C-t, RET, v d), vim has nvim-orgmode's defaults in Vim notation (cit, <CR>, vd). A key marked "native": true keeps its own meaning where the command does not apply, such as <C-a> or S-<up>; see notApplicable under Commands. A vim key with "mode": "insert" is typed in insert mode (<CR> of org.return); the others in normal mode. One with "mode": "append" (<Leader><CR> of org.meta.return) runs with "below": true in the context, and leaves the editor in insert mode where the command put the cursor. A command that asks for something has input (kind and prompt; see Commands). The context of a command with "clipboard": true carries the editor's clipboard, one with "region": true the selection, one with "folds": true the closed folds (clipboard, range and folded; see Commands).
agenda, datePrompt
How the agenda and date prompt documents are named; see below.
capture, roamBuffer
How the files of capture buffers and of the org-roam buffer are named: their names start with prefix.
tokenTypes, tokenModifiers
The semantic token legend with descriptions. standard types are LSP's own.
highlights
How tokens should look by default. token is a type, a type.modifier, or *.modifier for any type. vim lists highlight groups, the first defined one to be used: the group nvim-orgmode colorschemes define, then a standard group. textmate lists scopes for editors whose themes match scopes, most specific first. A look that is a background in Org has background, { "light", "dark" }: the colors of Org's face on a light and a dark background (#rrggbb), for an editor whose theme has none of its groups, or that takes no groups (Zed): the line of the entry the clock runs on (org-agenda-clocking); the days of a habit's graph (org-habit-clear-face … org-habit-overdue-future-face) have no other. Only such a look can be a type with several modifiers (agendaHabit.ready.future), for the tokens that have all of them, over the looks of each modifier alone.

The agenda document#

The agenda is one document that the server owns, as it is one buffer in Emacs: a new view replaces the old one. Its language identifier is org-agenda. The server remembers which entry each line stands for, so semantic tokens, go-to-definition, code actions and commands work on it like on any document.

A client that announces workspace.textDocumentContent (LSP 3.18) is shown org-agenda:/Org%20Agenda and fetches its text with workspace/textDocumentContent. Other clients are shown a file, Agenda.org-agenda in a temporary directory, which the server rewrites and removes when it stops. A client without org-lsp's editor code (org_client) gets Agenda.org instead, which it opens as an Org file with the server attached: colored, and with every command of the agenda's as a code action (those with an agenda key in the manifest, and those that work on an agenda line), the line's entry's first; not follow mode, column view or going to the entry in another window, which need the editor's code. Its new text comes as edits of that file (workspace/applyEdit), one at a time: the next waits until the client has applied the last and reported it (didChange), since an edit of the version before would be refused.

Opening a view goes like this:

  1. The client runs org.agenda.list.
  2. The server sends window/showDocument with the agenda's URI and, as the selection, the line of today's date.
  3. The client opens the document, which makes it fetch the text.

When the view changes while the client has it open:

  1. The server sends workspace/textDocumentContent/refresh.
  2. The client fetches the text again and, since the document is open, reports the change with textDocument/didChange.
  3. If the cursor is to move (the view went to another week, say), the server sends window/showDocument with the new line only now, when the client's copy matches. Sent earlier, the line number would be applied to the old text.

For step 3 the client must sync the agenda document like any other: didOpen when it shows it, didChange when it replaces the text, didClose when it closes it. After didClose the server stops rebuilding the view.

Changed lines stay where they are. As in Emacs, a change made from the agenda does not move the entry's lines: they show the new state, priority or tags where they are (org-agenda-change-all-lines), a new date at their end, such as => <2026-05-23 Sat> or S => Scheduled to <2026-05-23 Sat> (org-agenda-show-new-time), and the cursor stays on its line, so that the next press of the key reaches the same entry. A repeating entry marked done shows the state it reached on today's line until the agenda is built again (org-agenda-headline-snapshot-before-repeat). The agenda is built anew with r (org.agenda.redo), another view, a change typed in a file, or a change that adds or removes entries. The new date fills the line up to the width the client reported with org-lsp/agendaWidth (80 columns without it), less the column a terminal keeps.

Lines of a view the client still shows. A key pressed before the client has fetched the new text names a line of the old one. The server keeps the old view until the client's copy has changed, and resolves the line against it.

The date prompt document#

Emacs shows a calendar while it asks for a date, and the server does the same for a client that announces experimental.orgDatePrompt: true in its capabilities (and supports workspace/textDocumentContent and window/showDocument). The prompt is a second document of the agenda's scheme, org-agenda:/Org%20Date with the language org-date, as the manifest's datePrompt names it. A client that cannot fetch documents sets the options date_prompt and view_changed instead (the Vim plugin): the prompt is then a read-only file, Date.org-date beside the agenda's file, written anew with org-lsp/viewChanged after each change.

          April 2026                May 2026                June 2026
     Su Mo Tu We Th Fr Sa     Su Mo Tu We Th Fr Sa     Su Mo Tu We Th Fr Sa
               1  2  3  4                     1  2         1  2  3  4  5  6
      …

SCHEDULED Date+time [2026-05-20]: 10:00    => <2026-05-20 Wed 10:00>

The three months are drawn as Emacs's calendar draws them, the weeks starting on the day calendar_week_start_day says (Sunday unless set); the last line is Emacs's minibuffer: the prompt, what was typed, and what that means. The selected day has the calendarSelected token, and the server puts the cursor on it.

  1. A command that asks for a date (org.schedule …) opens the prompt with window/showDocument and returns nothing. The client shows it as it likes (Neovim: a window at the bottom, VS Code: beside the file).
  2. Its keys are the commands' keys in the calendar scope: they move the selected day (from the day under the cursor), take the day at the cursor (org.calendar.select: what was typed and that day), ask for the answer (org.calendar.type, which returns { "input": … } like any command; that input box is the minibuffer), or give up (org.calendar.cancel). While the answer is typed, org.date.preview also shows it in the minibuffer line. org.calendar.time picks a time, which Emacs's calendar cannot: a Time: 10:00 line appears above the minibuffer, and until org.calendar.time again, the day commands choose the hour (earlier) or the minutes (later) and the week commands move it (earlier up, later down; the minutes by org_time_stamp_rounding_minutes, to a multiple of it first, as org-timestamp-change moves them). The time takes the place of a typed one, and stays when the keys go back to days.
  3. Answered or picked, the command runs with the answer and the day moved to (if it moved), as Emacs reads its prompt; the result is { "close": "org-agenda:/Org%20Date" }, and the client closes that document. Cancelling returns the same.

When the selected day moves, the server sends workspace/textDocumentContent/refresh, and once the client shows the new text, window/showDocument with the cursor on the day, as for the agenda. Other clients keep the plain input box.

Semantic tokens#

Tokens never overlap and never span lines. Nested markup is flattened into modifiers: in *bold /both/* the inner text carries bold and italic. Emphasis markers are part of the token they delimit. The manifest has the full legend with descriptions; this is an overview.

For a client without org-lsp's editor code (org_client), the server keeps to the token types and modifiers of the LSP specification, which editors and their color schemes color without being told. Org's tokens become the standard ones whose colors come closest to Emacs's faces:

OrgStandard
headline and stars, levels 1 to 8 (outline-1 …)function, property, keyword, comment, type, enumMember, macro, string
TODO keyword, planning keywordkeyword
done keywordstring
priority, statistics cookienumber
tagdecorator
timestamp; inactiveenumMember; comment
#+KEY:, block lines, comment, hidden text, archivedcomment
drawer, LaTeX, entity, macromacro
property keyproperty
bullet, checkbox, table delimiteroperator
link and its parts, targetnamespace
table headertype
code, verbatimstring
footnoteparameter
struck-through textvariable with deprecated

In the agenda: the title namespace, dates function (today keyword, a weekend type), scheduled entries string (from earlier days number), deadlines enumMember (today or past keyword), done entries, the time grid and dimmed tasks comment. Bold, italic, underlined text and a habit's graph have no standard kind and get no token.

In Org files#

TypeCovers
headlineThe title text of a headline; levelN modifier
starsThe stars of a headline; levelN modifier
outlineNever sent: VS Code's org-lsp.headlineLevelColors turns headline and stars into it
todoKeywordA TODO keyword; done when it is a done state
priorityA priority cookie, [#A]
tagThe tags of a headline, :a:b:, as one token
planningSCHEDULED:, DEADLINE:, CLOSED:, CLOCK: and a headline's COMMENT
timestampA timestamp or timestamp range; inactive for […]
drawerThe :NAME: and :END: lines of a drawer
propertyThe :KEY: of a property
keywordThe #+KEY: of a keyword line
blockThe #+BEGIN… line, with its parameters, and the #+END… line
commentComment lines and the contents of comment blocks
bulletA list bullet or counter
checkboxA checkbox; checked or partial
linkThe brackets of a bracket link, and its target where Org hides it; radio links; citations
linkDescriptionThe description of a bracket link, [[target][description]]
linkUrlThe target of a bracket link where it shows; plain and angle links
code~code~, and inline source blocks but for their code, which is left to the editor to color
verbatim=verbatim= and fixed-width lines
textPlain text that carries emphasis modifiers
tableDelimiterTable borders and rule lines
tableHeaderThe cells of a table's header: the rows above its first rule, when rows follow it
footnoteFootnote references and definition labels
cookieA statistics cookie, [1/3]
target<<target>> and <<<radio target>>>
latexLaTeX fragments
latexEnvironmentA LaTeX environment, \begin{…} to \end{…}
entityAn entity such as \alpha
macro{{{macro}}}
documentTitleThe value of #+TITLE: (org-document-title)
documentInfoThe values of #+SUBTITLE:, #+AUTHOR:, #+EMAIL: and #+DATE: (org-document-info)

Plain text gets no token, and neither do the contents of source and example blocks.

In the agenda#

Keywords, priorities, tags and links inside an agenda line have the types above. The rest of a line has one of these, which follow Org's agenda faces:

TypeCoversModifiers
agendaStructureThe title line of a view
agendaDateA date linetoday, weekend
agendaScheduledA scheduled entrytoday; past when scheduled before today
agendaDeadlineAn entry with a deadlineimminent when due or overdue, distant when far away
agendaEventAn entry with a plain timestamprange inside a date range
agendaDoneAn entry that is done
agendaTimeGridA line of the time gridcurrent for the current time

In the date prompt#

TypeCoversModifiers
calendarHeaderThe month and year above a month
calendarWeekdayThe name of a weekday above its columnweekend
calendarSelectedThe selected day; the hour or the minutes being picked
calendarPromptThe prompt in the minibuffer line
timestampWhat the answer means

Modifiers#

level1 … level8
On headline and stars. Levels above eight wrap around. The looks of outline.level1 … outline.level8 are the colors of outline-1 … outline-8 without the theme's heading color, for an editor that colors levels as Emacs does on request.
done
On todoKeyword; on the rest of a done headline (org-headline-done), in place of its level; on a complete cookie ([2/2], [100%]).
inactive
On timestamp.
checked, partial
On checkbox.
bold, italic, underline, strikethrough
On text and headline.
today, weekend, past, imminent, distant, range, current
On the agenda types, as listed above.
archived
On a headline with :ARCHIVE: in it, all of it but the stars (org-archived, a shadow over its other colors).
hidden
On text Org hides: the brackets of a link, and its target when it has a description (org_link_descriptive); emphasis markers (org_hide_emphasis_markers). It comes as tokens of its own, so an editor that can conceal text conceals the tokens with this modifier: Neovim with extmarks in the semantic tokens' namespace, VS Code with decorations.

Writing an editor integration#

An integration should stay free of Org logic. Its whole job:

  1. Start org-lsp for org files, and on demand for the agenda.
  2. Apply the manifest: link the tokens to the editor's highlight names and bind the keys of its preset to the commands.
  3. Run commands with the cursor position as their argument.
  4. Show the agenda document and keep it in sync, as described above; likewise the date prompt document, if it announces it, and close it when a command returns close.
  5. Open and close folds; the server only says where they are.

lua/org-lsp/ does this at run time. editors/vscode/ cannot, because VS Code wants commands, keys and token colors declared in package.json: there scripts/generate.mjs writes them from org-lsp manifest.

Without an integration, an editor still gets what its LSP client supports on its own: highlighting, folding, the outline, and TODO changes as code actions. Commands need the cursor position as an argument, which generic clients do not send, and the agenda needs window/showDocument.