org.nvim

Dates and times

Timestamps:
  <2026-09-23 Wed>                  active (shows in the agenda)
  [2026-09-23 Wed]                  inactive
  <2026-09-23 Wed 10:00-11:30>      time range
  <2026-09-23 Wed>--<2026-09-25 Fri> date range
  <2026-09-23 Wed +1w -2d>          repeater and warning period
<prefix>s       Schedule (SCHEDULED:). A new date removes CLOSED.
<prefix>d       Deadline (DEADLINE:).
<prefix>i.      Insert an active timestamp (count: include time; count
                16: the current time without a prompt). Right after an
                existing timestamp, this creates a range.
<prefix>i!      Insert an inactive timestamp.
<C-a> / <C-x>   (ctx) Increment / decrement the part under the cursor, like
                Emacs org-timestamp-change: year, month, day, hour, minute,
                end time, repeater or warning. The cursor on the character
                right after a part (a -, : or space) changes that part.
                On a repeater or warning, the number never goes below 1
                (warning: 0) and the unit letter cycles d, w, m, y. Only
                +N repeaters and -N warnings are changed, like Emacs.
<S-Up/Down>     (ctx) Same as <C-a> / <C-x>. On minutes, step by the
                second value of time_stamp_rounding_minutes (5) and
                round to it; a count steps by exactly that many minutes.
                The end minute of a time range moves by 1. On a bracket,
                switch the timestamp between active and inactive. With
                edit_timestamp_down_means_later, <S-Down> is later and
                <S-Up> earlier.
<S-Right/Left>  (ctx) Day +1 / -1.
:Org toggle_timestamp_type   Switch the timestamp at the cursor between
                active and inactive (in a range, only that end).
<C-c><C-y>      Show the length of the range at the cursor, e.g. "2 days
                3 hours 30 minutes"; with a count, insert it after the
                range as  2d 03:30 ( 2d for dates,  00:20 under a
                day), replacing an earlier result (org-evaluate-time-range).
                <d 10:00-12:30> ranges work too (an extension).
<C-c><C-x><C-t> Toggle the custom display of timestamps
                (org-toggle-timestamp-overlays): each timestamp is shown as
                time_stamp_custom_formats (09/25/26 Fri) with conceal
                and inline virtual text, inside the brackets, like Emacs; a
                time-range end (-11:30) and a trailing repeater stay
                visible. display_custom_times = true or
                #+STARTUP: customtime turn it on; the real text shows in
                Insert mode (see 'concealcursor'). Timestamps in blocks,
                fixed-width lines, =verbatim=, ~code~ and #+KEYWORD:
                lines (except TITLE, SUBTITLE, AUTHOR, EMAIL, DATE) stay
                as typed, as in Emacs. The formats are Emacs
                format-time-string formats, the first for dates and the
                second for dates with a time, e.g.
                { "%A %d %B %Y", "%A %d %B %Y, %H:%M" }: %a %A %b %B %d
                %e %m %y %Y %H %I %M %p %j %u %w %U %V %W %G %F %R %T %z
                %Z ... with the flags - _ 0 ^ # and a width, in
                English on every system. Brackets around a format are
                dropped in the buffer and kept in exports. While the
                display is on in a buffer, exporting it writes its
                timestamps with the formats (org-timestamp-translate; a
                format without brackets exports without them).
<CR>            On a timestamp: open the agenda for that day.
The calendar
Date prompts open a floating calendar. It shows the month (with ‹ ›
around the title) as six weeks with ISO week numbers, so the days of the
neighbouring months fill the grid, dimmed. Weekends are tinted, today is
underlined and the selected day is highlighted. Below the grid are the
selected date in full, its timestamp and its distance from today ("in 3
days", "yesterday"), then the keys. With display_custom_times = true the
timestamp is shown in time_stamp_custom_formats (<09/27/26 Sun>, [...]
for an inactive timestamp), like the Emacs "=> ..." preview; as in Emacs,
a buffer's own toggle or #+STARTUP: customtime doesn't change it.
The keys:
  h l j k        day -1 / +1, week -1 / +1
  H L  < >       month -1 / +1
  J K  [ ]       year -1 / +1
  <C-v>  <M-v>   three months later / earlier: on today when it is within
                 a month of that month, else on its 1st (Emacs calendar)
  .              today
  i  t           type a date (see below); a date moved to in the calendar
                 is part of the answer, like Emacs. While typing, the
                 calendar shows the date the answer means ("=> <date>",
                 "(=>F)" when it was taken in the future), like the Emacs
                 overlay (read_date_display_live, default on)
  T              set a time
  !              show the agenda of the selected date (Emacs: the diary
                 entries); the windows come back when the prompt ends
  c              only in the calendar of :Org goto_calendar: close it and
                 show the agenda from the week of the date
                 (org-calendar-goto-agenda; the key is
                 calendar_to_agenda_key: "default" is c, false none)
  i              only in that calendar, when agenda.diary_entry_file is
                 an Org file: close it and add a diary entry for the date
                 there, as the agenda's i does
                 (calendar_insert_diary_entry_key,
                 org-calendar-insert-diary-entry-key); t still types a
                 date
  x  <Del>       remove the date (schedule/deadline)
  <CR>           select
  <LeftMouse>    select the day clicked (<MiddleMouse> too)
  q  <Esc>       cancel
With read_date_popup_calendar = false (org-read-date-popup-calendar, or
its alias popup_calendar_for_date_prompt) date prompts are a plain
"Date+time [2026-09-28]: " prompt instead; an empty answer takes the date
in brackets.
<C-c><          Insert the date the calendar was last left on (by a date
                prompt or :Org goto_calendar), today before that; on a
                timestamp, change only its date, keeping the time, repeater
                and warning (org-date-from-calendar).
A count of 4 (C-u) before the schedule/deadline key removes the date; a
count of 16 (C-u C-u) instead asks for a date and sets the warning period
(DEADLINE) or delay (SCHEDULED) to the days between it and the entry's
date, e.g. <2026-10-10 Sat -5d>. Other counts are ignored, like Emacs.
The colors are highlight groups linked to standard ones, so they follow
the colorscheme; override any of them with nvim_set_hl():
  OrgCalendarTitle     month and year        (Title)
  OrgCalendarArrow     ‹ ›                   (Special)
  OrgCalendarWeekday   Mo … Fr header        (Comment)
  OrgCalendarWeekendHeader  Sa Su header     (Constant)
  OrgCalendarDay       days of the month     (Normal)
  OrgCalendarWeekend   Saturdays, Sundays    (Constant)
  OrgCalendarOutside   other months' days    (NonText)
  OrgCalendarWeekNumber  ISO week numbers    (LineNr)
  OrgCalendarToday     today                 (bold, underline)
  OrgCalendarSelected  the selected day      (PmenuSel)
  OrgCalendarDate      the date in full      (Function)
  OrgCalendarTimestamp its timestamp         (String)
  OrgCalendarRelative  "in 3 days"           (Comment)
  OrgCalendarSeparator rules                 (FloatBorder)
  OrgCalendarKey       keys of the hints     (Special)
  OrgCalendarHint      their descriptions    (Comment)
Date input (like org-read-date)
The typed text is read like Emacs org-read-date-analyze:
  ""                   the default date (the date being changed, or today)
  "."  "+0"            today
  +3d  -2w  +1m  +4    relative to today (unit defaults to days)
  +2h                  two hours from now
  ++3d  --1w           relative to the default date
  fri  +2fri  -mon     next Friday (a weekday name is never today) / in two
                       weeks / last Monday
  2026-10-01  26-10-01  10-01  10/1  10/1/2026   absolute dates
  2026-10-01 Thu +1w   extra words (a pasted timestamp) are ignored
  15                   the 15th, this month or the next
  15.3.  15.3.2027     dotted day.month[.year]
  oct  sep 15  15 sep 2027  2027   month names, a year alone
  w39  2026-w39-5  w39 fri   ISO week (and weekday, default Monday)
  14:00  2pm  15h30  24:00   times (combine with any date); 24:00 is the
                       next day
  10:00-11:30  10am-11am  10:00+1:30   time ranges
  2026-10-01T10:00     ISO date and time
  today tomorrow yesterday now   (extensions; Emacs ignores these words)
Dates out of range roll over (feb 30 is March 2nd). With
read_date_prefer_future (default), a day or month without a year is taken
in the future: 15 on the 20th is the 15th of next month; "time" also
moves a past time of today to tomorrow; false completes the date from the
default instead. Before extend_today_until o'clock the default is still
yesterday. Text that cannot be read at all is refused with a warning (Emacs
silently uses the default date).

Changes to SCHEDULED and DEADLINE are logged when log_reschedule or log_redeadline is set (or via the #+STARTUP log keywords); setting the same date again is not logged.