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-magicin Emacs's configuration, the edit that encrypts the entries taggedcrypt(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 thanorg_cycle_max_levelhave no fold of their own, nor list items withorg_cycle_include_plain_listsfalse. 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'splainstyle: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-visibilityleaves it:org_startup_foldedand the file's#+STARTUP:(overview,content,show2levels…,showeverything), then each subtree'sVISIBILITYproperty, archived subtrees, blocks withhideblocks(org_cycle_hide_block_startup) and drawers (org_cycle_hide_drawer_startup).{ "folds": [FoldingRange…] }, innermost first, each one oftextDocument/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. Theinitializeresult has the same ascapabilities.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 oforg_journal_dirending in/, or null whenorg_journal_enabledis off. Params: none. Theinitializeresult has the same ascapabilities.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" }(dataas inSemanticTokens), 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'stagtoken (: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 ascapabilities.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-lineon the new line (Org'sRET), followingorg_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/rangeFormattingorg-indent-regionover the lines of the range (text, drawers and blocks re-indented, node properties aligned asorg-property-formathas them), then, astextDocument/formattingdoes 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.openfollows 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 itsCUSTOM_ID(#custom-id), from another file or the same one. On a link, the backlinks of the entry it leads to. WithincludeDeclaration, 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:prepareRenamegives 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 withoutorg-lsp/virtualIndent); the entities, sub- and superscripts and shrunk table fields oforg-lsp/display(for a client without it); the numbers oforg-num-modeafter the stars; and the times oforg.clock.displayafter 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'sroamBuffer.prefix) comes withtakeFocus: false: the editors show it beside the file it is for, the cursor staying there. With the optionshow_document_notificationit comes as the notificationorg-lsp/showDocumentinstead,{ id, params }with these params, which the client answers with the notificationorg-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;linesnull 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 thecolumnsscope of the manifest) take the column picked, from 0, ascolumnin their argument; after one,columnis where Emacs's cursor went, the column to pick then (org.columns.move.lefttakes 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 (unlessorg-timer-displayis 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…] }: withauto_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 withorg-indent-mode(org_startup_indented,#+STARTUP: indent, ororg.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: afterorg.indent.modetoo. Only for the version given. org-lsp/display- For a client that announces
experimental.orgDisplay: true(or sets the optiondisplay): what shows in place of hidden text, the entities and sub- and superscripts oforg_pretty_entities(α,x²) the bullets oforg_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'shighlights(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 optionimages): the images of the LaTeX fragmentsorg.latex.previewasked for, once Emacs has made them, in the form the preview commands answer with (seeorg.link.preview),kindlatex; and those oforg.link.preview,kindlink, 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.toggleanswers 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 optionline_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" };highlightnames the look it takes, as a selector of the manifest'shighlights:agendaClocking, the agenda's entry the clock runs on (org-agenda-clocking), orheadline.level1toheadline.level8, the headlines of an Org file withorg_fontify_whole_heading_linein 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 optioncode_blocks): where the code of an Org file is that the client colors in its own language, as Emacs does withorg-src-fontify-natively.{ "uri", "version", "blocks" }, each block{ "range", "language", "name", "kind" }:rangecovers the code alone, the lines between#+begin_srcand#+end_src(to the end of the last, without its newline) or what is between the braces ofsrc_python{…};nameis the language as written (emacs-lisp);languagethe client's name for it (elisp), the major mode Org edits it in (org-src-lang-modes, and the settingorg_src_lang_modesover it) by the names tree-sitter's parsers have (emacs-lisp→elisp,shand the other shells →bash,C++→cpp);kindissrc,exportorinline. 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 optionsyntax): 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, ororg_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 ornull, and the faces of keywords and tags{ "todo": { KEYWORD: face }, "tag": { TAG: face } }asorg-lsp/facesgives 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 oforg.yankororg.paste.subtree(the server sees it intextDocument/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 oftextDocument/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 optionrun_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 anorg-protocolURL started comes so:org.capturewith the URL's template askeysandorgProtocol, what Org stored of the link ({ "props": [[":link", "https://…"], …] }), which each question'scontextcarries 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:
nullwhen none does, or{ "heading", "minutes", "effort", "text", "uri", "line" }, the entry's headline, the minutes clocked on it so far (sinceLAST_REPEATif it has one), its effort in minutes ornull, 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 showsTask ‘Write the report’ should be finished by now. (1:00)(org-clock-notify-once-if-expired), once for each clock;effortTextis 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 withwindow/showDocumentfor the entry of that line,takeFocus: falseandorgOtherWindow: true: the client shows it in another window and keeps the cursor in the agenda. Sent as a request, withwidththe 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'sorg-unlogged-messagedoes (the echo area, the status bar), ornull.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 theclockoption; 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. Withorg_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.tomlorconfig.json. The shared configuration file, whose options this editor's go on top of:falsefor none, or the path of another file (JSON if it ends in.json, else TOML). Unset, it is$ORG_LSP_CONFIG, elseconfig.tomlorconfig.jsonin$XDG_CONFIG_HOME/org-lsp(~/.config/org-lsp;%APPDATA%\org-lspon 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_modulesandtargetleft out), or else from the Org files that are open. (org-agenda-files) org_agenda_file_regexp- string, the
.orgfiles whose names do not start with a dot. Which files of a directory inorg_agenda_filesare 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 oforg_agenda_filesthat are not there. Withfalse, opening an agenda view asks about each:rremoves 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, andWAIT(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, andC-S-<right>switches to the next. A list that starts withtypeis 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 inorg_todo_keywordsis (Org's old syntax): a sequence, or types, each going straight to done. A list that starts withsequenceortypesays 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 inorg_todo_keyword_faces:{ "A": ":foreground red :weight bold" }. (org-priority-faces) org_tag_faces- { [tag]: string },
{}. Faces for particular tags of headlines, written as inorg_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. WriteCLOSED:with the time when an entry is done, and withnoteask for a note too. A file's#+STARTUP:wordslogdone,lognotedoneandnologdonechange it there; an entry'sLOGGINGproperty (inherited) says what its state changes log instead: those words,logrepeatand its relatives, and keywords with what they log (WAIT(@/!)), ornilfor 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,lognoterepeatandnologrepeatchange it in a file, and theLOGGINGproperty 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 },defaultfor those not named. (org-M-RET-may-split-line) org_blank_before_new_entry- object,
autofor 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:trueto 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.reversedgoes 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. Withfalsethe 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 (taggedARCHIVE); withfalsethose 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; withfalse, 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 ofC-c C-x C-dgo at the next change of the text; withfalsethey stay untilC-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:nullfor scheduled and deadline dates, or one kind;cin 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 asorg.paste.subtreedoes: 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. Withfalse(andorg_yank_adjusted_subtreesoff) 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 ~falseit 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: oddandoddevenset 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 withorg_odd_levels_only) is an inline task: a task inside the text of its entry, closed by a line of as many stars andEND. 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 itsENDline.false: there are no inline tasks, as in Emacs beforeorg-inlinetaskis loaded. (org-inlinetask-min-level) org_inlinetask_show_first_star- boolean,
false. The stars of an inline task but the last two are hidden, asorg_hide_leading_starshides those of a headline; withtruenone 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>andC-S-<right>):alwayseverywhere but on a timestamp and the#+BEGIN:line of a clock table;trueeverywhere but there, on headlines, list items' bullets, property lines and tables;falsenowhere, Org's commands wherever they apply. With text selected,alwaysandtrueextend it. Emacs's default isfalse; org-lsp's isalways, as editors select with these keys. (org-support-shift-select) org_treat_S_cursor_todo_selection_as_state_change- boolean,
true.S-<left>andS-<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 headingorg.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 andS-<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. Withfalsethey refuse (Priority commands are disabled), andS-<up>andS-<down>on a headline do not change its priority. (org-priority-enable-commands) org_track_ordered_property_with_tag- boolean, string,
false. A tag thatorg.ordered.toggle(C-c C-x o) puts on the headline with theORDEREDproperty and takes off without it:trueforORDERED, 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; withfalseit 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. Withfalsethe key keeps the editor's own meaning, but on a line a closed fold starts on (seeorg_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 withorg_special_ctrl_k) kills what the fold hides with the line, as Emacs'skill-linedoes:trueasks first (Kill hidden subtree along with headline?),"error"refuses (‘C-k’ aborted as it would kill a hidden subtree),falsekills. 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:".",")", ortruefor 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;falsecounts every box further down too, asrecursivein aCOOKIE_DATAproperty does. (org-checkbox-hierarchical-statistics) org_table_number_regexp- string, Org's: integers, decimals,
2.4e-08,0x1F,nan,infand 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:falsestops 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;twrites 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:34rather than8: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], andangle_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);falseleaves 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 theORDEREDproperty, 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 (withorg_enforce_todo_dependenciesororg_enforce_todo_checkbox_dependencies);invisibleleaves 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]), withnoteasking for a note too.#+STARTUP:logrefile,lognoterefileandnologrefilechange 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 …), withnoteasking for a note too.#+STARTUP:logreschedule,lognoterescheduleandnologreschedulechange 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 …), withnoteasking for a note too.#+STARTUP:logredeadline,lognoteredeadlineandnologredeadlinechange it in a file. (org-log-redeadline) org_log_into_drawer- boolean, string,
false. Put state changes and notes into a drawer:trueforLOGBOOK, or the name of a drawer.#+STARTUP:logdrawerandnologdrawerchange it in a file; an entry'sLOG_INTO_DRAWERproperty (inherited) says which drawer for it (tforLOGBOOK,nilfor none). (org-log-into-drawer) org_log_done_with_time- boolean,
true. TheCLOSED: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,refileandclock_out. In a heading%tis the time,%Tthe time active,%dand%Dthe date,%sthe new state or date and%Sthe old one,%uthe login name and%Uthe full name; an empty heading leaves the note its text only. Kinds left out keep Org's headings. Habits take notes with thedoneheading 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:logstatesreversedandnologstatesreversedchange 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-outandnolognoteclock-outchange 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).falseleaves 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. ACOOKIE_DATAproperty withrecursivedoes this for a subtree. (org-hierarchical-todo-statistics) org_closed_keep_when_no_todo- boolean,
false. Keep theCLOSED: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,todofor any not done,donefor 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::truefor all,falsefor 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, whenorg_use_tag_inheritanceistrueor 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"):truefor all,falsefor none, a list of names, or a regexp (Emacs syntax).CATEGORYandARCHIVEare always inherited. (org-use-property-inheritance) org_property_separators- [names or regexp, separator][],
[]. What joins the values of a property with those of itsPROPERTY+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%sfor the key with its colons, then the value, with a width (%-10spads 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 andS-<right>andS-<left>go through on its line ({ "Effort_ALL": "0:10 0:30 1:00 2:00" };:ETCallows others too). (org-global-properties) org_clock_into_drawer- boolean, string,
true. WhereCLOCK:lines go:truefor the drawer oforg_log_into_drawer(LOGBOOKwhen that is not a name), the name of a drawer, orfalsefor the entry itself. (org-clock-into-drawer) org_clock_out_remove_zero_time_clocks- boolean,
false. Clocking out after less than a minute removes theCLOCK: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 clocksorg.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, asorg.clock.resolvedoes:when-no-clock-is-runningwhen no clock runs,truealways (the clock that runs too),falsenever. 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, fororg.clock.inwith a count andorg.clock.in.last. (org-clock-history-length) org_clock_in_resume- boolean,
false. Clocking into an entry whoseCLOCK: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:trueboth,clockthe running clock alone,historythe history alone (whatC-u C-c C-x C-ioffers). The running clock runs again if itsCLOCK: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 fileorg_clock_persistkeeps the clock in: Emacs's,org-clock-save.elin 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.gotogoes to the entry clocked last. Withfalse, it saysNo 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 fromorg.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 othersnil. 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-BRandsk. The words of a clock table in each language its:langnames: the language, then its words forFile,L,Timestamp,Headline,Time,ALL,Total time,File timeandClock 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,:tstartand: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;%sis 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;%sis 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[],
[]. Theorg-lintcheckers 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 newIDis made (org.id.create, a link stored by ID, org-roam): a random UUID, the time in base 36 (org), or the time asorg_id_ts_formatwrites it (ts). (org-id-method) org_id_prefix- false, string,
false. What a newIDstarts with, before a colon:"Org"makesOrg:…. (org-id-prefix) org_id_ts_format- string,
"%Y%m%dT%H%M%S.%6N". How thetsmethod writes the time, asformat-time-stringdoes. (org-id-ts-format) org_id_include_domain- boolean,
false. Theorgandtsmethods end a newIDwith@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 oforg_id_search_archives,org_id_extra_filesandorg_id_locations_file, the agenda files, the open ones and org-roam's. Off, anid: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 anid:link completes to (org.link.insert), asorg_refile_targetsnames 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);trueis an error;falselooks for its words in the text. (org-link-search-must-match-exact-headline) org_link_doi_server_url- string,
"https://doi.org/". What adoi:link is opened at: this, then the DOI. (org-link-doi-server-url) org_link_shell_skip_confirm_regexp- string,
"". An Emacs regexp: ashell:link whose command it matches runs when followed without askingExecute … 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 aman:link, whenol-manis inorg_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, ismantoo. (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 aninfo: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 theinfoprogram writes the node. (org-info-other-documents) org_ctags_path_to_ctags- string,
"ctags". Thectagsprogram (Exuberant or Universal Ctags) thatorg.ctags.createruns to make theTAGSfile of a directory, whenorg-ctagsis inorg_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"]. Withorg-ctagsinorg_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 theTAGSfile of the file's directory),org-ctags-ask-rebuild-tags-file-then-find-tagandorg-ctags-rebuild-tags-file-then-find-tag(theTAGSfile made again, then the tag),org-ctags-ask-append-topicandorg-ctags-append-topic(a new topic at the end of the file),org-ctags-ask-visit-buffer-or-fileandorg-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 topicorg_ctags_open_link_functionsmakes,%tthe link's text capitalized. (org-ctags-new-topic-template) org_id_link_to_org_use_id- boolean, string,
false. Whetherorg.link.store(C-c l) links to an entry by its ID:truemakes 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 aCUSTOM_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-uturns 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 processororg.cite.insertinserts with:basic, as Org's own does; Org's other processors cannot insert, and those of packages (citar) are not run;falsefor none. (org-cite-insert-processor) org_bibtex_autogen_keys- boolean,
false. Whetherorg.bibtex.createandorg.bibtex.checkmake the key of a new BibTeX entry from its author, year and title, asbibtex-generate-autokeymakes 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_givesBIB_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 aTITLEproperty is the title of its BibTeX entry, andorg.bibtex.checkdoes not ask for one. (org-bibtex-treat-headline-as-title) org_bibtex_export_arbitrary_fields- boolean,
false. Withorg_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.IDmakes 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. Thekeywordsfield of an entry read is its tags (spaces as_, other characters a tag cannot have left out), and an entry's own tags are itskeywordswhen exported, but for those oforg_bibtex_tagsandorg_bibtex_no_export_tags. (org-bibtex-tags-are-keywords) org_bibtex_no_export_tags- string[],
[]. Tags that are not exported as keywords, withorg_bibtex_tags_are_keywords. (org-bibtex-no-export-tags) org_bibtex_inherit_tags- boolean,
false. Withorg_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" }followshttps://github.com/org-lsp.%sstands for what follows the colon,%hfor 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), oneemacs_configmarks 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(whatC-u C-u C-c C-ouses),auto-mode(every file the editor can show) ort(any other file). A command isemacs(the editor),default(thesystementry, else the editor),systemormailcap(the system's application, through the editor), or a shell command where%sis the file.C-u C-c C-oopens 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 applicationorg_file_appsgives it, rather than sayingNo 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 theindex.orgin 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 ]"givesworkthe keyw, makes@officeand@homeexclusive, and groupsControlandPerspunderGTD;\nstarts 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:ororg_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:ororg_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". HowC-c C-t(org.todo) changes the TODO state where keywords have keys (TODO(t)):autopicks the state by key from a menu of them;expertby key too, the keys listed in the prompt alone (in Neovim and Vim; other editors show their menu);falsegoes to the next state, as where no keyword has a key.trueisauto. (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:autowhen some tag has a key,truealways (keys are given to the tags without one),falsenever: 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 toorg_tags_columnwhen 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
truefor 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. Withtime, 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'sj(org.agenda.goto.date) reads a date typed without a year or month, asorg_read_date_prefer_futuredoes 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 hasfiles:current(the entry's own file),agenda,org-id-files(the files with IDs), a path or a list of paths; and one oflevel,maxlevel,tag,todo,regexp(the Rustregexcrate's syntax) orall(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 ofProjects, and the entry goes under it.confirmasks 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).%sis 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. AnARCHIVEproperty 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:truefor 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 asARCHIVE_…properties:time,file,olpath(its outline path),category,todo,itags(inherited tags),ltags(its own tags) andolid(its parent's ID). (org-archive-save-context-info) org_archive_sibling_heading- string,
"Archive". The headline of the siblingorg.archive.siblingarchives 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;%sis the path of the file the subtree came from. (org-archive-file-header-format) org_archive_default_command- "subtree", "sibling", "tag",
"subtree". Whatorg.archive.defaultdoes: 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, asauto_savedoes 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 oforg_extend_today_until), for%t,%Uand the like and for the date of a date tree, which atime_prompttemplate then does not ask for. (org-capture-use-agenda-date) org_capture_templates_contexts- object[],
[]. Where templates are offered. Each has thekeyof a template,contexts, rules such as{ "in_file": "work" }(in_file,in_mode,in_buffer,not_in_file,not_in_modeornot_in_buffer, each with a regexp of theregexcrate's syntax, matched ignoring case), and maybeuse, the key of the template it stands for there. A template with contexts is offered only where one of their rules holds. The mode isorg-modein an Org file andorg-agenda-modein 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 akey, adescription, atype(entry, the default,plain,item,checkitemortable-line), atargetand atemplate(text, or a list of lines), and may haveprepend,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_capturedandunnarrowed. The target is a list:fileand 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;idand an ID;clock, the entry clocked now;file+function, a path and the name of an Emacs Lisp function that moves the point there, orfunctionand the name of one that visits the file too (run by the server's Emacs). An empty path isorg_default_notes_file, and without a target the entry goes at the end oforg_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://captureURL 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-styleorg-protocolURL (org-protocol://capture:/x/URL/TITLE/BODY). (org-protocol-data-separator) org_protocol_project_alist- object[],
[]. Where the files oforg-protocol://open-sourceURLs are on this computer. Each has aname, thebase_urlof the pages (with its last slash) and theworking_directoryof their files (with its last slash,~/for the home directory), and may have anonline_suffixtaken off the URL (.html), aworking_suffixput on in its place (.org), andrewrites, 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 whosebase_urlthe 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 protocolstarts when no org-lsp runs, as a command line (code,zed,kitty nvim): it opensorg_default_notes_filein it, or the file of anopen-sourceURL, 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 markedhiddenin 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. Withfalsethey 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-codeand:strike-through t. The look of each kind of emphasis, by its marker (*,/,_,=,~,+): a face of Org's,bold,italic,bold-italic,underline,org-codeororg-verbatim, attributes as Org writes them (:weight bold :slant italic :underline t :strike-through t), or a list of them;falsefor 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 inorg_timestamp_custom_formats: the date and time inside the brackets is hidden and the custom form shows in its place, as entities do.#+STARTUP: customtimeturns it on for a file, andC-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 oforg_display_custom_times, asformat-time-stringreads 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, "→", "->", "->", "→"]. A name is letters only, and one of Org's own is replaced. The server shows them asorg_pretty_entitiessays 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. Withorg_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 superscriptsorg_pretty_entitiesshows: 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'sorg_return_uses_meta_returndoes. 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, asorg.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 headingsorg.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_fileand before loading Org, for a few settings without a file thatemacs_optionscannot 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 }.trueistandfalsenil, 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, afteremacs_config_fileandemacs_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 inemacs_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 assistantsorg-lsp mcpserves change files: its toolsset_todo_state,capture,refile,schedule,deadline,set_tags,set_property,delete_property,set_priority,set_effort,add_note,archiveanddelete_entry, which write the agenda files, the capture targets, the files oforg_refile_targetsand the archive files directly. Off, it only reads. It is read from the shared configuration file, as everythingorg-lsp mcpreads. 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 eachappt_display_intervalminutes after, as Emacs'sappt.elreminds; an entry'sAPPT_WARNTIMEproperty 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 notifyreminds 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_timeminutes before it. (appt-display-interval) notification_use_timestamp_warning- boolean,
false. As org-lsp's own,org-lsp notifyalso 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 ofappt_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'sappt.elreads no cookie. notification_deadline_summary_time- string, no summary. The time of day, as
HH:MM, at whichorg-lsp notifylists 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 notifyreminds of: a match string of the tags view, such as+meeting|+callor-private. notification_command- string[], none. A program
org-lsp notifyruns for each notification, and its arguments, in which%tstands for the title,%bfor the text and%%for%:["ntfy", "publish", "--title", "%t", "mytopic", "%b"]. It runs instead of the desktop notification, unlessnotification_desktopis on. No shell reads it. With a placeholder of an entry (those ofnotification_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 asAppointment in 10 minutes. The title of an appointment's notification fromorg-lsp notify, in which%hstands for the headline,%kits TODO keyword,%pits priority,%Tits tags,%cits category,%sand%dits scheduled and deadline timestamps,%wthe appointment's time,%mthe minutes left,%ethe effort,%fand%Fthe file's path and name,%lthe headline's line,%athe lineappt.elshows and%%%:"%k %h". Appointments due together share the first one's. notification_body_format- string,
%a, the lineappt.elshows. The text of an appointment's notification fromorg-lsp notify, with the placeholders ofnotification_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 oforg-lsp notify, with the placeholders ofnotification_title_formatand%Dfor the agenda's leader (In 3 d.:,2 d. ago:,Deadline:); there%ais the headline as the agenda shows it. notification_desktop- boolean, on unless
notification_commandis set. Whetherorg-lsp notifyshows a desktop notification: withnotify-sendon Linux and the other Unix systems,terminal-notifieron macOS when it is installed andosascriptotherwise, 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 toorg-lsp/icon.pngin the user's data directory (~/.local/shareon Linux).osascriptshows no image: on macOS it takesterminal-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.integratemakes 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'sVISIBILITYproperty (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: alignandnoaligndecide 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: shrinkdecides 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: hideblocksandnohideblocksdecide 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:truefor 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:trueat its own width; a number, that many pixels;falseor a list of one number, the:widthof the paragraph's#+ATTR_ORG:or else of another#+ATTR_…:(pixels,50%or a fraction up to 2 of the text's width,tfor its own width), else the list's number. An entry'sORG-IMAGE-ACTUAL-WIDTHproperty 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 ofhttp:andhttps: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 followsorg_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):trueall 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;falsenone 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 thefile://URL of the file asking for it. The answers!,dandfto 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, asC-c C-x C-v(org.link.preview) shows them.#+STARTUP: inlineimages(orlinkpreviews) andnoinlineimagesdecide 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, asC-c C-x C-l(org.latex.preview) shows them, made by Emacs.#+STARTUP: latexpreviewandnolatexpreviewdecide 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: indentandnoindentdecide for a file, andorg.indent.modeturns it on and off. It turnsorg_adapt_indentationoff 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: numandnonumdecide for a file, andorg.num.modeturns it on and off. (org-startup-numerated) org_num_max_level- integer, every level. The deepest level
org-num-modenumbers. (org-num-max-level) org_num_skip_commented- boolean,
false.org-num-modeleavesCOMMENTsubtrees unnumbered. (org-num-skip-commented) org_num_skip_footnotes- boolean,
false.org-num-modeleaves the footnotes section (* Footnotes) unnumbered. (org-num-skip-footnotes) org_num_skip_tags- string[],
[].org-num-modeleaves 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-modeleaves the subtrees of headlines with anUNNUMBEREDproperty 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: hidestarsandshowstarsdecide for a file. (org-hide-leading-stars) org_indent_mode_turns_on_hiding_stars- boolean,
true. Whereorg_startup_indented(or#+STARTUP: indent) shows a file indented, hide the leading stars too, whateverorg_hide_leading_starssays. (org-indent-mode-turns-on-hiding-stars) org_indent_mode_turns_off_org_adapt_indentation- boolean,
true. Where a file shows indented,org_adapt_indentationis off (unless it isheadline-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 asH:MMafter the larger units),["special", "h:mm:ss"],["special", 2](one unit with 2 decimals) and"compact"(no space between units). The units are those oforg_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 modifiertodo). (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 typesquoteandverse). (org-fontify-quote-and-verse-blocks) org_custom_properties- string[],
[]. The propertiesorg.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 modifierslevel1tolevel8, Org'sorg-level-1toorg-level-8): with 4, a headline of level 5 looks as one of level 1, or as one of level 4 withorg_cycle_level_facesoff. (org-n-level-faces) org_cycle_level_faces- boolean,
true. Past the last look oforg_n_level_faces, headlines take the looks of the levels from the first again; withfalse, 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 colorsorg.headlineLevel1Backgroundand 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 groupOrgLspEllipsis(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 oforg_bullets_bullet_listby level, and the stars before it are hidden, as withorg_hide_leading_stars. (org-bullets-mode) org_bullets_bullet_list- string[],
["◉", "○", "✸", "✿"]. The bullets oforg_bullets_mode, one a level, repeating after the last. (org-bullets-bullet-list) org_bullets_list_bullet- false, or a string,
"•". Whatorg_bullets_modeshows in place of the-,+or*of an item, as org-bullets.nvim does;falseleaves them as they are. org_bullets_checkboxes- false, or { todo, half, done },
{ "todo": " ", "half": "-", "done": "✓" }. Whatorg_bullets_modeshows between the brackets of a checkbox,[ ],[-]and[X], as org-bullets.nvim does;falseleaves 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 yeswrites 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; withfalseby 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):%linkthe link back to it,%source-nameits name,%filethe Org file,%start-linethe 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 oforg_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 orggoes through:org-remove-indentationtakes its common indentation away,identityleaves 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:truealways (a link to it becomes a file of its own),falsenever (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. Formerlyorg_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;falsestarts 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-habitturns habits on: entries with theSTYLEpropertyhabitand a scheduled date with a repeater (.+2d,.+2d/4dfor a deadline too) show in the agenda with a graph of the days they were done.ol-manmakes[[man:ls]]a link to a man page (org_man_command).org-ctagsfollows links to the tags of aTAGSfile, as loading it and callingorg-ctags-enabledoes (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;begonly 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: whereorg_agenda_use_tag_inheritancehas them (true), always, never (false), or in these kinds of views (agenda,todo,search). Sorting by tag andorg_agenda_max_tagsgo 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.falsehighlights none. Org's list of faces by priority is not read here:org_priority_facesgives 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-deadlineisorg_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 (COMMENTafter 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 (taggedARCHIVE), unless archives mode (v a) shows them. Org advises leaving it on and usingv ainstead. (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 fororg_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 oforg_agenda_todo_ignore_scheduled. (org-agenda-todo-ignore-timestamp) org_agenda_todo_ignore_time_comparison_use_seconds- boolean,
false. Compare the dates of theorg_agenda_todo_ignore_*settings with now to the second instead of by day:futureis 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:falsepasses over its subtree,indentedshows 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 theorg_agenda_todo_ignore_*settings leave entries out oftags-todomatches 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-todotoo) and a search (search) are ordered: the strategies in turn, each deciding when the ones before do not. A view without a list takesagenda's, and without thattime-up,category-keep,urgency-down; one list alone is for every view.time-up~/-down~ the time of day;timestamp-,scheduled-,deadline-,ts-(active) andtsia-(inactive)up~/~downthe 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-(andcategory-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-upand-downcall 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_highoff). (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), orautofor the right edge of the window. Withauto, 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 (800for 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 (ltoggles it). (org-agenda-start-with-log-mode) org_agenda_start_with_clockreport_mode- boolean,
false. Start the agenda with the clock report under it (Rtoggles 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,:tendand:scopeare 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 atoggles 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:closedentries,clocklines andstatechanges. (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 (pin 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. Withtitlethe 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 (Ftoggles 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 (Etoggles it). (org-agenda-start-with-entry-text-mode) org_agenda_entry_text_maxlines- integer,
5. The most lines of an entry's textEshows. (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 textEshows. (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 textEshows is not written. (org-agenda-add-entry-text-maxlines) org_agenda_add_entry_text_descriptive_links- boolean,
true. Whether links in the textorg_agenda_add_entry_text_maxlineswrites 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, asC-c C-x C-cthere 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, orfalsefor nothing. In a block'ssettings, 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 oforg_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;trueist,falseisnil(and forname,none: no header). The lines no group takes come last, underorg_super_agenda_unmatched_name. In a custom command'ssettings, 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 lowestorderfirst. (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 ofauto-planningandauto-ts, asformat-time-stringwrites 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 propertyauto-groupgroups lines by. (org-super-agenda-group-property-name) org_super_agenda_properties_inherit- boolean,
true. Look for the properties ofproperty,auto-propertyandauto-groupin the entries above too. (org-super-agenda-properties-inherit) org_roam_enabled- boolean,
false. org-roam: the files oforg_roam_directoryare a network of notes, whose nodes (files and entries with anID) are found, linked to and made with theorg.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.gpgor.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 toorg_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 itstitle,tags,todo,file,olp,aliasesand the other fields oforg-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 linkorg.roam.node.insertmakes, a template asorg_roam_node_display_templateis (${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"] }. Bynode-propertyandkeyword, 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 drawsorg.roam.graph's graph, found onPATHor 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:idfor org-roam's nodes,httpsfor 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 thanorg_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 fileorg.roam.extractoffers for a node, relative toorg_roam_directory:%<…>is the time asformat-time-stringwrites it,${title},${slug}and${id}the node's. (org-roam-extract-new-file-path) org_roam_link_auto_replace- boolean,
true. Turn theroam:links of org-roam's files intoid: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) andunlinked-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, asorg_capture_templateswrites them, with org-roam's targets:fileand 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, andnodeand the title, alias orIDof a node. The path, relative toorg_roam_directory, and the texts may have${title},${slug},${id}and${name}, which asks forname(${name=default}starts the answer withdefault), besides the escapes oforg_capture_templates.unnarrowedshows the whole file in the capture buffer. (org-roam-capture-templates) org_roam_dailies_directory- string,
"daily/". Where the daily notes are, relative toorg_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, asorg_roam_capture_templateswrites them, with paths relative toorg_roam_dailies_directory;%<…>is the note's day. (org-roam-dailies-capture-templates) org_journal_enabled- boolean,
false. org-journal: a journal inorg_journal_dir, a file a day (or week, month, year), written with theorg.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 aCREATEDproperty. (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, asformat-time-stringwrites the date their entries start on: with%Y,%mand%d(a yearly file needs only%Y, a monthly one%Yand%m). A name without.orgis 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, afterorg_journal_date_prefix, asformat-time-stringwrites it, in the C locale:%xis10/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, asformat-time-stringwrites 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 fororg_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:neverdeleted,always, orask. (org-journal-carryover-delete-empty-journal) org_journal_file_header- string,
"". What a new file starts with, asformat-time-stringwrites it:#+title: Journal %Y. (org-journal-file-header) org_journal_created_property_timestamp_format- string,
"%Y%m%d". The date in theCREATEDproperty 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 withcrypt, fororg-cryptto encrypt (org.crypt.encrypt.all, or as the file is saved withorg-crypt-use-before-save-magicin 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, asformat-time-stringwrites 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, ordesc, 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 hourorg_extend_today_until, a TODO change records 23:59 of the day before: inCLOSED:,LAST_REPEATand the notes' timestamps.org.todo.yesterdaydoes 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 beforeorg_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, asorg_agenda_filesnames them.agenda-archivesfirst 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):%cthe category,%tthe time,%sthe leader (Scheduled: ~), ~%ethe effort,%la blank per level,%Tthe last tag,%bthe headlines above (breadcrumbs),%ithe icon (none). A width pads (%-12con the right,%12con the left),.Ncuts,%?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 (theemacsoption) on the entry's headline withcategory,extra,level… bound, as Org runs it:%(org-entry-get nil "X"), or a function ofemacs_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:%-4spads 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(ororg-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;prefixonly 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, asformat-time-stringdoes:%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 oforg_agenda_custom_commandsare offered, as fororg_capture_templates_contexts. (org-agenda-custom-commands-contexts) org_agenda_custom_commands- object[],
[]. Commands of the agenda menu. Each has akeyand adescription, and either atype(agenda,alltodo,todo,tagsortags-todo) with amatch(keywords such asNEXT|WAITfortodo, a match string such aswork-homeorPRIORITY="A"fortags), orblocks, a list of such views shown one after the other.headerreplaces a view's header (empty: none), andsettingsholds 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 notificationorg-lsp/showDocument,{ id, params }withwindow/showDocument's params, which the client answers withorg-lsp/showDocumentResult,{ id, result }, rather than withwindow/showDocument: the Vim plugin sets it for coc.nvim, which shows those documents on its own and not aswin_split_modesays. refusal_results- boolean,
false. Whether a command that does not apply at the cursor answers{ notApplicable: true, message }rather than an error whose data saysnotApplicable, 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
createresource 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 withexperimental.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_promptsis on, and so are more code actions when the client shows message requests (window.showMessage) ormessage_promptsis set. message_prompts- boolean, true for a client without org-lsp's editor code (
org_client). Ask what commands ask for withwindow/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 withwindow/showMessage, for a client that does nothing with a command's result. message_requests- boolean,
true. Whether the client shows the questions ofmessage_promptsthat have choices, and Emacs's yes-or-no questions (window/showMessageRequest). Off, for a client that cannot (Helix), the server saysPROMPT: 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 asorg-lsp/message,{ type, message }aswindow/showMessage's, rather than withwindow/showMessage, as a client announcingexperimental.orgMessagesdoes: 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 withorg_fontify_whole_heading_line. As a client announcingexperimental.orgLineHighlightsdoes: 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 announcingexperimental.orgCodeBlocksdoes: 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 announcingexperimental.orgSyntaxdoes: for the Vim plugin. run_command- boolean,
false. Whether the client runs a command when the server asks (org-lsp/runCommand: a capture anorg-protocolURL starts), as one it runs from a key, as a client announcingexperimental.orgRunCommanddoes: for the Vim plugin and the Sublime Text package. Without it, the server runs the command itself, and asks what it asks withwindow/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 oforg_bullets_mode, shrunk table fields), as a client announcingexperimental.orgDisplaydoes: 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 oforg.custom.properties.toggle), as a client announcingexperimental.orgHiddenLinesdoes: 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 announcingexperimental.orgImagesdoes: 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 announceexperimental.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 showsorg-indent-mode's prefixes and hidden stars that the server sends (org-lsp/virtualIndent), as a client announcingexperimental.orgVirtualIndentdoes: 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 runsSCRIPT 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 ofcommand_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 ,
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.listandorg.agenda.todos org-check-agenda-file: for a file oforg_agenda_filesthat is not there (unlessorg_agenda_skip_unavailable_files), the command first asks Non-existent agenda file ~/gone.org. [R]emove from list or [A]bort? (input kindkey,unavailablein the context).rremoves it until the server starts again (Removed from Org Agenda list: …) and the command goes on; anything else is Abort.org.agenda.dispatchorg-agenda(C-c a): asks for a view by its key, as Emacs's menu does (input kindkey;afor the agenda,tfor the TODO list,m/Mfor a tags search,s/Sfor a search,#for the stuck projects (org-agenda-list-stuck-projects, asorg_stuck_projectssays what a project is and what makes it not stuck), and the commands oforg_agenda_custom_commands, of the typesagenda,alltodo,todo,tags,tags-todo,searchandstuck), 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 (ororg_tag_alist). Withorg_agenda_custom_commands_contexts, only the commands whose contexts hold where the menu was asked for are offered (org-contextualize-keys: thetextDocumentof the argument, the agenda's view, or none). A prefix key of custom commands asks again, with the keys so far in the input'scontext(keys);mandMthen ask for the match string,sandSfor the search string (input kindtext,askin the context).org.returnorg-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 aselectric-indent-modeindents 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.returnorg-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'sauto). 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-promoteandorg-do-demote(the headline, its tags aligned again, its text withorg-adapt-indentation),org-promote-subtreeandorg-demote-subtree,org-move-subtree-upandorg-move-subtree-down(pastcountsiblings);M-<right>on a drawer or a block indents it (org-indent-drawer,org-indent-block). On a list item,org-outdent-itemandorg-indent-item(the item alone; on the first item of a list the whole list moves a column, withM-S-only),org-outdent-item-treeandorg-indent-item-tree(with its children),org-move-item-upandorg-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-columnleft and right,org-table-delete-columnandorg-table-insert-column,org-table-move-rowup and down (seeorg.table.next.field). Returns{ "edits", "cursor" }; elsewherenotApplicable. 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 oforg-table.elin 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) andorg-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 incopyfor the editor's register or clipboard),org-table-insert-rowabove (M-S-<down>) and below (its prefix argument);org-table-insert-hlinebelow (C-c -) and above,org-table-hline-and-move(C-c RET),org-table-blank-field(C-c SPCinorgtbl-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):$INVALIDfor 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 onTAB, is refused with a message. Returns{ "edits", "cursor" }; out of a tablenotApplicable.org.cut.subtree,org.copy.subtree,org.paste.subtreeorg-cut-subtree(C-c C-x C-w),org-copy-subtree(C-c C-x M-w) andorg-paste-subtree(C-c C-x C-y). Cutting and copying take the subtree at the cursor andcount - 1siblings after it; the result has the text incopy, for the editor's clipboard or register, and cutting also{ "edits", "cursor" }. Pasting readsclipboardfrom the context (the command has"clipboard": truein 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 tocount; "The clipboard is not a (set of) tree(s)" otherwise. Before the first headline cutting and copying arenotApplicable. A subtree cut or copied while the editor had it folded (a fold offoldedstarting on its headline) is folded again when it is pasted (org-subtree-clip-folded): its folds come inorg-lsp/folds. In a table, asorg-cut-specialand 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.yankorg-yank(C-y): aclipboardof one or more subtrees, yanked at the start of a line or right after the stars of an otherwise empty headline, goes in asorg.paste.subtreeputs it withorg_yank_adjusted_subtrees, else as it is. Withorg_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 inorg-lsp/foldsonce 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, isnotApplicable: the editor pastes as it does.org.sortorg-sort(C-c ^) on entries, asorg-sort-entriesdoes: the children of the entry at the cursor, or the top-level entries before the first headline. Asks for the sorting type (input kindkey):aalphabetic,nnumeric,ppriority,rproperty,oTODO order,ttime,sscheduled,ddeadline,ccreated,kclocking, a capital for the reverse order; forrandRthen the property (kindchoice, withanswersin 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:aalphabetic,nnumeric orttime (a timestamp, a duration, aH:MM), a capital for the reverse order; before the first column it first asks which (kindtext, stepcolumn, then the type with the column inanswers).org.sparse.treeorg-sparse-tree(C-c /): asks what to show (input kindkey):ra regexp (org-occur, Emacs's regexp syntax, case folded),tTODO entries,Tentries with these keywords (KWD1|KWD2),ma tags and properties match,pa property and its value,ddeadlines due withinorg_deadline_warning_days,bandascheduled and deadline dates before or after a date,Dbetween two; then what that needs (kindstext,choiceanddate, the answers so far inanswers, a line each). Returns{ "sparse": { "lines", "highlights" } }and Org's message: the editor folds everything, then opens the folds around each line, asorg-occurhides everything but the matches and the headlines above them, and highlights the ranges until the text changes; with"keepHighlights": true(org_remove_highlights_with_changeoff, or a tags or property match, whichorg-scan-tagshighlights 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, sayingTemporary highlights/overlays removed from current buffer, and returns{ "sparse": { "keep": true, "unfold": [], "highlights": [] } }: withkeep,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.headingorg-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.afterorg-insert-heading-respect-content(C-RET) andorg-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 kindtext), 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, asorg.agenda.inactivedoes. In a TODO list or a tags view it refuses.org.agenda.inactivev [: builds the agenda view again withorg-agenda-include-inactive-timestamps, which shows the inactive timestamps and date ranges of the entries, their lines marked withorg_agenda_inactive_leader([), and says "Display now includes inactive timestamps as well". The next rebuilding leaves them out again, whetherorg.agenda.redoor 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): seewindow/showDocumentabove. org.agenda.saveorg-save-all-org-buffers: returns{ "save": [uri…] }, the Org files the editor has open; the editor saves those with changes. Itsmessageis 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.habitsorg-habit-toggle-display-in-agenda(K), withorg-habitinorg_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 typeagendaHabit, its modifier the face Org gives it: none before the habit is due (org-habit-clear-face),ready,alertoroverdue, andfuturefor the days to come.org.table.import,org.table.exportorg-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_FILEor else asked for (an existing one only onceOverwrite file …?is answered yes), in a format,TABLE_EXPORT_FORMATor else picked among Org'sorgtbl-to-…functions, the one of the file's extension first. Both run in the server's Emacs (see "Emacs" below).org.attachorg-attach(C-c C-a): Org's dispatcher of attachment commands, by key (input kindkey):a,c,m,l,yattach a file asked for (relative to the document's directory) asorg-attach-method(Emacs's option, set inemacs_options) says, by copying, moving or linking it;uone from a URL;na new one, which the editor opens;zsynchronizes;oopens one (picked among them when there are several),fthe directory, by the system;ddeletes one (picked),Dall of them (after Emacs asks);sandSset and unset theDIRproperty;qaborts.b,OandF(an Emacs buffer, Emacs, Dired) are left out, andorg-attach-commandsdoes not change the keys. Run by the server's Emacs (see "Emacs" below), which makes the directory, gives the entry an ID orDIRand theATTACHtag.org.openon anattachment:link opens the file there (org-attach-expand).org.agenda.writeorg-agenda-write(C-x C-w): asks for a file (relative toorg_directory) and writes the view to it, askingOverwrite existing file …?first when it exists. A.orgfile 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,.pdfand.icsare refused.org.agenda.bulk.mark,org.agenda.bulk.unmark,org.agenda.bulk.toggleorg-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'smessagesays 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.regexporg-agenda-bulk-mark-regexp(%): asks for a regexp (input kindtext) 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.actionorg-agenda-bulk-action(B): asks for the action by key (input kindkey,stepactionin the context):$archive,Aarchive to the archive sibling,ta TODO state,+/-a tag to add or remove,s/da date to schedule or set as deadline (read once, as a day),ra refile target (of the first entry's file),Sscatter over the next N days (with a count, weekdays);ptoggles 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'smessage:Acted on N entries.org.agenda.followorg-agenda-follow-mode(F): toggles follow mode, in which the entry of the cursor's line shows in another window (asorg-agenda-showshows 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_modestarts with it on.org.agenda.entry.textorg-agenda-entry-text-mode(E,v E): shows some text of each entry under its line, asorg-agenda-get-some-entry-texttakes it (up to the next headline, without drawers, planning and clock lines, and whatorg_agenda_entry_text_exclude_regexpsmatches; the common indentation removed; each line afterorg_agenda_entry_text_leaders), at mostorg_agenda_entry_text_maxlineslines, 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.filterorg-agenda-filter(/): asks for a filter string (input kindtext, 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'smessagesays what filters there are, as Emacs's mode line does.org.agenda.filter.tagorg-agenda-filter-by-tag(\): asks for a tag by its key in the agenda files' tag tables (input kindkey,stepin the context),TABfor one typed,SPCfor 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.headlineorg-agenda-filter-by-category(<) andorg-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.regexporg-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.effortorg-agenda-filter-by-effort(_): asks for<,>or=and then an effort by its digit, fromEffort_ALLoforg_global_properties(input kindkey);_removes the filter. Entries without an effort count as more than any.org.agenda.filter.removeorg-agenda-filter-remove-all(|): shows every line again.org.agenda.archives,org.agenda.archives.filesorg-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:ororg_archive_location, and theirARCHIVEproperties) that exist. Each turns its mode off when it is on.org.clock.in,org.clock.out,org.clock.cancelorg-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 aCLOCK:line in theLOGBOOKdrawer, asorg_clock_into_drawersays.org.clock.inwith a count of 4 (C-u) asks which entry to clock into (input kindchoice, promptClock-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 mostorg_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.lastorg-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 oforg.clock.in, with 16 from when the last clock stopped. The history lives as long as the server.org.clock.resolveorg-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 kindkey, promptDangling clock started N mins ago [jkKtTgGSscCiq]?,stepresolvein the context), with the keys oforg-clock-resolve:kkeeps some of its minutes, asked next (input kindtext, promptKeep how many minutes (default N):, empty for all of them: the clock runs on, the one that ran stops),tthe same up to a time (input kinddate),g"got back" some minutes ago (Got back how many minutes ago (default N):),scancels it and starts it again now,Ccancels it,jshows it,iandqleave 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; withorg_clock_resolve_expertthe 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 kindkey,yorn). A clock the server found running when it started, or written by hand, is the clock it shows and the oneorg.clock.outstops, but here it is dangling, as it is in an Emacs that has just started, until it is kept. Withorg_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 withwindow/showMessageRequest(Clocked in & idle for N mins [jkKtTgGSscCiq]?), answered byorg.clock.resolve.idle(org-resolve-clocks-if-idle).org.clock.gotoorg-clock-goto: shows the entry the clock runs on, or the one clocked last.org.clock.displayorg-clock-display(C-c C-x C-d): the time clocked under each headline, its subtree included, withinorg_clock_display_default_range(thisyear), or with a count within a range picked from a list (input kindchoice); shown as inlay hints after the headlines (dots to column 60, then the time) until the file changes (withorg_remove_highlights_with_changeoff, following their headlines) ororg.checkbox.toggle(C-c C-c) takes them away. The result'smessagesays the file's total. A client shows them if it shows inlay hints.org.clock.reportorg-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 filebefore the first headline and:scope subtreeunder one, thenorg_clock_clocktable_default_properties; with a count, the first clock table of the file. Written asorg-dblock-write:clocktablewrites it: the scopesfile,subtree,tree,treeN,agenda,agenda-with-archives,file-with-archivesand a list of files;:block,:tstart,:tend,:wstart,:mstart,:stepwith:stepskip0,:maxlevel,:match,:link,:narrow,:compact,:indent,:level,:emphasize,:tags,:timestamp,:propertieswith: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:todaytotoday+1,2026-W20to2026-W21). The result carries the edit and the cursor.org.dblock.updateorg-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'sorg-dblock-write:functions) by the server's Emacs (see "Emacs" below), as isC-c C-con their#+BEGIN:line.org.custom.properties.toggleorg-toggle-custom-properties-visibility(no key in Emacs either), for a client that hides lines (experimental.orgHiddenLines): the lines of the properties oforg_custom_propertiesin 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.previeworg-link-preview(C-c C-x C-v), for a client that announcesexperimental.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 solefile:link). Answers{ "preview": { "kind": "link", "uri", "scope", "range", "remove", "includeLinked", "items": [{ "range", "path" }] } }: on a link, that link (removenull: the client takes its image away if it shows one, else shows it); elsewhere the current section (removefalse: shown anew); with a region, the region;count4 clears there (removetrue), 16 or 11 shows the whole file, 64 clears it, 1 and 11 take links with a description too.scopeis what Emacs names in its messages. With"startup": truein the argument, the whole file when it opens with previews (org_startup_with_link_previews,#+STARTUP: inlineimages), else null.attachment:links are left out. Withorg_display_remote_inline_imagesdownloadorcache,http:andhttps:links to images are among them, thepathof each the file the server downloaded it to, in a private directory of its own (bycurl, 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 inorg-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 thatorg_resource_download_policyandorg_safe_remote_resourcesdo not let through is first asked about as Emacs asks (org--confirm-resource-safe): an input of kindkey, the choices!,d,f,yandn, with the URL asstepand the answers so far asanswersin itscontext. 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.previeworg-latex-preview(C-c C-x C-l), for a client that announcesexperimental.orgImages: true: the same parts and counts asorg.link.preview, the images made by Emacs as Org makes them (org--latex-preview-region:latexanddvipngby default, intoltximg/beside the file), in the colorsforegroundandbackgroundgiven in the argument. Answers that it is making them, and sends them inorg-lsp/images; clearing answers at once.org.dblock.insertorg-dynamic-block-insert-dblock(C-c C-x x): asks which block (input kindchoice), then a clock table asorg.clock.reportmakes it, or a column view (org-columns-insert-dblock) of the scope asked for,local,globalor an entry's ID, made and filled in by Emacs.org.todoorg-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. Withorg_use_fast_todo_selectionexpert, the input has"expert": trueand 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; withfalse, the next state, keys or not. In an Org file or on an agenda line. Withorg_enforce_todo_dependenciesororg_enforce_todo_checkbox_dependencies, a change to a done state that a child not done, an earlier sibling underORDEREDor an unchecked box blocks is refused with Org's message (TODO state change from TODO to DONE blocked (by "TODO Child")).org.tags.setorg-set-tags-command(C-c C-q;org-agenda-set-tagson an agenda line): the tags of the headline, from the file's#+TAGS:lines, ororg_tag_alist, withorg_tag_persistent_alist(or else the tags used in the file, and withorg_complete_tags_always_offer_all_agenda_tagsthe agenda files'). When a tag has a key (work(w)), ororg_use_fast_tag_selectionistrue, they are picked asorg-fast-tag-selectionpicks them: an input of kindkeywhose 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'scontext(answers). Otherwise the tags are typed (kindtext, the current ones as:a:b:). The tags are written asorg-set-tagswrites them, sorted byorg_tags_sort_functionand aligned toorg_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.captureorg-capture: asks for a template's key (input kindkey, groups one key at a time; withorg_capture_templates_contexts, only the templates whose contexts hold where the capture starts), then for what its%^{…}and%^tescapes want (kindstextanddate;%^Cand%^L, when the editor's clipboard differs from the initial content, kindtextwith both as completions), withcontextcarrying the keys and answers so far.%cand%xare the editor's clipboard (clipboardin 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, asorg-capture-fill-templatedoes, an error in it becoming%![Error: …]; without Emacs the capture fails with why.%:keywordis a property of the link%amakes (org-store-link-plist)::annotationand:initialare%aand%i, and anid:link (org_id_link_to_org_use_id) has:link,:descriptionand: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 withunnarrowed), to a capture buffer (a file namedCAPTURE-<target>in a directory of the server's own) and shows it with the cursor where%?was.org.capture.finishorg-capture-finalize(C-c C-cin 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 astext(also fororg.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.abortorg-capture-kill(C-c C-k): closes the capture buffer; nothing changes.org.capture.refileorg-capture-refile(C-c C-w): the entry goes to its target and from there under a refile target picked as fororg.refile.org.roam.node.find,org.roam.node.insert,org.roam.capture,org.roam.node.random:: org-roam'sorg-roam-node-find,org-roam-node-insert,org-roam-captureandorg-roam-node-random, withorg_roam_enabled(see Notes (org-roam)); without it they fail with why. They need no document butorg.roam.node.insert, which inserts at the cursor or in place of the selection (range). They ask for the node (input kindtext, promptNode, the selection asvalue, every title and alias of the nodes ascompletions, asorg_roam_node_display_templatewrites them, and"select": true;context{ "step": "node" }). A node is visited withwindow/showDocument; a link goes in withworkspace/applyEdit, the cursor after it. A title no node has, andorg.roam.capture, go on with a capture of the node: the template's key when there is more than one (kindkey), its questions (kindtext), thecontextcarrying the title, keys and answers so far; then a capture buffer asorg.captureshows one, filed byorg.capture.finish, which writes a new file, and fororg.roam.node.insertinserts the link where the command ran.org.roam.ref.findorg-roam-ref-find: asks for a reference (input kindtext, promptRef,completionsandselect,context{ "step": "ref" }) and shows its node.org.roam.promote,org.roam.demoteorg-roam-promote-entire-bufferandorg-roam-demote-entire-bufferon the file at the cursor, an edit of it; or Emacs's error.org.roam.refileorg-roam-refile: asks for a node (input kindtext, promptNode,completionsandselect,context{ "step": "node" }), then edits both files. A file refiled whole is deleted by the same edit (adeleteresource operation) when the client announcesworkspace.workspaceEdit.resourceOperationswithdelete.org.roam.graphorg-roam-graph: draws the graph with Graphviz and shows it withwindow/showDocument(externaltrue), or runsorg_roam_graph_vieweron it;countlimits it to the node at the cursor and those near it.org.roam.extractorg-roam-extract-subtree: asks for the file (input kindtext, promptExtract node to: ~, its ~valuethe 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-addand the like, on the node at the cursor: they ask (input kindtext; promptsAlias,Tag,RefandRemove, the tags withcompletionsandseparator:;context{ "step": "value" }) and change the file, or fail with Emacs's No node at point or No tag to remove. Aroam:link followed withorg.openvisits its node; for a new node, the capture's questions come back toorg.openwithtitleandstepin theircontext. With org-roam on, the server answerstextDocument/willSaveWaitUntilfor org-roam's files with the edits that turn theirroam:links intoid:links, and completion in a link ([[,[[roam:,[[id:) offers node titles, each with atextEditfrom 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.filterTextis the title after theroam:orid:typed.org.roam.buffer.toggle,org.roam.buffer.dedicated,org.roam.buffer.refresh::org-roam-buffer-toggle,org-roam-buffer-display-dedicatedandorg-roam-buffer-refresh. The buffer is an Org file of the server's (org-roam-buffer.org, ororg-roam-buffer-SLUG.orgfor a dedicated one, in the server's directoryroam), shown withwindow/showDocumentandtakeFocus: false. Its sections, asorg_roam_mode_sectionslists 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 kindtext, promptNode,context{ "step": "node" }), or with acounttakes the node at the cursor. When the buffer's text changes and the editor has it open, the server sends the edit withworkspace/applyEditand thenorg-lsp/savefor it, whateverauto_savesays: the file is the server's.org.roam.dailies.goto.date,org.roam.dailies.capture.dateorg-roam-dailies-goto-dateandorg-roam-dailies-capture-date: in a client that shows the date prompt, the prompt opens and returns nothing, its minibuffer line starting withFind daily-note:orCapture to daily-note:, asorg-read-dateputs their prompt before its own; the day picked goes to the note or captures to it. Other clients get an input of kinddate(promptFind daily-noteorCapture to daily-note,context{ "step": "date", "goto" }).org.roam.dailies.find.directoryorg-roam-dailies-find-directory: the notes oforg_roam_dailies_directory, an input of kindchoicewhose keys are their names relative to it (context{ "step": "file" }); the one picked is shown withwindow/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'sorg-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-fileandorg-journal-reschedule-scheduled-entry, withorg_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 acountabove 1 is Emacs'sC-u. The date commands ask for a date as the date prompt does (input kinddate, promptDate), or take it as"date"in their argument. A missingorg_journal_diris asked about first (kindkey,Journal directory … doesn't exists. Create it? ~, ~context{ "step": "directory" }), and org-journal's own questions, such asDelete empty journal entry/file?, the same way (context{ "step": "question", "answers" }, anddate). 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 withwindow/showDocument, the cursor where org-journal leaves it, and its folds come inorg-lsp/folds.org.journal.search,org.journal.search.forever,org.journal.search.future,org.journal.search.future.scheduled,org.journal.schedule.view::org-journal-searchand the like, andorg-journal-schedule-view. The searches ask for the string (kindtext,context{ "step": "search" });org.journal.searchthen for its first and last day (kinddate, promptsEnter the search startandEnter the search end,contextcarryingsearch,startandstep), unless with acountabove 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 withwindow/showDocument; each result's date is afile:…::LINElink to the line found. When the journal is on, the date prompt's calendar marks the days with an entry with the tokencalendarJournal,futurefor 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 underorg_roam_dailies_directory) with the tokencalendarDailies, 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 thecalendarscope withorg.journal.next.entry,org.journal.previous.entry,org.journal.new.date.entry,org.journal.search.foreverandorg.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 withwindow/showDocumentandorgOtherWindow,takeFocus: falsefordisplayand for follow mode; the selected day moved by next and previous; the days marked again. Elsewhere,readanddisplayfail withNot 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 itscontext(day,YYYY-MM-DD).org.refileorg-refile(org-agenda-refileon an agenda line): offers the targets (an input of kindchoice), 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 (oneworkspace/applyEditover both). Withorg_log_refile(or#+STARTUP: logrefile) the refiled entry getsRefiled on [2026-05-18 Mon 10:30]; withnote, a note buffer is shown for it once it is refiled. Withorg_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; withconfirm,Create new node "New"? ~ is asked first, an input of kind ~keywhosecontextcarries the target back inanswers. An answer of that form when nothing is made refiles nothing, as in Emacs.org.refile.copy,org.refile.goto,org.refile.goto.lastorg-refile-copy(C-c M-w): asorg.refile, the entry kept where it was too (Copy subtree "…" to,Copy to "…" in file …: done).org-refilewithC-u: the targets offered (Goto), and the cursor goes to the one picked (window/showDocument), nothing moved; withC-u C-u(org.refile.goto.last), to the entry the last refile or copy put somewhere.org.archive.subtreeorg-archive-subtree(org-agenda-archiveon an agenda line): moves the subtree to its archive location: theARCHIVEproperty of the entry or a parent,#+PROPERTY: ARCHIVE, the first#+ARCHIVE:line, ororg_archive_location. Under the location's headline (made when missing,datetree/for year, month and day headlines by the entry'sCLOSED:date or today), or at the end of the file; with the propertiesorg_archive_save_context_infonames, inherited tags asorg_archive_subtree_add_inherited_tagssays, done asorg_archive_mark_donesays, and the parent's statistics cookies recounted. A new archive file starts withorg_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.siblingorg-archive-to-archive-sibling: moves the subtree under its siblingorg_archive_sibling_headingtagged:ARCHIVE:, made at the end of the parent's subtree when there is none, with anARCHIVE_TIMEproperty; the parent's TODO statistics are recounted.org.archive.tagorg-toggle-archive-tag: sets or removes theARCHIVEtag of the headline. Archived subtrees are left out of the agenda.org.archive.default,org.archive.confirmorg-archive-subtree-default: one of the three, asorg_archive_default_commandsays;org.archive.confirm(ain the agenda) asks first (input kindkey,yorn).org.archive.done,org.archive.tag.doneorg-archive-subtreeandorg-toggle-archive-tagwithC-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 kindkey(yorn), with the answers so far in the input'scontext(answers, a string ofyandn).org.priority- Asks for a priority (
Priority A-C, SPC to remove, an input of kindpriority) 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.iterateorg-table-recalculate(C-u C-c *,C-c *) andorg-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'smessagesays how many it took). On a#+TBLFM:line, that line's formulas apply to every line, asC-c C-cthere applies them (org.checkbox.toggledoes 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,;Sor;eis recalculated by Org in Emacs instead (org-table-recalculate,org-table-iterate,org-table-calc-current-TBLFM; seeemacs), the cursor left where Emacs leaves its point.org.table.recalculateis 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>afterC-u S-<right>). org.date.later.hours,org.date.earlier.hours,org.date.later.minutes,org.date.earlier.minutes::org-agenda-date-later-hoursand its siblings (Emacs'sC-u S-<right>,C-u C-u S-<right>): on an agenda line, move its timestamp by hours, or byorg_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; withorg_list_use_circular_motionfrom the last to the first and back, andM-<up>andM-<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 ofNAME_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-upand the rest), run by Emacs (see "Emacs" below). org.property.setorg-set-property(C-c C-x p;org-agenda-set-propertyon an agenda line): asks for the name (kindtext, 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 (kindchoice), whichNAME_ALLgives (inherited, from#+PROPERTY:lines andorg_global_propertiestoo;:ETCallows others, kindtextthen), or else any (kindtext, completing the values the file has, the entry's own by default). The steps come back withstepin the context (name, thenvaluewith the name inanswers). The value goes in the entry's property drawer, made when there is none (before the first headline, the file's), aligned asorg-indent-linealigns it;TODOandPRIORITYchange the keyword and the priority instead.SCHEDULED,DEADLINEand Org's other special properties are refused.org.property.delete,org.property.delete.globallyorg-delete-property, which asks which of the entry's properties (kindchoice), andorg-delete-property-globally, which asks for a name (kindtext) and takes it out of every entry of the file; a drawer left empty goes too.org.effort.set,org.effort.increaseorg-set-effort(C-c C-x e;ein the agenda): one ofEffort_ALL(kindchoice) 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.toggleorg-toggle-ordered-property(C-c C-x o): setsORDEREDtot, or takes it out.org.cite.insert,org.cite.insert.prefixorg-cite-insert(C-c C-x @) with Org'sbasicprocessor, and with the prefix argument (C-u C-c C-x @). Elsewhere than on a citation: keys one at a time (kindchoice, stepkeys, the keys picked so far inanswersseparated 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 (stepnew-style;(default)or one ofoc-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 (stepstyle); on its global prefix or suffix, a key (stepkey) 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 asorg-cite-delete-citationtakes 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.copyorg-bibtexandorg-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 kindtext, promptBibTeX file, the Org file's name with.bibasvalue, relative to its directory), with Emacs's Successfully exported N BibTeX entries to FILE; or the entry at the cursor incopy, 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-checkandorg-bibtex-check-all: their questions one at a time, as Emacs asks them (input kindtext): the type (promptType, 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 (promptField), the key (promptid); with a count (Emacs's prefix argument) the optional fields too. The answers so far come back in the input'scontext(replies, a list). Withorg_bibtex_autogen_keysthe key is not asked for: Emacs'sbibtex-generate-autokeymakes it, through Emacs. Emacs's errors are the refusals (Type::paper is not known).org.bibtex.yankorg-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.importorg-bibtex-import-from-file: the entries of the BibTeX file asked for (input kindtext, promptFile) 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.upon a top heading fails withAlready at top level of the outline.org.beginning.of.line,org.end.of.line,org.kill.lineorg-beginning-of-line(C-a),org-end-of-line(C-e) andorg-kill-line(C-k), asorg_special_ctrl_a_eandorg_special_ctrl_kmake them; with thosefalsethey arenotApplicable, so that the keys keep the editor's meaning.C-agoes 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-eto the end of a headline's title before its tags, the same key again to the line's own start or end; withreversedthe other way round.C-kon 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 askill-linedoes (the newline too when only blanks follow;End of bufferat 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'slast-command):reversedgoes on to the special place, and a kill adds to the one before. The motions carry the cursor ({ "edits": [], "cursor" });org.kill.linecarries its edit and the kill incopy, with"copyCharacters": truefor an editor whose registers are by lines or by characters (Neovim, Vim). On a line a closed fold offoldedstarts on (the command has"folds": true), whereorg_special_ctrl_kdoes not kill only to the tags,C-kkills to the end of the fold's last line, what the fold hides with it, askill-linekills to the end of the visible line, whateverorg_special_ctrl_kis; withorg_ctrl_k_protect_subtreetrueit asks first (input kindkey, Kill hidden subtree along with headline? /, the answer ininput), and with"error", or the answer no, it fails with /‘C-k’ aborted as it would kill a hidden subtree.org.gotoorg-goto(C-c C-j) with itsoutline-path-completioninterface: kindchoice, promptGoto, the file's headings toorg_goto_max_levelby their outline path (A/B/, asorg-refilenames 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, aswindow/showMessageRequest), its menu (C-u C-c C-x f: kindkey,ssort,rrenumberfn:N,Sboth,nnormalize,ddelete),org-toggle-itemandorg-toggle-heading(alsoC-c -,org.table.hline, andC-c *,org.table.recalculate.lineandorg.table.recalculate, off a table),org-toggle-comment(C-c ;),org-emphasize(C-c C-x C-f: kindkey, the marker),org-insert-structure-template(C-c C-,: kindkey, the keys of Emacs'sorg-structure-template-alist),org-insert-drawer(C-c C-x d: kindtext, the file's drawer names as completions),org-clone-subtree-with-time-shift(C-c C-x c: kindtext, how many, then with stepshiftthe shift per clone,+1wor empty). The command returns at once; when Emacs is done, what it changed comes asworkspace/applyEditand 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 tablenotApplicable, 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 |: kindtext, the size as3x2, empty fororg-table-default-size),org-babel-next-src-blockandorg-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: kindchoice, the names of the file's code blocks),org-next-blockandorg-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 asksRestart 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-regionshifts 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 ;: kindtext, minutes orh:mm:ss, offeredorg-timer-default-timer; on an entry with an effort Org takes it and nothing is asked). What Org says comes aswindow/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.dispatchorg-export-dispatch(C-c C-e), run by Emacs itself (theemacsoption; see "Emacs" below). Without an answer, a key input (promptExport command) whose choices are the options as Org's dispatcher shows them (\u0002C-bBody only: Off,\u0013C-sExport scope: Buffer,\u0006C-fForce publishing: Off: each answer turns one on or off and asks again), then the first keys of the menus of the backends Emacs has (hExport to HTML,l,t,o,c, and those of backends the configuration loads),PPublishandqExit. The context carries the options on as letters inanswers(b,s,f) and the menu instep(empty for the first). A backend's key asks for one of its entries (step its key, prompt its label,qback to the first menu);Pforf,p,x(then a project oforg-publish-project-alist, kindchoice, stepP:x) ora. 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'sid:links are, as the server finds them (org-id-add-location), and, with org-roam, of itsroamlink 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 withwindow/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 withwindow/showMessage. A yes-or-no question Emacs asks meanwhile (Evaluate this emacs-lisp code block on your system?) comes aswindow/showMessageRequestwithYesandNo.#asks for an options category (input kindchoice:defaultand the backends Emacs has;step#) and inserts its template at the cursor (org-export-insert-default-template, for the subtree withC-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 asorg-ctrl-c-ctrl-cdoes on a code block, a#+CALL:line,src_…{}orcall_…(): Emacs runsorg-ctrl-c-ctrl-cthere. The command returns at once; when Emacs is done, what it changed in the document comes asworkspace/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) withwindow/showMessageRequest; the languages are thoseorg-babel-load-languagesloads (set inemacs_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.toggleC-c C-cin a property drawer isorg-property-action: asks fors(set),d(delete),D(delete globally) orc(compute, refused: org-lsp has no column view), as kindkeywithstepaction, then goes on as those commands.C-c C-con 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 (ORDEREDentries 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:orDEADLINE:, in an Org file or on an agenda line (org-agenda-schedule,org-agenda-deadline). Changing a date the entry had is logged asorg_log_rescheduleandorg_log_redeadlinesay (and the file's#+STARTUP:words):Rescheduled from "[2026-05-20 Wed]" on [2026-05-18 Mon 10:30]withtime; withnote, 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.removeorg-scheduleandorg-deadlinewithC-u: the entry'sSCHEDULED:orDEADLINE:dates taken out (org-remove-timestamp-with-keyword), on an agenda line its entry's.Entry was not scheduledwhen it was not. Withorg_log_rescheduleororg_log_redeadlinethe removal is logged (Not scheduled, was "[…]" on […]).org.schedule.delay,org.deadline.warningorg-scheduleandorg-deadlinewithC-u C-u: ask for a day (Delay until,Warn starting from; input kinddate, 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 updatewhen 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.toggleorg-toggle-timestamp-overlays(C-c C-x C-t): the file's timestamps shown inorg_timestamp_custom_formats, or not, the other way fromorg_display_custom_timesand#+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_requestsoff). Run with no argument, it gives the question as a command'sinput, a key ofyorn; 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 asorg-cycle-levelchanges it: a child of the headline before, then each level up, then a sibling again; on an empty item, its indentation asorg-cycle-item-indentationchanges it, the same command again from where the last one left the cursor going on with that item's cycle (Cannot move itemwhere it cannot). The edit is carried in the result asorg.return's is. Both needorg_cycle_level_after_item_entry_creation. At the start of the file, withorg_cycle_global_at_boband 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 istrue(org_cycle_include_plain_listsintegrate). 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.calendarorg-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 acountabove 1, today). Its keys move it andorg.calendar.cancelcloses 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 kindkey: 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 asSPC. A TODO keyword comes with its look, to be shown in it asorg-fast-todo-selectionshows it:"highlight", the selector of its token (todoKeyword,todoKeyword.done), and"face"whenorg_todo_keyword_facesgives it one, as inorg-lsp/faces."completions": ["Owner", …]with kindtext: what may be typed, offered as it is typed (Emacs'scompleting-read); anything else may be typed too. An empty answer stands for the default the prompt shows in brackets (Property [Owner]); with"select": truethere is none, and a completion picked with nothing typed is the answer, as completion frameworks take it."complete": "file"or"directory"with kindtext: the answer is a file's or a directory's name, which the editor completes as it is typed (Emacs'sread-file-name,read-directory-name);"value"then starts with the directory of the Org file, as the minibuffer starts withdefault-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 (@, ororg-log-doneset tonote) is not made until the note's text comes: it asks with kindnote(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, asorg-store-log-notedoes. A client that announcesexperimental.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 withwindow/showDocument, which starts with# Insert note for state change from "TODO" to "WAIT".and has the cursor on its third line.org.capture.finishthere makes the change with the text below the comment lines as the note, andorg.capture.abortmakes it without any (Emacs'sC-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 (mode0600); 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.
editsmarks commands that change an Org file, for editors that can repeat the last change. A key appliesinOrg files (org), the agenda (agenda) or everywhere (global). There are two presets:emacshas Org's own keys in Emacs notation (C-c C-t,RET,v d),vimhas nvim-orgmode's defaults in Vim notation (cit,<CR>,vd). A key marked"native": truekeeps its own meaning where the command does not apply, such as<C-a>orS-<up>; seenotApplicableunder Commands. Avimkey with"mode": "insert"is typed in insert mode (<CR>oforg.return); the others in normal mode. One with"mode": "append"(<Leader><CR>oforg.meta.return) runs with"below": truein the context, and leaves the editor in insert mode where the command put the cursor. A command that asks for something hasinput(kindandprompt; see Commands). The context of a command with"clipboard": truecarries the editor's clipboard, one with"region": truethe selection, one with"folds": truethe closed folds (clipboard,rangeandfolded; 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.
standardtypes are LSP's own. highlights- How tokens should look by default.
tokenis a type, atype.modifier, or*.modifierfor any type.vimlists highlight groups, the first defined one to be used: the group nvim-orgmode colorschemes define, then a standard group.textmatelists scopes for editors whose themes match scopes, most specific first. A look that is a background in Org hasbackground,{ "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:
- The client runs
org.agenda.list. - The server sends
window/showDocumentwith the agenda's URI and, as the selection, the line of today's date. - The client opens the document, which makes it fetch the text.
When the view changes while the client has it open:
- The server sends
workspace/textDocumentContent/refresh. - The client fetches the text again and, since the document is open,
reports the change with
textDocument/didChange. - If the cursor is to move (the view went to another week, say), the
server sends
window/showDocumentwith 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.
- A command that asks for a date (
org.schedule…) opens the prompt withwindow/showDocumentand returns nothing. The client shows it as it likes (Neovim: a window at the bottom, VS Code: beside the file). - Its keys are the commands' keys
inthecalendarscope: 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.previewalso shows it in the minibuffer line.org.calendar.timepicks a time, which Emacs's calendar cannot: aTime: 10:00line appears above the minibuffer, and untilorg.calendar.timeagain, the day commands choose the hour (earlier) or the minutes (later) and the week commands move it (earlier up, later down; the minutes byorg_time_stamp_rounding_minutes, to a multiple of it first, asorg-timestamp-changemoves them). The time takes the place of a typed one, and stays when the keys go back to days. - 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:
| Org | Standard |
|---|---|
headline and stars, levels 1 to 8 (outline-1 …) | function, property, keyword, comment, type, enumMember, macro, string |
| TODO keyword, planning keyword | keyword |
| done keyword | string |
| priority, statistics cookie | number |
| tag | decorator |
| timestamp; inactive | enumMember; comment |
#+KEY:, block lines, comment, hidden text, archived | comment |
| drawer, LaTeX, entity, macro | macro |
| property key | property |
| bullet, checkbox, table delimiter | operator |
| link and its parts, target | namespace |
| table header | type |
| code, verbatim | string |
| footnote | parameter |
| struck-through text | variable 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#
| Type | Covers |
|---|---|
headline | The title text of a headline; levelN modifier |
stars | The stars of a headline; levelN modifier |
outline | Never sent: VS Code's org-lsp.headlineLevelColors turns headline and stars into it |
todoKeyword | A TODO keyword; done when it is a done state |
priority | A priority cookie, [#A] |
tag | The tags of a headline, :a:b:, as one token |
planning | SCHEDULED:, DEADLINE:, CLOSED:, CLOCK: and a headline's COMMENT |
timestamp | A timestamp or timestamp range; inactive for […] |
drawer | The :NAME: and :END: lines of a drawer |
property | The :KEY: of a property |
keyword | The #+KEY: of a keyword line |
block | The #+BEGIN… line, with its parameters, and the #+END… line |
comment | Comment lines and the contents of comment blocks |
bullet | A list bullet or counter |
checkbox | A checkbox; checked or partial |
link | The brackets of a bracket link, and its target where Org hides it; radio links; citations |
linkDescription | The description of a bracket link, [[target][description]] |
linkUrl | The 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 |
text | Plain text that carries emphasis modifiers |
tableDelimiter | Table borders and rule lines |
tableHeader | The cells of a table's header: the rows above its first rule, when rows follow it |
footnote | Footnote references and definition labels |
cookie | A statistics cookie, [1/3] |
target | <<target>> and <<<radio target>>> |
latex | LaTeX fragments |
latexEnvironment | A LaTeX environment, \begin{…} to \end{…} |
entity | An entity such as \alpha |
macro | {{{macro}}} |
documentTitle | The value of #+TITLE: (org-document-title) |
documentInfo | The 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:
| Type | Covers | Modifiers |
|---|---|---|
agendaStructure | The title line of a view | |
agendaDate | A date line | today, weekend |
agendaScheduled | A scheduled entry | today; past when scheduled before today |
agendaDeadline | An entry with a deadline | imminent when due or overdue, distant when far away |
agendaEvent | An entry with a plain timestamp | range inside a date range |
agendaDone | An entry that is done | |
agendaTimeGrid | A line of the time grid | current for the current time |
In the date prompt#
| Type | Covers | Modifiers |
|---|---|---|
calendarHeader | The month and year above a month | |
calendarWeekday | The name of a weekday above its column | weekend |
calendarSelected | The selected day; the hour or the minutes being picked | |
calendarPrompt | The prompt in the minibuffer line | |
timestamp | What the answer means |
Modifiers#
level1…level8- On
headlineandstars. Levels above eight wrap around. The looks ofoutline.level1…outline.level8are the colors ofoutline-1…outline-8without 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 completecookie([2/2],[100%]). inactive- On
timestamp. checked,partial- On
checkbox. bold,italic,underline,strikethrough- On
textandheadline. 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:
- Start
org-lspfororgfiles, and on demand for the agenda. - Apply the manifest: link the tokens to the editor's highlight names and bind the keys of its preset to the commands.
- Run commands with the cursor position as their argument.
- 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. - 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.