== doing - A CLI for a What Was I Doing system

Doing uses a TaskPaper-like formatting to keep a plain text
record of what you've been doing, complete with tag-based time tracking. The
command line tool allows you to add entries, annotate with tags and notes, and
view your entries with myriad options, with a focus on a "natural" language syntax.

v2.1.10

=== Global Options
=== --config_file arg

Use a specific configuration file. Deprecated, set $DOING_CONFIG instead.

[Default Value] /Users/ttscoff/.config/doing/config.yml


=== -f|--doing_file arg

Specify a different doing_file

[Default Value] None


=== --[no-]color
Colored output



=== --debug
Verbose output



=== --[no-]default
Answer yes/no menus with default option



=== --help
Show this message



=== --no
Answer all yes/no menus with no



=== --[no-]notes
Output notes if included in the template



=== -p|--[no-]pager
Use a pager when output is longer than screen



=== -q|--quiet
Silence info messages



=== --stdout
Send results report to STDOUT instead of STDERR



=== --version
Display the program version



=== -x|--noauto
Exclude auto tags and default tags



=== --yes
Answer all yes/no menus with yes



=== Commands
==== Command: <tt>add_section  SECTION_NAME</tt>
Add a new section to the "doing" file


==== Command: <tt>again|resume </tt>
Repeat last entry as new entry

This command is designed to allow multiple time intervals to be created for an entry by duplicating it with a new start (and end, eventually) time.
===== Options
===== --bool BOOLEAN

Boolean used to combine multiple tags. Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== --in SECTION_NAME

Add new entry to section (default: same section as repeated entry)

[Default Value] None


===== -n|--note TEXT

Note

[Default Value] None


===== -s|--section NAME

Get last entry from a specific section

[Default Value] All


===== --search QUERY

Repeat last entry matching search. Surround with
  slashes for regex (e.g. "/query/"), start with a single quote for exact match ("'query").

[Default Value] None


===== --tag TAG

Repeat last entry matching tags. Combine multiple tags with a comma. Wildcards allowed (*, ?).

[Default Value] None


===== -e|--editor
Edit duplicated entry with vim before adding



===== -i|--interactive
Select item to resume from a menu of matching entries



===== --not
Resume items that *don't* match search/tag filters



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>archive|move  SECTION_OR_TAG</tt>
Move entries between sections

Argument can be a section name to move all entries from a section,
or start with an "@" to move entries matching a tag.

Default with no argument moves items from the "Currently" section to Archive.
===== Options
===== --before DATE_STRING

Archive entries older than date
    (Flexible date format, e.g. 1/27/2021, 2020-07-19, or Monday 3pm)

[Default Value] None


===== --bool BOOLEAN

Tag boolean (AND|OR|NOT). Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== -k|--keep X

How many items to keep (ignored if archiving by tag or search)

[Default Value] None
[Must Match] (?-mix:^\d+$)


===== --search QUERY

Search filter

[Default Value] None


===== -t|--to SECTION_NAME

Move entries to

[Default Value] Archive


===== --tag TAG

Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?). Added for compatibility with other commands.

[Default Value] None


===== --[no-]label
Label moved items with @from(SECTION_NAME)



===== --not
Show items that *don't* match search string



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>autotag </tt>
Autotag last entry or filtered entries


===== Options
===== --bool BOOLEAN

Boolean (AND|OR|NOT) with which to combine multiple tag filters

[Default Value] AND
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== -c|--count COUNT

How many recent entries to autotag (0 for all)

[Default Value] 1
[Must Match] (?-mix:^\d+$)


===== -s|--section SECTION_NAME

Section

[Default Value] All


===== --search QUERY

Autotag entries matching search filter,
  surround with slashes for regex (e.g. "/query.*/"),
  start with single quote for exact match ("'query")

[Default Value] None


===== --tag TAG

Autotag the last X entries containing TAG.
  Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool

[Default Value] None


===== --force
Don't ask permission to autotag all entries when count is 0



===== -i|--interactive
Select item(s) to tag from a menu of matching entries



===== -u|--unfinished
Autotag last entry (or entries) not marked @done



==== Command: <tt>cancel  COUNT</tt>
End last X entries with no time tracked

Adds @done tag without datestamp so no elapsed time is recorded. Alias for `doing finish --no-date`.
===== Options
===== --bool BOOLEAN

Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== -s|--section NAME

Section

[Default Value] None


===== --search QUERY

Cancel the last X entries matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("'query")

[Default Value] None


===== --tag TAG

Cancel the last X entries containing TAG. Separate multiple tags with comma (--tag=tag1,tag2). Wildcards allowed (*, ?).

[Default Value] None


===== -a|--archive
Archive entries



===== -i|--interactive
Select item(s) to cancel from a menu of matching entries



===== --not
Finish items that *don't* match search/tag filters



===== -u|--unfinished
Cancel last entry (or entries) not already marked @done



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>changelog|changes </tt>
List recent changes in Doing

Display a formatted list of changes in recent versions, latest at the top
==== Command: <tt>choose </tt>
Select a section to display from a menu


==== Command: <tt>colors </tt>
List available color variables for configuration templates and views


==== Command: <tt>completion </tt>
Generate shell completion scripts

Generates the necessary scripts to add command line completion to various shells, so typing 'doing' and hitting
tab will offer completions of subcommands and their options.
===== Options
===== -f|--file PATH

File to write output to

[Default Value] STDOUT


===== -t|--type SHELL

Shell to generate for (bash, zsh, fish)

[Default Value] zsh
[Must Match] (?i-mx:^(?:[bzf](?:[ai]?sh)?|all)$)


==== Command: <tt>config </tt>
Edit the configuration file or output a value from it

Run without arguments, `doing config` opens your `config.yml` in an editor.
If local configurations are found in the path between the current directory
and the root (/), a menu will allow you to select which to open in the editor.

It will use the editor defined in `config_editor_app`, or one specified with `--editor`.

Use `doing config get` to output the configuration to the terminal, and
provide a dot-separated key path to get a specific value. Shows the current value
including keys/overrides set by local configs.
===== Options
===== -d|--[no-]dump
DEPRECATED



===== -u|--[no-]update
DEPRECATED



===== Commands
====== Command: <tt>edit </tt>
Open config file in editor


======= Options
======= -a|--app APP_NAME

Application to use

[Default Value] None


======= -b|--bundle_id BUNDLE_ID

Application bundle id to use

[Default Value] None


======= -e|--editor EDITOR

Editor to use

[Default Value] None


======= -x|--[no-]default
Use the config_editor_app defined in ~/.config/doing/config.yml (config_editor_app not set)



====== Command: <tt>get|dump </tt>
Output a key's value


======= Options
======= -o|--output FORMAT

Format for output (json|yaml|raw)

[Default Value] yaml
[Must Match] (?-mix:^(?:y(?:aml)?|j(?:son)?|r(?:aw)?)$)


====== Command: <tt>list </tt>
List configuration paths, including .doingrc files in the current and parent directories

Config files are listed in order of precedence (if there are multiple configs detected).
  Values defined in the top item in the list will override values in configutations below it.
====== Command: <tt>set </tt>
Set a key's value in the config file


======= Options
======= -r|--remove
Delete specified key



====== Command: <tt>undo </tt>
Undo the last change to a config file


====== Command: <tt>update|refresh </tt>
Update default config file, adding any missing keys


[Default Command] edit
==== Command: <tt>done|did  ENTRY</tt>
Add a completed item with @done(date). No argument finishes last entry.

Use this command to add an entry after you've already finished it. It will be immediately marked as @done.
You can modify the start and end times of the entry using the --back, --took, and --at flags, making it an easy
way to add entries in post and maintain accurate (albeit manual) time tracking.
===== Options
===== --at DATE_STRING

Set finish date to specific date/time (natural langauge parsed, e.g. --at=1:30pm).
  If used, ignores --back. Used with --took, backdates start date

[Default Value] None


===== -b|--back|--started DATE_STRING

Backdate start date by interval or set to time [4pm|20m|2h|"yesterday noon"]

[Default Value] None


===== -n|--note TEXT

Include a note

[Default Value] None


===== -s|--section NAME

Section

[Default Value] None


===== -t|--took INTERVAL

Set completion date to start date plus interval (XX[mhd] or HH:MM).
  If used without the --back option, the start date will be moved back to allow
  the completion date to be the current time.

[Default Value] None


===== -a|--archive
Immediately archive the entry



===== --[no-]date
Include date



===== -e|--editor
Edit entry with vim (with no arguments, edits the last entry)



===== -r|--remove
Remove @done tag



===== -u|--unfinished
Finish last entry not already marked @done



==== Command: <tt>finish  COUNT</tt>
Mark last X entries as @done

Marks the last X entries with a @done tag and current date. Does not alter already completed entries.
===== Options
===== --at DATE_STRING

Set finish date to specific date/time (natural langauge parsed, e.g. --at=1:30pm). If used, ignores --back.

[Default Value] None


===== -b|--back DATE_STRING

Backdate completed date to date string [4pm|20m|2h|yesterday noon]

[Default Value] None


===== --bool BOOLEAN

Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== -s|--section NAME

Section

[Default Value] None


===== --search QUERY

Finish the last X entries matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("'query")

[Default Value] None


===== -t|--took INTERVAL

Set the completed date to the start date plus XX[hmd]

[Default Value] None


===== --tag TAG

Finish the last X entries containing TAG.
  Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).

[Default Value] None


===== -a|--archive
Archive entries



===== --auto
Auto-generate finish dates from next entry's start time.
  Automatically generate completion dates 1 minute before next item (in any section) began.
  --auto overrides the --date and --back parameters.



===== --[no-]date
Include date



===== -i|--interactive
Select item(s) to finish from a menu of matching entries



===== --not
Finish items that *don't* match search/tag filters



===== -r|--remove
Remove done tag



===== -u|--unfinished
Finish last entry (or entries) not already marked @done



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>grep|search  SEARCH_PATTERN</tt>
Search for entries

Search all sections (or limit to a single section) for entries matching text or regular expression. Normal strings are fuzzy matched.

To search with regular expressions, single quote the string and surround with slashes: `doing search '/m.*?x/'`
===== Options
===== --after DATE_STRING

Search entries newer than date. If this is only a time (8am, 1:30pm, 15:00), all dates will be included, but entries will be filtered by time of day.

[Default Value] None


===== --before DATE_STRING

Search entries older than date. If this is only a time (8am, 1:30pm, 15:00), all dates will be included, but entries will be filtered by time of day.

[Default Value] None


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== --from DATE_OR_RANGE

Date range to show, or a single day to filter date on.
      Date range argument should be quoted. Date specifications can be natural language.
      To specify a range, use "to" or "through": `doing search --from "monday 8am to friday 5pm"`.

      If values are only time(s) (6am to noon) all dates will be included, but entries will be filtered
      by time of day.

[Default Value] None


===== -o|--output FORMAT

Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)

[Default Value] None


===== -s|--section NAME

Section

[Default Value] All


===== --tag_sort KEY

Sort tags by (name|time)

[Default Value] name
[Must Match] (?i-mx:^(?:name|time)$)


===== --[no-]duration
Show elapsed time on entries without @done tag



===== -i|--interactive
Display an interactive menu of results to perform further operations



===== --not
Show items that *don't* match search string



===== --only_timed
Only show items with recorded time intervals



===== -t|--[no-]times
Show time intervals on @done tasks



===== --totals
Show intervals with totals at the end of output



===== -x|--exact
Force exact string matching (case sensitive)



==== Command: <tt>help  command</tt>
Shows a list of commands or help for one command

Gets help for the application or its commands. Can also list the commands in a way helpful to creating a bash-style completion function
===== Options
===== -c
List commands one per line, to assist with shell completion



==== Command: <tt>import  PATH</tt>
Import entries from an external source

Imports entries from other sources. Available plugins: calendar, capturething, doing, timing
===== Options
===== --after DATE_STRING

Import entries newer than date

[Default Value] None


===== --before DATE_STRING

Import entries older than date

[Default Value] None


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== -f|--from DATE_OR_RANGE

Date range to import. Date range argument should be quoted. Date specifications can be natural language.
    To specify a range, use "to" or "through": `--from "monday to friday"` or `--from 10/1 to 10/31`.
    Has no effect unless the import plugin has implemented date range filtering.

[Default Value] None


===== --prefix PREFIX

Prefix entries with

[Default Value] None


===== -s|--section NAME

Target section

[Default Value] None


===== --search QUERY

Only import items matching search. Surround with slashes for regex (/query/), start with single quote for exact match ("'query")

[Default Value] None


===== --tag TAGS

Tag all imported entries

[Default Value] None


===== --type TYPE

Import type (calendar|capturething|doing|timing)

[Default Value] doing


===== --[no-]autotag
Autotag entries



===== --not
Import items that *don't* match search/tag/date filters



===== --only_timed
Only import items with recorded time intervals



===== --[no-]overlap
Allow entries that overlap existing times



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>last </tt>
Show the last entry, optionally edit

Shows the last entry. Using --search and --tag filters, you can view/edit the last entry matching a filter,
allowing `doing last` to target historical entries.
===== Options
===== --bool BOOLEAN

Tag boolean (AND|OR|NOT). Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== -s|--section NAME

Specify a section

[Default Value] All


===== --search QUERY

Search filter, surround with slashes for regex (/query/), start with single quote for exact match ("'query")

[Default Value] None


===== --tag TAG

Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?).

[Default Value] None


===== --[no-]duration
Show elapsed time if entry is not tagged @done



===== -e|--editor
Edit entry with vim



===== --not
Show items that *don't* match search string or tag filter



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>later  ENTRY</tt>
Add an item to the Later section


===== Options
===== -b|--back DATE_STRING

Backdate start time to date string [4pm|20m|2h|yesterday noon]

[Default Value] None


===== -n|--note TEXT

Note

[Default Value] None


===== -e|--editor
Edit entry with vim



==== Command: <tt>mark|flag </tt>
Mark last entry as flagged


===== Options
===== --bool BOOLEAN

Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== -c|--count COUNT

How many recent entries to tag (0 for all)

[Default Value] 1
[Must Match] (?-mix:^\d+$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== -s|--section SECTION_NAME

Section

[Default Value] All


===== --search QUERY

Flag the last entry matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("'query")

[Default Value] None


===== --tag TAG

Flag the last entry containing TAG.
  Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).

[Default Value] None


===== -d|--date
Include current date/time with tag



===== --force
Don't ask permission to flag all entries when count is 0



===== -i|--interactive
Select item(s) to flag from a menu of matching entries



===== --not
Flag items that *don't* match search/tag/date filters



===== -r|--remove
Remove flag



===== -u|--unfinished
Flag last entry (or entries) not marked @done



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>meanwhile  ENTRY</tt>
Finish any running @meanwhile tasks and optionally create a new one

The @meanwhile tag allows you to have long-running entries that encompass smaller entries.
This command makes it easy to start and stop these overarching entries. Just run `doing meanwhile Starting work on this
big project` to start a @meanwhile entry, add other entries as you work on the project, then use `doing meanwhile` by
itself to mark the entry as @done.
===== Options
===== -b|--back DATE_STRING

Backdate start date for new entry to date string [4pm|20m|2h|yesterday noon]

[Default Value] None


===== -n|--note TEXT

Note

[Default Value] None


===== -s|--section NAME

Section

[Default Value] None


===== -a|--archive
Archive previous @meanwhile entry



===== -e|--editor
Edit entry with vim



==== Command: <tt>note  NOTE_TEXT</tt>
Add a note to the last entry

If -r is provided with no other arguments, the last note is removed.
  If new content is specified through arguments or STDIN, any previous
  note will be replaced with the new one.

  Use -e to load the last entry in a text editor where you can append a note.
===== Options
===== --bool BOOLEAN

Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== -s|--section NAME

Section

[Default Value] All


===== --search QUERY

Add/remove note from last entry matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("'query")

[Default Value] None


===== --tag TAG

Add/remove note from last entry matching tag. Wildcards allowed (*, ?).

[Default Value] None


===== -e|--editor
Edit entry with vim



===== -i|--interactive
Select item for new note from a menu of matching entries



===== --not
Add note to item that *doesn't* match search/tag filters



===== -r|--remove
Replace/Remove last entry's note (default append)



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>now|next  ENTRY</tt>
Add an entry

Record what you're starting now, or backdate the start time using natural language.

A parenthetical at the end of the entry will be converted to a note.

Run with no argument to create a new entry using vim.
===== Options
===== -b|--back|--started DATE_STRING

Backdate start time [4pm|20m|2h|"yesterday noon"]

[Default Value] None


===== -n|--note TEXT

Include a note

[Default Value] None


===== -s|--section NAME

Section

[Default Value] None


===== -e|--editor
Edit entry with vim



===== -f|--finish_last
Timed entry, marks last entry in section as @done



==== Command: <tt>on  DATE_STRING</tt>
List entries for a date

Date argument can be natural language. "thursday" would be interpreted as "last thursday,"
and "2d" would be interpreted as "two days ago." If you use "to" or "through" between two dates,
it will create a range.
===== Options
===== -o|--output FORMAT

Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)

[Default Value] None


===== -s|--section NAME

Section

[Default Value] All


===== --tag_sort KEY

Sort tags by (name|time)

[Default Value] name
[Must Match] (?i-mx:^(?:name|time)$)


===== --[no-]duration
Show elapsed time on entries without @done tag



===== -t|--[no-]times
Show time intervals on @done tasks



===== --totals
Show time totals at the end of output



==== Command: <tt>open </tt>
Open the "doing" file in an editor

`doing open` defaults to using the editors->doing_file setting
in /Users/ttscoff/.config/doing/config.yml (TaskPaper).
===== Options
===== -a|--app APP_NAME

Open with app name

[Default Value] None


===== -b|--bundle_id BUNDLE_ID

Open with app bundle id

[Default Value] None


===== -e|--editor COMMAND

Open with editor command (e.g. vim, mate)

[Default Value] None


==== Command: <tt>plugins </tt>
List installed plugins

Lists available plugins, including user-installed plugins.

Export plugins are available with the `--output` flag on commands that support it.

Import plugins are available using `doing import --type PLUGIN`.
===== Options
===== -t|--type TYPE

List plugins of type (import, export)

[Default Value] all
[Must Match] (?i-mx:^(?:[iea].*)$)


===== -c|--column
List in single column for completion



==== Command: <tt>recent  COUNT</tt>
List recent entries


===== Options
===== -s|--section NAME

Section

[Default Value] All


===== --tag_sort KEY

Sort tags by (name|time)

[Default Value] name
[Must Match] (?i-mx:^(?:name|time)$)


===== --[no-]duration
Show elapsed time on entries without @done tag



===== -i|--interactive
Select from a menu of matching entries to perform additional operations



===== -t|--[no-]times
Show time intervals on @done tasks



===== --totals
Show intervals with totals at the end of output



==== Command: <tt>reset|begin  DATE_STRING</tt>
Reset the start time of an entry

Update the start time of the last entry or the last entry matching a tag/search filter.
If no argument is provided, the start time will be reset to the current time.
If a date string is provided as an argument, the start time will be set to the parsed result.
===== Options
===== --bool BOOLEAN

Boolean (AND|OR|NOT) with which to combine multiple tag filters

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== -s|--section NAME

Limit search to section

[Default Value] All


===== --search QUERY

Reset last entry matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("'query")

[Default Value] None


===== --tag TAG

Reset last entry matching tag. Wildcards allowed (*, ?).

[Default Value] None


===== -i|--interactive
Select from a menu of matching entries



===== --not
Reset items that *don't* match search/tag filters



===== -r|--[no-]resume
Resume entry (remove @done)



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>rotate </tt>
Move entries to archive file

As your doing file grows, commands can get slow. Given that your historical data (and your archive section)
probably aren't providing any useful insights a year later, use this command to "rotate" old entries out to an archive
file. You'll still have access to all historical data, but it won't be slowing down daily operation.
===== Options
===== --before DATE_STRING

Rotate entries older than date
    (Flexible date format, e.g. 1/27/2021, 2020-07-19, or Monday 3pm)

[Default Value] None


===== --bool BOOLEAN

Tag boolean (AND|OR|NOT). Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== -k|--keep X

How many items to keep in each section (most recent)

[Default Value] None
[Must Match] (?-mix:^\d+$)


===== -s|--section SECTION_NAME

Section to rotate

[Default Value] All


===== --search QUERY

Search filter

[Default Value] None


===== --tag TAG

Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?). Added for compatibility with other commands.

[Default Value] None


===== --not
Rotate items that *don't* match search string or tag filter



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>sections </tt>
List sections


===== Options
===== -c|--column
List in single column



==== Command: <tt>select </tt>
Display an interactive menu to perform operations

List all entries and select with typeahead fuzzy matching.

Multiple selections are allowed, hit tab to add the highlighted entry to the
selection, and use ctrl-a to select all visible items. Return processes the
selected entries.

Search in the menu by typing:

sbtrkt  fuzzy-match   Items that match sbtrkt

'wild   exact-match (quoted)  Items that include wild

!fire   inverse-exact-match   Items that do not include fire
===== Options
===== --after DATE_STRING

Select from entries newer than date. If this is only a time (8am, 1:30pm, 15:00), all dates will be included, but entries will be filtered by time of day.

[Default Value] None


===== --before DATE_STRING

Select from entries older than date. If this is only a time (8am, 1:30pm, 15:00), all dates will be included, but entries will be filtered by time of day.

[Default Value] None


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== --from DATE_OR_RANGE

Date range to show, or a single day to filter date on.
      Date range argument should be quoted. Date specifications can be natural language.
      To specify a range, use "to" or "through": `doing select --from "monday 8am to friday 5pm"`.

      If values are only time(s) (6am to noon) all dates will be included, but entries will be filtered
      by time of day.

[Default Value] None


===== -m|--move SECTION

Move selected items to section

[Default Value] None


===== -o|--output FORMAT

Output entries to format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)

[Default Value] None


===== -q|--query|--search QUERY

Initial search query for filtering. Matching is fuzzy. For exact matching, start query with a single quote, e.g. `--query "'search"

[Default Value] None


===== -s|--section SECTION

Select from a specific section

[Default Value] None


===== --save_to FILE

Save selected entries to file using --output format

[Default Value] None


===== -t|--tag TAG

Tag selected entries

[Default Value] None


===== -a|--archive
Archive selected items



===== --again|--resume
Copy selection as a new entry with current time and no @done tag. Only works with single selections. Can be combined with --editor.



===== -c|--cancel
Cancel selected items (add @done without timestamp)



===== -d|--delete
Delete selected items



===== -e|--editor
Edit selected item(s)



===== -f|--finish
Add @done with current time to selected item(s)



===== --flag
Add flag to selected item(s)



===== --force
Perform action without confirmation.



===== --[no-]menu
Use --no-menu to skip the interactive menu. Use with --query to filter items and act on results automatically. Test with `--output doing` to preview matches.



===== --not
Select items that *don't* match search/tag filters



===== -r|--remove
Reverse -c, -f, --flag, and -t (remove instead of adding)



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>show  [SECTION|@TAGS]</tt>
List all entries

The argument can be a section name, @tag(s) or both.
  "pick" or "choose" as an argument will offer a section menu. Run with `--menu` to get a menu of available tags.

  Show tags by passing @tagname arguments. Multiple tags can be combined, and you can specify the boolean used to
  combine them with `--bool (AND|OR|NOT)`. You can also use @+tagname to require a tag to match, or @-tagname to ignore
  entries containing tagname. +/- operators require `--bool PATTERN` (which is the default).
===== Options
===== -a|--age AGE

Age (oldest|newest)

[Default Value] newest


===== --after DATE_STRING

Show entries newer than date. If this is only a time (8am, 1:30pm, 15:00), all dates will be included, but entries will be filtered by time of day.

[Default Value] None


===== -b|--bool BOOLEAN

Tag boolean (AND,OR,NOT). Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --before DATE_STRING

Show entries older than date. If this is only a time (8am, 1:30pm, 15:00), all dates will be included, but entries will be filtered by time of day.

[Default Value] None


===== -c|--count MAX

Max count to show

[Default Value] 0
[Must Match] (?-mix:^\d+$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== --from DATE_OR_RANGE

Date range to show, or a single day to filter date on.
      Date range argument should be quoted. Date specifications can be natural language.
      To specify a range, use "to" or "through": `doing show --from "monday 8am to friday 5pm"`.

      If values are only time(s) (6am to noon) all dates will be included, but entries will be filtered
      by time of day.

[Default Value] None


===== -o|--output FORMAT

Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)

[Default Value] None


===== -s|--sort ORDER

Sort order (asc/desc)

[Default Value] asc
[Must Match] (?i-mx:^(?:a(?:sc)?|d(?:esc)?)$)


===== --search QUERY

Search filter, surround with slashes for regex (/query/), start with single quote for exact match ("'query")

[Default Value] None


===== --tag TAG

Tag filter, combine multiple tags with a comma. Use `--tag pick` for a menu of available tags. Wildcards allowed (*, ?). Added for compatibility with other commands.

[Default Value] None


===== --tag_order DIRECTION

Tag sort direction (asc|desc)

[Default Value] asc
[Must Match] (?i-mx:^(?:a(?:sc)?|d(?:esc)?)$)


===== --tag_sort KEY

Sort tags by (name|time)

[Default Value] name
[Must Match] (?i-mx:^(?:name|time))


===== --[no-]duration
Show elapsed time on entries without @done tag



===== -i|--interactive
Select from a menu of matching entries to perform additional operations



===== -m|--menu
Select section or tag to display from a menu



===== --not
Show items that *don't* match search/tag/date filters



===== --only_timed
Only show items with recorded time intervals



===== -t|--[no-]times
Show time intervals on @done tasks



===== --totals
Show intervals with totals at the end of output



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>since  DATE_STRING</tt>
List entries since a date

Date argument can be natural language and are always interpreted as being in the past. "thursday" would be interpreted as "last thursday,"
and "2d" would be interpreted as "two days ago."
===== Options
===== -o|--output FORMAT

Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)

[Default Value] None


===== -s|--section NAME

Section

[Default Value] All


===== --tag_sort KEY

Sort tags by (name|time)

[Default Value] name
[Must Match] (?i-mx:^(?:name|time)$)


===== --[no-]duration
Show elapsed time on entries without @done tag



===== -t|--[no-]times
Show time intervals on @done tasks



===== --totals
Show time totals at the end of output



==== Command: <tt>tag  TAG...</tt>
Add tag(s) to last entry

Add (or remove) tags from the last entry, or from multiple entries
          (with `--count`), entries matching a search (with `--search`), or entries
          containing another tag (with `--tag`).

          When removing tags with `-r`, wildcards are allowed (`*` to match
          multiple characters, `?` to match a single character). With `--regex`,
          regular expressions will be interpreted instead of wildcards.

          For all tag removals the match is case insensitive by default, but if
          the tag search string contains any uppercase letters, the match will
          become case sensitive automatically.

          Tag name arguments do not need to be prefixed with @.
===== Options
===== --bool BOOLEAN

Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== -c|--count COUNT

How many recent entries to tag (0 for all)

[Default Value] 1
[Must Match] (?-mix:^\d+$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== --rename ORIG_TAG

Replace existing tag with tag argument, wildcards (*,?) allowed, or use with --regex

[Default Value] None


===== -s|--section SECTION_NAME

Section

[Default Value] All


===== --search QUERY

Tag entries matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("'query")

[Default Value] None


===== --tag TAG

Tag the last X entries containing TAG.
  Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).

[Default Value] None


===== -a|--autotag
Autotag entries based on autotag configuration in ~/.config/doing/config.yml



===== -d|--date
Include current date/time with tag



===== --force
Don't ask permission to tag all entries when count is 0



===== -i|--interactive
Select item(s) to tag from a menu of matching entries



===== --not
Tag items that *don't* match search/tag filters



===== -r|--remove
Remove given tag(s)



===== --regex
Interpret tag string as regular expression (with --remove)



===== -u|--unfinished
Tag last entry (or entries) not marked @done



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>tags </tt>
List all tags in the current Doing file


===== Options
===== --bool BOOLEAN

Boolean used to combine multiple tags. Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== -o|--order ORDER

Sort order (asc/desc)

[Default Value] asc
[Must Match] (?i-mx:^(?:a(?:sc)?|d(?:esc)?)$)


===== -s|--section SECTION_NAME

Section

[Default Value] All


===== --search QUERY

Get tags for items matching search. Surround with
  slashes for regex (e.g. "/query/"), start with a single quote for exact match ("'query").

[Default Value] None


===== --sort SORT_ORDER

Sort by name or count

[Default Value] name
[Must Match] (?-mix:^(?:n(?:ame)?|c(?:ount)?)$)


===== --tag TAG

Get tags for entries matching tags. Combine multiple tags with a comma. Wildcards allowed (*, ?).

[Default Value] None


===== -c|--[no-]counts
Show count of occurrences



===== -i|--interactive
Select items to scan from a menu of matching entries



===== --not
Get tags from items that *don't* match search/tag filters



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>template  TYPE</tt>
Output HTML, CSS, and Markdown (ERB) templates for customization

Templates are printed to STDOUT for piping to a file.
  Save them and use them in the configuration file under export_templates.
===== Options
===== -p|--path DIRECTORY

Save template to alternate location

[Default Value] /Users/ttscoff/.config/doing/templates


===== -c|--[no-]column
List in single column for completion



===== -l|--list
List all available templates



===== -s|--save
Save template to file instead of STDOUT



==== Command: <tt>test </tt>
Test Stuff

This command is coming from /Users/ttscoff/.config/doing/commands/test.rb
==== Command: <tt>today </tt>
List entries from today

List entries from the current day. Use --before, --after, and
--from to specify time ranges.
===== Options
===== --after TIME_STRING

View entries after specified time (e.g. 8am, 12:30pm, 15:00)

[Default Value] None


===== --before TIME_STRING

View entries before specified time (e.g. 8am, 12:30pm, 15:00)

[Default Value] None


===== --from DATE_OR_RANGE

Time range to show `doing today --from "12pm to 4pm"`

[Default Value] None


===== -o|--output FORMAT

Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)

[Default Value] None


===== -s|--section NAME

Specify a section

[Default Value] All


===== --tag_sort KEY

Sort tags by (name|time)

[Default Value] name
[Must Match] (?i-mx:^(?:name|time)$)


===== --[no-]duration
Show elapsed time on entries without @done tag



===== -t|--[no-]times
Show time intervals on @done tasks



===== --totals
Show time totals at the end of output



==== Command: <tt>undo  COUNT</tt>
Undo the last X changes to the Doing file

Reverts the last X commands that altered the doing file.
All changes performed by a single command are undone at once.

Specify a number to jump back multiple revisions, or use --select for an interactive menu.
===== Options
===== -f|--file PATH

Specify alternate doing file

[Default Value] None


===== -p|--prune COUNT

Remove old backups, retaining X files

[Default Value] None


===== -i|--interactive
Select from recent backups



===== -r|--[no-]redo
Redo last undo. Note: you cannot undo a redo.



==== Command: <tt>view  VIEW_NAME</tt>
Display a user-created view

Views are defined in your configuration (use `doing config` to edit).
Command line options override view configuration.
===== Options
===== --after DATE_STRING

View entries newer than date. If this is only a time (8am, 1:30pm, 15:00), all dates will be included, but entries will be filtered by time of day.

[Default Value] None


===== --age AGE

Age (oldest|newest)

[Default Value] newest


===== -b|--bool BOOLEAN

Tag boolean (AND,OR,NOT). Use PATTERN to parse + and - as booleans.

[Default Value] PATTERN
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --before DATE_STRING

View entries older than date. If this is only a time (8am, 1:30pm, 15:00), all dates will be included, but entries will be filtered by time of day.

[Default Value] None


===== -c|--count COUNT

Count to display

[Default Value] None
[Must Match] (?-mix:^\d+$)


===== --case TYPE

Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]

[Default Value] smart
[Must Match] (?-mix:^[csi])


===== --from DATE_OR_RANGE

Date range to show, or a single day to filter date on.
      Date range argument should be quoted. Date specifications can be natural language.
      To specify a range, use "to" or "through": `doing view --from "monday 8am to friday 5pm" view_name`.

      If values are only time(s) (6am to noon) all dates will be included, but entries will be filtered
      by time of day.

[Default Value] None


===== -o|--output FORMAT

Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)

[Default Value] None


===== -s|--section NAME

Section

[Default Value] None


===== --search QUERY

Search filter, surround with slashes for regex (/query/), start with single quote for exact match ("'query")

[Default Value] None


===== --tag TAG

Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?).

[Default Value] None


===== --tag_order DIRECTION

Tag sort direction (asc|desc)

[Default Value] None
[Must Match] (?i-mx:^(?:a(?:sc)?|d(?:esc)?)$)


===== --tag_sort KEY

Sort tags by (name|time)

[Default Value] None
[Must Match] (?i-mx:^(?:name|time)$)


===== --[no-]color
Include colors in output



===== --[no-]duration
Show elapsed time on entries without @done tag



===== -i|--interactive
Select from a menu of matching entries to perform additional operations



===== --not
Show items that *don't* match search string



===== --only_timed
Only show items with recorded time intervals (override view settings)



===== -t|--[no-]times
Show time intervals on @done tasks



===== --totals
Show intervals with totals at the end of output



===== -x|--exact
Force exact search string matching (case sensitive)



==== Command: <tt>views </tt>
List available custom views


===== Options
===== -c|--[no-]column
List in single column



==== Command: <tt>wiki </tt>
Output a tag wiki


===== Options
===== --after DATE_STRING

Include entries newer than date

[Default Value] None


===== -b|--bool BOOLEAN

Tag boolean (AND,OR,NOT)

[Default Value] OR
[Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)


===== --before DATE_STRING

Include entries older than date

[Default Value] None


===== -f|--from DATE_OR_RANGE

Date range to include, or a single day to filter date on.
    Date range argument should be quoted. Date specifications can be natural language.
    To specify a range, use "to" or "through": `doing show --from "monday to friday"`

[Default Value] None


===== -s|--section SECTION_NAME

Section to rotate

[Default Value] All


===== --search QUERY

Search filter, surround with slashes for regex (/query/), start with single quote for exact match ("'query")

[Default Value] None


===== --tag TAG

Tag filter, combine multiple tags with a comma, use with --bool

[Default Value] None


===== --only_timed
Only show items with recorded time intervals



==== Command: <tt>yesterday </tt>
List entries from yesterday

Show only entries with start times within the previous 24 hour period. Use --before, --after, and --from to limit to
time spans within the day.
===== Options
===== --after TIME_STRING

View entries after specified time (e.g. 8am, 12:30pm, 15:00)

[Default Value] None


===== --before TIME_STRING

View entries before specified time (e.g. 8am, 12:30pm, 15:00)

[Default Value] None


===== --from TIME_RANGE

Time range to show, e.g. `doing yesterday --from "1am to 8am"`

[Default Value] None


===== -o|--output FORMAT

Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)

[Default Value] None


===== -s|--section NAME

Specify a section

[Default Value] All


===== --tag_order DIRECTION

Tag sort direction (asc|desc)

[Default Value] asc
[Must Match] (?i-mx:^(?:a(?:sc)?|d(?:esc)?)$)


===== --tag_sort KEY

Sort tags by (name|time)

[Default Value] name
[Must Match] (?i-mx:^(?:name|time)$)


===== --[no-]duration
Show elapsed time on entries without @done tag



===== -t|--[no-]times
Show time intervals on @done tasks



===== --totals
Show time totals at the end of output



[Default Command] recent
