Keys in Neovim
The plugin keeps no list of keys of its own. When the server starts, it
announces its commands with their default keys (org-lsp manifest prints
them), and the plugin binds the keys of the vim preset, which are
nvim-orgmode's defaults. Keys for Org files, the agenda, the date prompt
and capture buffers are local to those buffers; the keys listed under
Anywhere are global.
g? shows the keys of the buffer at hand, and :nmap <buffer> in an Org
buffer lists what is bound there, each key described by the title of its
command. neovim.org says how to install and set up the plugin.
The keys#
Anywhere#
| Keys | Command | What it does |
|---|---|---|
<Leader>oa | org.agenda.dispatch | Agenda commands |
<Leader>oxj | org.clock.goto | Go to the clocked entry |
<Leader>oc | org.capture | Capture |
<Leader>jj | org.journal.new.entry | Journal: new entry |
In Org files#
| Keys | Command | What it does |
|---|---|---|
<Leader>oxi | org.clock.in | Clock in |
<Leader>oxx | org.clock.in.last | Clock in the last clocked task |
<Leader>oxz | org.clock.resolve | Resolve open clocks |
<Leader>oxo | org.clock.out | Clock out |
<Leader>oxq | org.clock.cancel | Cancel the clock |
<Leader>oxd | org.clock.display | Show the time clocked under each headline |
<Leader>oxr | org.clock.report | Insert or update a clock table |
<Leader>oxu | org.dblock.update | Update the dynamic block |
<Leader>oix | org.dblock.insert | Insert a dynamic block |
<Leader>oxa | org.attach | Attachments of the entry |
cit | org.todo | Change the TODO state |
ciT | org.todo.previous | Cycle TODO state backward |
ciR | org.priority.up | Raise the priority |
cir | org.priority.down | Lower the priority |
<Leader>o, | org.priority | Set the priority |
<Leader>oxp | org.property.set | Set a property of the entry |
<Leader>oxe | org.effort.set | Set the effort of the entry |
<Leader>oxE | org.effort.increase | Set the effort to the next allowed value |
<Leader>oic | org.cite.insert | Insert a citation, or edit the one at the cursor |
<Leader>oiC | org.cite.insert.prefix | Delete the citation or reference at the cursor, or insert one with a style |
<Leader>ot | org.tags.set | Set the tags of the headline |
<C-Space> | org.checkbox.toggle | Toggle the checkbox |
<CR> ¹ (insert mode) | org.return | New line, as Org's RET makes it |
<S-CR> ¹ (insert mode) | org.return.item | New line; on a list item, the next item |
<Leader><CR> | org.meta.return | New heading, item or table row |
<Leader>oiT | org.insert.todo.heading | New TODO heading, or item with a checkbox |
<Leader>oih | org.insert.heading.after | New heading after the subtree |
<Leader>oit | org.insert.todo.heading.after | New TODO heading after the subtree |
<Leader>oiI | org.inlinetask.insert | Insert an inline task |
<< ¹ | org.meta.left | Promote the heading; outdent the item; move the table column left |
>> ¹ | org.meta.right | Demote the heading; indent the item, the drawer or the block; move the table column right |
<s | org.shiftmeta.left | Promote the subtree; outdent the item with its children; delete the table column |
>s | org.shiftmeta.right | Demote the subtree; indent the item with its children; insert a table column |
<Leader>oK | org.meta.up | Move the subtree, the item or the table row up |
<Leader>oJ | org.meta.down | Move the subtree, the item or the table row down |
<Leader>oTd | org.shiftmeta.up | Delete the table row |
<Leader>oTO | org.shiftmeta.down | Insert a table row above |
<Leader>oTo | org.table.insert.row.below | Insert a table row below |
<Leader>o- | org.table.hline | Insert a rule below the table row |
<Leader>o<CR> | org.table.hline.move | Insert a rule below the table row and go below it |
<Leader>o<Space> | org.table.blank.field | Blank the table field |
<Leader>o^ | org.sort | Sort the entries, the items or the table rows |
<Leader>o/ | org.sparse.tree | Show a sparse tree |
<Leader>oR | org.reveal | Show the context of the cursor |
<Leader>osd | org.cut.subtree | Cut the subtree |
<Leader>osy | org.copy.subtree | Copy the subtree |
<Leader>osp | org.paste.subtree | Paste the subtree |
<Leader>or | org.refile | Refile the entry |
<Leader>oy | org.refile.copy | Copy the entry to a refile target |
<Leader>ona | org.add.note | Add a note to the entry |
<Leader>obt | org.babel.tangle | Tangle the file's code blocks |
<Leader>obd | org.babel.detangle | Put the code of a tangled file back into its blocks |
<Leader>obe | org.babel.execute | Evaluate the code block or call at the cursor through Emacs |
<Leader>obb | org.babel.execute.buffer | Evaluate the file's code blocks through Emacs |
<Leader>obs | org.babel.execute.subtree | Evaluate the subtree's code blocks through Emacs |
<Leader>obk | org.babel.remove_result | Remove the results of the code block at the cursor |
} | org.heading.next | Move to the next heading |
{ | org.heading.previous | Move to the previous heading |
]] | org.heading.forward | Move to the next heading of the same level |
[[ | org.heading.backward | Move to the previous heading of the same level |
g{ | org.heading.up | Move to the parent heading |
]l | org.link.next | Move to the next link |
[l | org.link.previous | Move to the previous link |
<Leader>oj | org.goto | Go to a heading of the file |
<Leader>of | org.footnote.action | Make a footnote, or go between a footnote and its definition |
<Leader>oF | org.footnote.menu | Sort, renumber, normalize or delete footnotes |
<Leader>o; | org.toggle.comment | Toggle the COMMENT keyword of the heading |
<Leader>oie | org.emphasize | Insert emphasis markers |
<Leader>oib | org.structure.template | Insert a block (structure template) |
<Leader>oiD | org.drawer.insert | Insert a drawer |
<Leader>osc | org.subtree.clone | Clone the subtree, shifting its dates |
<Leader>oD | org.table.copy.down | Copy the field down to the next row |
<Leader>o+ | org.table.sum | Sum the numbers of the table column |
<Leader>o? | org.table.field.info | Show the references of the table field |
<Leader>oi<Bar> | org.table.create | Insert an empty table |
<Leader>opg | org.plot.gnuplot | Plot the table with gnuplot |
<Leader>opa | org.table.ascii.plot | Draw the column at the cursor as bars |
<Leader>obn | org.babel.next | Move to the next code block |
<Leader>obp | org.babel.previous | Move to the previous code block |
<Leader>obg | org.babel.goto | Go to a named code block |
<Leader>obi | org.babel.lob.ingest | Add the file's named code blocks to the Library of Babel |
<Leader>o' | org.edit.special | Edit the block in a file of its own |
<Leader>ons | org.narrow.subtree | Narrow to the subtree: it in a file of its own |
<Leader>onb | org.narrow.block | Narrow to the block: it in a file of its own |
<Leader>onw | org.narrow.widen | Widen: the narrowed file written back and closed |
<Leader>oxb | org.tree.indirect | Show the subtree in a file of its own |
<Leader>o` | org.table.edit.field | Edit the table field in a file of its own |
<Leader>oxc | org.columns | Column view |
<Leader>oxv | org.link.preview | Preview the images of links |
<Leader>oxl | org.latex.preview | Preview LaTeX fragments |
<Leader>ox0 | org.timer.start | Start the relative timer |
<Leader>ox. | org.timer.insert | Insert the timer's value |
<Leader>ox- | org.timer.item | Insert a list item with the timer's value |
<Leader>ox, | org.timer.pause | Pause or continue the timer |
<Leader>ox_ | org.timer.stop | Stop the timer |
<Leader>ox; | org.timer.set | Set a countdown timer |
<Leader>oe | org.export.dispatch | Export the file through Emacs |
<Leader>o<Tab> | org.table.toggle.column.width | Shrink or expand the table column |
<Leader>o* | org.table.recalculate | Recalculate the table |
<Leader>o{ | org.table.formula.debugger | Turn the formula debugger on or off |
<Leader>oo | org.open | Open the link or thing at the cursor |
<Leader>ols | org.link.store | Store a link to the place at the cursor |
<Leader>oli | org.link.insert | Insert a link, or edit the one at the cursor |
<Leader>o$ | org.archive.subtree | Archive the subtree |
<Leader>oxA | org.archive.sibling | Archive the subtree under its Archive sibling |
<Leader>oA | org.archive.tag | Toggle the ARCHIVE tag |
<Leader>nf | org.roam.node.find | Roam: find a node |
<Leader>ni | org.roam.node.insert | Roam: insert a link to a node |
<Leader>nc | org.roam.capture | Roam: capture to a node |
<Leader>ndn | org.roam.dailies.capture.today | Roam: capture to today's daily note |
<Leader>ndd | org.roam.dailies.goto.today | Roam: go to today's daily note |
<Leader>ndt | org.roam.dailies.goto.tomorrow | Roam: go to tomorrow's daily note |
<Leader>ndy | org.roam.dailies.goto.yesterday | Roam: go to yesterday's daily note |
<Leader>ndv | org.roam.dailies.capture.date | Roam: capture to the daily note of a date |
<Leader>ndc | org.roam.dailies.goto.date | Roam: go to the daily note of a date |
<Leader>ndf | org.roam.dailies.goto.next | Roam: go to the next daily note |
<Leader>ndb | org.roam.dailies.goto.previous | Roam: go to the previous daily note |
<Leader>nd. | org.roam.dailies.find.directory | Roam: open the directory of the daily notes |
<Leader>nl | org.roam.buffer.toggle | Roam: show or hide the org-roam buffer |
<Leader>jf | org.journal.next.entry | Journal: next entry |
<Leader>jb | org.journal.previous.entry | Journal: previous entry |
<Leader>js | org.journal.search | Journal: search between two dates |
<C-a> ¹ | org.timestamp.up | Increase the part of the timestamp at the cursor |
<C-x> ¹ | org.timestamp.down | Decrease the part of the timestamp at the cursor |
<S-Up> ¹ | org.date.later | Move the date one day later |
<S-Down> ¹ | org.date.earlier | Move the date one day earlier |
<S-Left> ¹ | org.shift.left | Move the date a day earlier, or cycle the TODO state or the list's bullets backward |
<S-Right> ¹ | org.shift.right | Move the date a day later, or cycle the TODO state or the list's bullets forward |
<Leader>ois | org.schedule | Schedule the entry |
<Leader>oid | org.deadline | Set the deadline of the entry |
<Leader>oi. | org.timestamp.insert | Insert or change a timestamp |
<Leader>oi! | org.timestamp.insert.inactive | Insert or change an inactive timestamp |
cid | org.timestamp.change | Change the timestamp at the cursor |
<Leader>o> | org.goto.calendar | Show the calendar at the date of the line |
In a capture buffer#
| Keys | Command | What it does |
|---|---|---|
<C-c> | org.capture.finish | Capture: finish |
<Leader>ok | org.capture.abort | Capture: abort |
<Leader>or | org.capture.refile | Capture: refile the entry |
In the agenda#
| Keys | Command | What it does |
|---|---|---|
f | org.agenda.later | Agenda: go forward in time |
b | org.agenda.earlier | Agenda: go backward in time |
. | org.agenda.today | Agenda: go to today |
[ | org.agenda.query.add | Agenda: search for another word, or show inactive timestamps |
] | org.agenda.query.subtract | Agenda: search without a word, or show inactive timestamps |
{ | org.agenda.query.add.regexp | Agenda: search for another regexp, or show inactive timestamps |
} | org.agenda.query.subtract.regexp | Agenda: search without a regexp, or show inactive timestamps |
J | org.agenda.goto.date | Agenda: go to a date |
vd | org.agenda.day | Agenda: day view |
vw | org.agenda.week | Agenda: week view |
vt | org.agenda.fortnight | Agenda: fortnight view |
vm | org.agenda.month | Agenda: month view |
vy | org.agenda.year | Agenda: year view |
r | org.agenda.redo | Agenda: rebuild |
<CR> | org.agenda.goto | Agenda: go to the entry |
<Tab> | org.agenda.goto.other | Agenda: go to the entry in another window |
s, <C-x><C-s> | org.agenda.save | Save all Org files |
vl | org.agenda.log | Agenda: log mode, what was closed and clocked |
<C-x><C-w> | org.agenda.write | Agenda: write it to a file |
<C-c><C-x><C-c> | org.agenda.columns | Agenda: column view |
R, vR | org.agenda.clockreport | Agenda: the clock report |
E, vE | org.agenda.entry.text | Agenda: entry text mode, some text of each entry under its line |
F | org.agenda.follow | Agenda: follow mode, the cursor's entry in another window |
m | org.agenda.bulk.mark | Agenda: mark the entry for a bulk action |
u | org.agenda.bulk.unmark | Agenda: unmark the entry |
U | org.agenda.bulk.unmark.all | Agenda: unmark all entries |
<M-m> | org.agenda.bulk.toggle | Agenda: toggle the mark of the entry |
* | org.agenda.bulk.mark.all | Agenda: mark all entries |
<M-*> | org.agenda.bulk.toggle.all | Agenda: toggle the marks of all entries |
% | org.agenda.bulk.mark.regexp | Agenda: mark the entries matching a regexp |
B | org.agenda.bulk.action | Agenda: an action on the marked entries |
/ | org.agenda.filter | Agenda: filter by tags, categories, effort and regexps |
\ | org.agenda.filter.tag | Agenda: filter by tag |
< | org.agenda.filter.category | Agenda: filter by the line's category |
= | org.agenda.filter.regexp | Agenda: filter by a regexp |
_ | org.agenda.filter.effort | Agenda: filter by effort |
^ | org.agenda.filter.top.headline | Agenda: filter by the line's top headline |
¦ | org.agenda.filter.remove | Agenda: remove all filters |
va | org.agenda.archives | Agenda: include archived trees |
v[ | org.agenda.inactive | Agenda: show inactive timestamps once |
vA | org.agenda.archives.files | Agenda: include archived trees and archive files |
I, <Leader>oxi | org.clock.in | Clock in |
O, <Leader>oxo | org.clock.out | Clock out |
X, <Leader>oxq | org.clock.cancel | Cancel the clock |
t | org.todo | Change the TODO state |
<C-S-Right> | org.todo.nextset | Switch to the next TODO keyword set |
<C-S-Left> | org.todo.previousset | Switch to the previous TODO keyword set |
+, <S-Up> | org.priority.up | Raise the priority |
-, <S-Down> | org.priority.down | Lower the priority |
,, <Leader>o, | org.priority | Set the priority |
<C-c><C-x>p, <Leader>oxp | org.property.set | Set a property of the entry |
e, <Leader>oxe | org.effort.set | Set the effort of the entry |
<C-c><C-q>, <Leader>ot | org.tags.set | Set the tags of the headline |
<C-c><C-w>, <Leader>or | org.refile | Refile the entry |
z, <Leader>ona | org.add.note | Add a note to the entry |
<C-c><C-o>, <Leader>oo | org.open | Open the link or thing at the cursor |
<C-c>l, <Leader>ols | org.link.store | Store a link to the place at the cursor |
<C-c><C-x><C-s>, <C-c>$, <Leader>o$ | org.archive.subtree | Archive the subtree |
<C-c><C-x>A, <Leader>oxA | org.archive.sibling | Archive the subtree under its Archive sibling |
<C-c><C-x>a, <Leader>oA | org.archive.tag | Toggle the ARCHIVE tag |
<C-c><C-x><C-a> | org.archive.default | Archive with the default command |
a | org.archive.confirm | Archive with the default command, once confirmed |
<S-Right> | org.date.later | Move the date one day later |
<S-Left> | org.date.earlier | Move the date one day earlier |
<C-c><C-s>, <Leader>ois | org.schedule | Schedule the entry |
<C-c><C-d>, <Leader>oid | org.deadline | Set the deadline of the entry |
¦ stands for |, which an Org table cannot hold.
In the date prompt#
| Keys | Command | What it does |
|---|---|---|
<Leader>jn | org.journal.new.date.entry | Journal: new entry for a date |
] | org.journal.next.entry | Journal: next entry |
[ | org.journal.previous.entry | Journal: previous entry |
<Leader>jsf | org.journal.search.forever | Journal: search every entry |
<Leader>jsF | org.journal.search.future | Journal: search the entries to come |
<Leader>jsw | org.journal.search.calendar.week | Journal: search the calendar's week |
<Leader>jsm | org.journal.search.calendar.month | Journal: search the calendar's month |
<Leader>jsy | org.journal.search.calendar.year | Journal: search the calendar's year |
<Leader>jr | org.journal.read.entry | Journal: the entry of the calendar's day |
<Leader>jd | org.journal.display.entry | Journal: show the entry of the calendar's day |
<Leader>jm | org.journal.mark.entries | Journal: mark the days with an entry in the calendar |
l, <S-Right> | org.calendar.day.later | Date prompt: one day later |
h, <S-Left> | org.calendar.day.earlier | Date prompt: one day earlier |
j, <S-Down> | org.calendar.week.later | Date prompt: one week later |
k, <S-Up> | org.calendar.week.earlier | Date prompt: one week earlier |
<M-S-Right> | org.calendar.month.later | Date prompt: one month later |
<M-S-Left> | org.calendar.month.earlier | Date prompt: one month earlier |
<M-S-Down> | org.calendar.year.later | Date prompt: one year later |
<M-S-Up> | org.calendar.year.earlier | Date prompt: one year earlier |
> | org.calendar.scroll.later | Date prompt: show the next months |
< | org.calendar.scroll.earlier | Date prompt: show the previous months |
. | org.calendar.today | Date prompt: go to today |
<CR> | org.calendar.select | Date prompt: take the day at the cursor |
i | org.calendar.type | Date prompt: type the date |
t | org.calendar.time | Date prompt: pick the time, or go back to the day |
q, <Esc> | org.calendar.cancel | Date prompt: cancel |
In column view#
| Keys | Command | What it does |
|---|---|---|
q | org.columns.quit | Column view: quit |
r | org.columns.redo | Column view: recompute |
e | org.columns.edit | Column view: edit the value |
n, <S-Right> | org.columns.next | Column view: the next allowed value |
p, <S-Left> | org.columns.previous | Column view: the previous allowed value |
v | org.columns.show | Column view: show the value |
a | org.columns.allowed | Column view: edit the allowed values |
t | org.columns.todo | Column view: change the TODO state |
<CR> | org.columns.toggle | Column view: toggle a checkbox, or quit |
<M-Left> | org.columns.move.left | Column view: move the column left |
<M-Right> | org.columns.move.right | Column view: move the column right |
<M-S-Left> | org.columns.delete | Column view: delete the column |
< | org.columns.narrow | Column view: make the column narrower |
> | org.columns.widen | Column view: make the column wider |
<M-Up> | org.columns.row.up | Column view: move the entry up |
<M-Down> | org.columns.row.down | Column view: move the entry down |
Without a default key#
| Command | What it does |
|---|---|
org.agenda.list | Agenda for the current week or day |
org.agenda.todos | List of all TODO entries |
org.agenda.habits | Agenda: show or hide habits |
org.agenda.appt | Add today's appointments from the agenda files |
org.num.mode | Number the headlines, or stop numbering them |
org.indent.mode | Indent the text by the level of its headline, or stop indenting it |
org.custom.properties.toggle | Hide the properties of org_custom_properties, or show them again |
org.version | Show the version of the server |
org.todo.yesterday | Change the TODO state as if it were yesterday |
org.todo.next | Cycle TODO state forward |
org.property.delete | Delete a property of the entry |
org.property.delete.globally | Delete a property from every entry of the file |
org.ordered.toggle | Toggle whether subtasks must be done in order (ORDERED) |
org.bibtex.export | BibTeX: export the entries of the file to a .bib file |
org.bibtex.copy | BibTeX: copy the entry at the cursor as BibTeX |
org.bibtex.create | BibTeX: new entry, its fields asked for |
org.bibtex.create.here | BibTeX: make the entry at the cursor a BibTeX entry |
org.bibtex.check | BibTeX: ask for the fields the entry at the cursor lacks |
org.bibtex.check.all | BibTeX: ask for the fields every entry lacks |
org.bibtex.yank | BibTeX: paste a BibTeX entry as a heading |
org.bibtex.import | BibTeX: import the entries of a BibTeX file as headings |
org.ctags.create | Ctags: make the TAGS file of the file's directory |
org.ctags.find | Ctags: go to a topic, or make it |
org.inlinetask.insert.nostate | Insert an inline task without its default TODO state |
org.levels.odd | Convert the file to odd levels only, once confirmed |
org.levels.oddeven | Convert the file from odd levels to odd and even ones, once confirmed |
org.open.line | Open a line, or in a table insert a row |
org.outline.path | Show the outline path of the entry at the cursor |
org.table.next.field | Go to the next table field, making a row after the last |
org.table.previous.field | Go to the previous table field |
org.table.hline.above | Insert a rule above the table row |
org.reveal.siblings | Show the context of the cursor, each level with its children |
org.reveal.tree | Show the whole tree of the cursor's parent |
org.yank | Yank, a subtree at its level |
org.refile.goto | Go to a refile target |
org.refile.goto.last | Go to where the last refile put its entry |
org.beginning.of.line | Move to the start of the headline's title |
org.end.of.line | Move to the end of the headline's title |
org.kill.line | Kill the headline's text to the tags, or the tags |
org.toggle.item | Turn the line into an item, or the item into a line |
org.toggle.heading | Turn the line into a heading, or the heading into a line |
org.table.import | Import a file as a table |
org.table.export | Export the table to a file |
org.block.next | Move to the next block |
org.block.previous | Move to the previous block |
org.crypt.encrypt | Encrypt the entry |
org.crypt.decrypt | Decrypt the entry |
org.crypt.encrypt.all | Encrypt the entries tagged crypt |
org.crypt.decrypt.all | Decrypt the encrypted entries |
org.table.recalculate.line | Recalculate the table's current line |
org.table.iterate | Recalculate the table until it does not change |
org.link.insert.last | Insert the last stored link |
org.link.insert.all | Insert all stored links |
org.id.create | Create an ID for the entry |
org.archive.done | Archive the subtrees without open TODO items |
org.archive.tag.done | Tag the subtrees without open TODO items as archived |
org.roam.node.random | Roam: visit a random node |
org.roam.dailies.capture.tomorrow | Roam: capture to tomorrow's daily note |
org.roam.dailies.capture.yesterday | Roam: capture to yesterday's daily note |
org.roam.buffer.dedicated | Roam: show the org-roam buffer of a node |
org.roam.buffer.refresh | Roam: refresh the org-roam buffer |
org.roam.alias.add | Roam: add an alias |
org.roam.alias.remove | Roam: remove an alias |
org.roam.tag.add | Roam: add tags |
org.roam.tag.remove | Roam: remove tags |
org.roam.ref.add | Roam: add a reference |
org.roam.ref.remove | Roam: remove a reference |
org.roam.ref.find | Roam: find a node by a reference |
org.roam.promote | Roam: make the file's one top headline the file's node |
org.roam.demote | Roam: make the file's node a headline of its own |
org.roam.refile | Roam: refile to a node |
org.roam.extract | Roam: extract the subtree to a file of its own |
org.roam.graph | Roam: show the graph of the nodes |
org.journal.new.scheduled.entry | Journal: new entry for a day to come |
org.journal.open.current | Journal: open the current file |
org.journal.search.future.scheduled | Journal: the TODO entries to come |
org.journal.schedule.view | Journal: the entries to come with a date |
org.journal.reschedule | Journal: move the entry to come to another day |
org.date.later.hours | Agenda: move the time one hour later |
org.date.earlier.hours | Agenda: move the time one hour earlier |
org.date.later.minutes | Agenda: move the time later by the rounding minutes |
org.date.earlier.minutes | Agenda: move the time earlier by the rounding minutes |
org.shift.up | Increase the timestamp part, raise the priority, or go to the previous item |
org.shift.down | Decrease the timestamp part, lower the priority, or go to the next item |
org.schedule.remove | Remove the scheduled date of the entry |
org.deadline.remove | Remove the deadline of the entry |
org.schedule.delay | Delay the scheduled date until a day |
org.deadline.warning | Warn of the deadline from a day |
org.timestamp.overlays.toggle | Show timestamps in the custom formats, or not |
¹ Where the command does not apply, the key does what it does in any
buffer: <C-a> off a timestamp still increments the number under the
cursor, <S-Right> off a timestamp goes a word right (and on a
headline or an item too, as org_support_shift_select says), and
<CR> in a source block's code is Vim's own.
The plugin's own keys#
The plugin adds keys of its own, which only an editor can carry out:
| Keys | Name in mappings | Scope | What it does |
|---|---|---|---|
<Tab> | cycle | org | Cycle the visibility of the subtree at the cursor |
<S-Tab> | global_cycle | org | Cycle the visibility of the whole file |
q | quit | agenda | Close the agenda |
| none | hover | agenda | Show the entry of the line in a float, highlighted |
g? | help | org, agenda | Show the keys of the buffer in a window (q closes it) |
In the agenda, Neovim's own K (vim.lsp.buf.hover()) shows the entry
of the line, highlighted as Org files are: the plugin makes the hover's
float an Org buffer of the server's. Emacs's K (org.agenda.habits) has
no key there; hover maps the plugin's own float to another key.
A capture buffer is an Org file, so it has the keys of Org files as well as
its own; there <Leader>or refiles the captured entry rather than the
subtree at the cursor.
How they behave#
- Counts work as in Vim:
3<C-a>adds three to the part of the timestamp under the cursor,2<S-Right>moves an agenda entry two days. - Repeat: every key in Org files changes the text, and
.repeats the last of them, with a new count if you type one (.,3.). A command that asks for something asks again. - In Visual mode the keys of the commands Org gives a region work on the
selection, as Emacs's on its active region:
>>and<<demote and promote the headlines selected (or indent and outdent the items),<Leader>o*and<Leader>o-turn the lines into headings and items,<C-Space>toggles the checkboxes,<Leader>oi<Bar>makes a table of them,<Leader>oiband<Leader>oiDwrap them in a block or a drawer;<Leader>orrefiles the subtrees selected,<Leader>olsstores a link that searches for the text selected and<Leader>olimakes it the description of a link. - Keys with a meaning of their own (marked ¹) give it back where the
command does not apply, so
<C-a>,<C-x>,<S-Up>and<S-Down>still work on ordinary numbers and lines. - RET and a completion menu: while one is open (Vim's, nvim-cmp's or
blink.cmp's),
<CR>is the menu's;<S-CR>closes it and runs its command. <S-CR>is RET that continues lists: on the line of a list item's bullet it makes the next item, numbered and with a checkbox as M-RET makes it, and elsewhere it is Org's RET.<CR>does that too withreturn_uses_meta_return.<Leader><CR>and its neighbours put the new heading, item or table row below the cursor's line, wherever on it the cursor is: never above it, and nothing is split. Typing goes on in insert mode.Kin the agenda shows the line's entry in a float at the cursor: its headline and its text, each drawer folded to its first line, highlighted as Org files are. A secondKgoes into the float,qthere closes it, and moving the cursor closes it too.cidleaves the cursor where it was in the timestamp it changes, and a date asked for in the calendar goes back to the window it was asked from.- Questions are asked in the editor's own way:
- a date (
<Leader>ois,Jin the agenda) opens Emacs's calendar, with the keys under In the date prompt;ithere asks for the date as text withvim.ui.input, read as Org reads it (fri 10:00,+2d,2/15);tthere picks a time: aTime:line shows it,handlchoose the hour or the minutes,kandjmove it up or down (the minutes byorg_time_stamp_rounding_minutes), andtagain goes back to the days, keeping the time; - one key (a TODO keyword with a key, as
TODO(t), a capture template, or a view in the agenda menu) is read as soon as it is typed, with the choices listed in a window at the bottom;<Esc>gives up; - a choice from a list (refile targets) goes through
vim.ui.select, so a picker plugin that replaces it is used; - text (a capture prompt) goes through
vim.ui.input; - a state note (a keyword with
@, asWAIT(w@)) is written in a note buffer that opens like a capture buffer, as Emacs's*Org Note*:<C-c>stores it,<Leader>okchanges the state without it.
- a date (
- Messages: what Emacs says when a command is done (Priority of current
item set to B, Scheduled to ) goes through
vim.notify, and so do commands' errors (No timestamp at the cursor). - Capture buffers open in insert mode, where the template's
%?was.
Changing them#
Keys are set with mappings, in setup() or in vim.g.org_lsp before the
plugin loads. It has one table per scope: global, org, agenda,
calendar, capture and columns. In a scope, a command (the second
column above, or one of the plugin's own names) maps to:
- a key, which takes the place of the command's default keys;
- a list of keys, to have more than one;
false, to leave the command without a key.
Commands that are not listed keep their default keys.
require('org-lsp').setup({
mappings = {
-- Org's own key for the agenda, and a key for the TODO list.
global = { ['org.agenda.dispatch'] = '<Leader>a', ['org.agenda.todos'] = '<Leader>oT' },
org = {
['org.todo'] = { 'cit', '<Leader>ot' }, -- two keys
['org.todo.next'] = '<C-n>', -- a command without a default key
['org.todo.previous'] = false, -- no key
['org.shift.right'] = '<S-Right>', -- Org's S-<right>: date or TODO state
['org.shift.left'] = '<S-Left>',
global_cycle = '<Leader><Tab>', -- the plugin's own command
},
agenda = { ['org.agenda.goto.date'] = 'gd', quit = { 'q', '<Esc>' } },
},
})To set no keys in one scope, give false for the scope; the plugin's own
keys in it go too. To set no keys at all, give false for mappings:
vim.g.org_lsp = { mappings = { org = false } } -- nothing in Org files
vim.g.org_lsp = { mappings = false } -- nothing anywhereCalling setup() again changes the keys of buffers opened after it, and the
global ones at once.
Your own keys#
Any command can be run from a key of your own with
require('org-lsp').run, which tells the server where the cursor is:
vim.api.nvim_create_autocmd('FileType', {
pattern = 'org',
callback = function(args)
vim.keymap.set('n', '<M-Right>', function()
require('org-lsp').run('org.shift.right', { count = vim.v.count })
end, { buffer = args.buf, desc = 'Org: date later or next TODO state' })
end,
})Keys set this way are not repeated by .; keys set through mappings are.
run also takes the plugin's own names (cycle, global_cycle, quit,
hover).
From the command line#
:Org runs a command by its name without the org. prefix, with
completion: :Org todo.next, :Org agenda.todos. Words separated by spaces
are joined with dots, so :Org agenda todos works as well, and a group on
its own runs its dispatcher: :Org agenda.
The editing commands are also code actions, so vim.lsp.buf.code_action()
(gra) lists those that apply at the cursor.