doing 2.1.4pre → 2.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/.yardoc/checksums +14 -13
  3. data/.yardoc/object_types +0 -0
  4. data/.yardoc/objects/root.dat +0 -0
  5. data/.yardopts +1 -1
  6. data/CHANGELOG.md +37 -1
  7. data/Gemfile.lock +3 -1
  8. data/README.md +5 -1
  9. data/bin/doing +192 -95
  10. data/docs/_config.yml +1 -0
  11. data/{doc → docs/doc}/Array.html +63 -1
  12. data/docs/doc/BooleanTermParser/Clause.html +293 -0
  13. data/docs/doc/BooleanTermParser/Operator.html +172 -0
  14. data/docs/doc/BooleanTermParser/Query.html +417 -0
  15. data/docs/doc/BooleanTermParser/QueryParser.html +135 -0
  16. data/docs/doc/BooleanTermParser/QueryTransformer.html +124 -0
  17. data/docs/doc/BooleanTermParser.html +115 -0
  18. data/docs/doc/Doing/CLIFormat.html +131 -0
  19. data/{doc → docs/doc}/Doing/Color.html +2 -2
  20. data/{doc → docs/doc}/Doing/Completion.html +1 -1
  21. data/{doc → docs/doc}/Doing/Configuration.html +117 -12
  22. data/{doc → docs/doc}/Doing/Content.html +0 -0
  23. data/{doc → docs/doc}/Doing/Errors/DoingNoTraceError.html +1 -1
  24. data/{doc → docs/doc}/Doing/Errors/DoingRuntimeError.html +1 -1
  25. data/{doc → docs/doc}/Doing/Errors/DoingStandardError.html +1 -1
  26. data/{doc → docs/doc}/Doing/Errors/EmptyInput.html +1 -1
  27. data/{doc → docs/doc}/Doing/Errors/NoResults.html +1 -1
  28. data/{doc → docs/doc}/Doing/Errors/PluginException.html +1 -1
  29. data/{doc → docs/doc}/Doing/Errors/UserCancelled.html +1 -1
  30. data/{doc → docs/doc}/Doing/Errors/WrongCommand.html +1 -1
  31. data/{doc → docs/doc}/Doing/Errors.html +1 -1
  32. data/{doc → docs/doc}/Doing/Hooks.html +1 -1
  33. data/{doc → docs/doc}/Doing/Item.html +100 -73
  34. data/{doc → docs/doc}/Doing/Items.html +2 -2
  35. data/{doc → docs/doc}/Doing/LogAdapter.html +70 -1
  36. data/{doc → docs/doc}/Doing/Note.html +5 -134
  37. data/{doc → docs/doc}/Doing/Pager.html +1 -1
  38. data/{doc → docs/doc}/Doing/Plugins.html +431 -35
  39. data/{doc → docs/doc}/Doing/Prompt.html +1 -1
  40. data/{doc → docs/doc}/Doing/Section.html +1 -1
  41. data/docs/doc/Doing/TemplateString.html +713 -0
  42. data/docs/doc/Doing/Util/Backup.html +686 -0
  43. data/{doc → docs/doc}/Doing/Util.html +1 -1
  44. data/{doc → docs/doc}/Doing/WWID.html +5 -5
  45. data/{doc → docs/doc}/Doing/WWIDFile.html +0 -0
  46. data/{doc → docs/doc}/Doing.html +4 -4
  47. data/{doc → docs/doc}/GLI/Commands/MarkdownDocumentListener.html +1 -1
  48. data/{doc → docs/doc}/GLI/Commands.html +1 -1
  49. data/{doc → docs/doc}/GLI.html +1 -1
  50. data/{doc → docs/doc}/Hash.html +1 -1
  51. data/docs/doc/PhraseParser/Operator.html +172 -0
  52. data/docs/doc/PhraseParser/PhraseClause.html +303 -0
  53. data/docs/doc/PhraseParser/Query.html +495 -0
  54. data/docs/doc/PhraseParser/QueryParser.html +136 -0
  55. data/docs/doc/PhraseParser/QueryTransformer.html +124 -0
  56. data/docs/doc/PhraseParser/TermClause.html +293 -0
  57. data/docs/doc/PhraseParser.html +115 -0
  58. data/{doc → docs/doc}/Status.html +1 -1
  59. data/{doc → docs/doc}/String.html +182 -12
  60. data/{doc → docs/doc}/Symbol.html +35 -1
  61. data/{doc → docs/doc}/Time.html +1 -1
  62. data/{doc → docs/doc}/_index.html +21 -14
  63. data/{doc → docs/doc}/class_list.html +1 -1
  64. data/{doc → docs/doc}/css/common.css +0 -0
  65. data/{doc → docs/doc}/css/full_list.css +0 -0
  66. data/{doc → docs/doc}/css/style.css +0 -0
  67. data/{doc → docs/doc}/file.README.html +6 -2
  68. data/{doc → docs/doc}/file_list.html +0 -0
  69. data/{doc → docs/doc}/frames.html +0 -0
  70. data/{doc → docs/doc}/index.html +6 -2
  71. data/{doc → docs/doc}/js/app.js +0 -0
  72. data/{doc → docs/doc}/js/full_list.js +0 -0
  73. data/{doc → docs/doc}/js/jquery.js +0 -0
  74. data/{doc → docs/doc}/method_list.html +313 -161
  75. data/{doc → docs/doc}/top-level-namespace.html +1 -1
  76. data/docs/index.md +60 -0
  77. data/doing.gemspec +1 -0
  78. data/doing.rdoc +74 -15
  79. data/example_plugin.rb +3 -1
  80. data/lib/completion/_doing.zsh +53 -41
  81. data/lib/completion/doing.bash +17 -6
  82. data/lib/completion/doing.fish +321 -2
  83. data/lib/doing/array.rb +9 -0
  84. data/lib/doing/completion/fish_completion.rb +46 -3
  85. data/lib/doing/completion/zsh_completion.rb +1 -1
  86. data/lib/doing/configuration.rb +33 -11
  87. data/lib/doing/item.rb +12 -3
  88. data/lib/doing/log_adapter.rb +28 -0
  89. data/lib/doing/note.rb +31 -30
  90. data/lib/doing/plugin_manager.rb +84 -21
  91. data/lib/doing/plugins/export/dayone_export.rb +209 -0
  92. data/lib/doing/plugins/export/html_export.rb +2 -2
  93. data/lib/doing/plugins/export/json_export.rb +1 -0
  94. data/lib/doing/plugins/export/markdown_export.rb +1 -1
  95. data/lib/doing/plugins/export/template_export.rb +90 -85
  96. data/lib/doing/prompt.rb +9 -6
  97. data/lib/doing/string.rb +68 -27
  98. data/lib/doing/symbol.rb +4 -0
  99. data/lib/doing/template_string.rb +197 -0
  100. data/lib/doing/util.rb +4 -2
  101. data/lib/doing/util_backup.rb +55 -3
  102. data/lib/doing/version.rb +1 -1
  103. data/lib/doing/wwid.rb +37 -22
  104. data/lib/doing.rb +3 -0
  105. data/lib/examples/plugins/say_export.rb +1 -1
  106. data/lib/examples/plugins/wiki_export/wiki_export.rb +3 -3
  107. data/lib/templates/doing-dayone-entry.erb +6 -0
  108. data/lib/templates/doing-dayone.erb +5 -0
  109. metadata +95 -53
@@ -102,7 +102,7 @@
102
102
  </div>
103
103
 
104
104
  <div id="footer">
105
- Generated on Fri Dec 17 16:17:18 2021 by
105
+ Generated on Mon Dec 20 16:04:14 2021 by
106
106
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
107
  0.9.26 (ruby-3.0.1).
108
108
  </div>
data/docs/index.md ADDED
@@ -0,0 +1,60 @@
1
+ # doing
2
+
3
+ **A command line tool for remembering what you were doing and tracking what you've done.**
4
+
5
+ _If you're one of the rare people like me who find this useful, feel free to [buy me some coffee](http://brettterpstra.com/donate/)._
6
+
7
+
8
+
9
+ The current version of `doing` is 2.1.4.
10
+
11
+ Find all of the documentation in the [doing wiki](https://github.com/ttscoff/doing/wiki).
12
+
13
+ See [what's new in Doing 2.0](https://brettterpstra.com/2021/11/20/doing-2-dot-0/).
14
+
15
+ Check out some craziness with Doing in the [iTerm status bar](https://brettterpstra.com/2021/10/15/see-what-youre-doing-in-the-iterm-status-bar/) and the [Mac Touch Bar/menu bar](https://brettterpstra.com/2021/07/21/crazy-bettertouchtool-touch-bar-simulator/).
16
+
17
+ ## What and why
18
+
19
+ `doing` is a basic CLI for adding and listing "what was I doing" reminders in a [TaskPaper-formatted](https://www.taskpaper.com) text file. It allows for multiple sections/categories and flexible output formatting.
20
+
21
+ While I'm working, I have hourly reminders to record what I'm working on, and I try to remember to punch in quick notes if I'm unexpectedly called away from a project. I can do this just by typing `doing now tracking down the CG bug`.
22
+
23
+ If there's something I want to look at later but doesn't need to be added to a task list or tracker, I can type `doing later check out the pinboard bookmarks from macdrifter`. When I get back to my computer --- or just need a refresher after a distraction --- I can type `doing last` to see what the last thing on my plate was. I can also type `doing recent` (or just `doing`) to get a list of the last few entries. `doing today` gives me everything since midnight for the current day, making it easy to see what I've accomplished over a sleepless night.
24
+
25
+ Doing has over 30 commands for tracking your status, recording your time, and analyzing the results.
26
+
27
+ See [the wiki](https://github.com/ttscoff/doing/wiki) for installation and usage instructions.
28
+
29
+ ## Launchbar/Alfred
30
+
31
+ The LaunchBar action requires that `doing` be available in `/usr/local/bin/doing`. If it's not (because you're using RVM or similar), you'll need to symlink it there. Running the action with Return will show the latest 9 items from Currently, along with any time intervals recorded, and includes a submenu of Timers for each tag.
32
+
33
+ Pressing Spacebar and typing allows you to add a new entry to currently. You an also trigger a custom show command by typing "show [section/tag]" and hitting return. Include any command line flags at the end of the string, and if you add text in parenthesis, it will be processed as a note on the entry.
34
+
35
+ Point of interest, the LaunchBar Action makes use of the `-o json` flag for outputting JSON to the action's script for parsing.
36
+
37
+
38
+
39
+ See the [doing project on BrettTerpstra.com](https://brettterpstra.com/projects/doing/) for the download.
40
+
41
+
42
+
43
+
44
+ Evan Lovely has [created an Alfred workflow as well](http://www.evanlovely.com/blog/technology/alfred-for-terpstras-doing/).
45
+
46
+ ## Contributing
47
+
48
+ If you [create a plugin](https://github.com/ttscoff/doing/wiki/Creating-Plugins), custom command, or hook you can share, please [let me know](https://brettterpstra.com/contact/). If I get a few plugin contributions, I'll set up a second repository for them.
49
+
50
+ Feel free to fork [the repository](https://github.com/ttscoff/doing/) on GitHub and make pull requests with changes. Please target the `develop` branch with pull requests.
51
+
52
+
53
+
54
+ ---
55
+
56
+ PayPal link: [paypal.me/ttscoff](https://paypal.me/ttscoff)
57
+
58
+ ## Changelog
59
+
60
+ See [CHANGELOG.md](https://github.com/ttscoff/doing/blob/master/CHANGELOG.md)
data/doing.gemspec CHANGED
@@ -41,5 +41,6 @@ spec = Gem::Specification.new do |s|
41
41
  s.add_runtime_dependency('tty-which', '~> 0.5', '>= 0.5.0')
42
42
  s.add_runtime_dependency('tty-markdown', '~> 0.7', '>= 0.7.0')
43
43
  s.add_runtime_dependency('parslet', '~> 2.0', '>= 2.0.0')
44
+ s.add_runtime_dependency('plist', '~> 3.6', '>= 3.6.0')
44
45
  # s.add_runtime_dependency('amatch', '~> 0.4', '>= 0.4.0')
45
46
  end
data/doing.rdoc CHANGED
@@ -5,7 +5,7 @@ record of what you've been doing, complete with tag-based time tracking. The
5
5
  command line tool allows you to add entries, annotate with tags and notes, and
6
6
  view your entries with myriad options, with a focus on a "natural" language syntax.
7
7
 
8
- v2.1.4pre
8
+ v2.1.7
9
9
 
10
10
  === Global Options
11
11
  === --config_file arg
@@ -380,10 +380,10 @@ List available color variables for configuration templates and views
380
380
 
381
381
 
382
382
  ==== Command: <tt>completion </tt>
383
+ Generate shell completion scripts
384
+
383
385
  Generates the necessary scripts to add command line completion to various shells, so typing 'doing' and hitting
384
386
  tab will offer completions of subcommands and their options.
385
-
386
-
387
387
  ===== Options
388
388
  ===== -f|--file PATH
389
389
 
@@ -493,11 +493,11 @@ Update default config file, adding any missing keys
493
493
 
494
494
  [Default Command] edit
495
495
  ==== Command: <tt>done|did ENTRY</tt>
496
+ Add a completed item with @done(date). No argument finishes last entry.
497
+
496
498
  Use this command to add an entry after you've already finished it. It will be immediately marked as @done.
497
499
  You can modify the start and end times of the entry using the --back, --took, and --at flags, making it an easy
498
500
  way to add entries in post and maintain accurate (albeit manual) time tracking.
499
-
500
-
501
501
  ===== Options
502
502
  ===== --at DATE_STRING
503
503
 
@@ -711,7 +711,7 @@ Date range to show, or a single day to filter date on.
711
711
 
712
712
  ===== -o|--output FORMAT
713
713
 
714
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
714
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)
715
715
 
716
716
  [Default Value] None
717
717
 
@@ -1204,7 +1204,7 @@ it will create a range.
1204
1204
  ===== Options
1205
1205
  ===== -o|--output FORMAT
1206
1206
 
1207
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1207
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)
1208
1208
 
1209
1209
  [Default Value] None
1210
1210
 
@@ -1532,7 +1532,7 @@ Move selected items to section
1532
1532
 
1533
1533
  ===== -o|--output FORMAT
1534
1534
 
1535
- Output entries to format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1535
+ Output entries to format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)
1536
1536
 
1537
1537
  [Default Value] None
1538
1538
 
@@ -1669,6 +1669,7 @@ Show entries older than date. If this is only a time (8am, 1:30pm, 15:00), all d
1669
1669
  Max count to show
1670
1670
 
1671
1671
  [Default Value] 0
1672
+ [Must Match] (?-mix:^\d+$)
1672
1673
 
1673
1674
 
1674
1675
  ===== --case TYPE
@@ -1693,7 +1694,7 @@ Date range to show, or a single day to filter date on.
1693
1694
 
1694
1695
  ===== -o|--output FORMAT
1695
1696
 
1696
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1697
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)
1697
1698
 
1698
1699
  [Default Value] None
1699
1700
 
@@ -1784,7 +1785,7 @@ and "2d" would be interpreted as "two days ago."
1784
1785
  ===== Options
1785
1786
  ===== -o|--output FORMAT
1786
1787
 
1787
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1788
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)
1788
1789
 
1789
1790
  [Default Value] None
1790
1791
 
@@ -1939,6 +1940,22 @@ List all tags in the current Doing file
1939
1940
 
1940
1941
 
1941
1942
  ===== Options
1943
+ ===== --bool BOOLEAN
1944
+
1945
+ Boolean used to combine multiple tags. Use PATTERN to parse + and - as booleans.
1946
+
1947
+ [Default Value] PATTERN
1948
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
1949
+
1950
+
1951
+ ===== --case TYPE
1952
+
1953
+ Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]
1954
+
1955
+ [Default Value] smart
1956
+ [Must Match] (?-mix:^[csi])
1957
+
1958
+
1942
1959
  ===== -o|--order ORDER
1943
1960
 
1944
1961
  Sort order (asc/desc)
@@ -1954,6 +1971,14 @@ Section
1954
1971
  [Default Value] All
1955
1972
 
1956
1973
 
1974
+ ===== --search QUERY
1975
+
1976
+ Get tags for items matching search. Surround with
1977
+ slashes for regex (e.g. "/query/"), start with a single quote for exact match ("'query").
1978
+
1979
+ [Default Value] None
1980
+
1981
+
1957
1982
  ===== --sort SORT_ORDER
1958
1983
 
1959
1984
  Sort by name or count
@@ -1962,17 +1987,46 @@ Sort by name or count
1962
1987
  [Must Match] (?-mix:^(?:n(?:ame)?|c(?:ount)?)$)
1963
1988
 
1964
1989
 
1990
+ ===== --tag TAG
1991
+
1992
+ Get tags for entries matching tags. Combine multiple tags with a comma. Wildcards allowed (*, ?).
1993
+
1994
+ [Default Value] None
1995
+
1996
+
1965
1997
  ===== -c|--[no-]counts
1966
1998
  Show count of occurrences
1967
1999
 
1968
2000
 
1969
2001
 
2002
+ ===== -i|--interactive
2003
+ Select items to scan from a menu of matching entries
2004
+
2005
+
2006
+
2007
+ ===== --not
2008
+ Get tags from items that *don't* match search/tag filters
2009
+
2010
+
2011
+
2012
+ ===== -x|--exact
2013
+ Force exact search string matching (case sensitive)
2014
+
2015
+
2016
+
1970
2017
  ==== Command: <tt>template TYPE</tt>
1971
2018
  Output HTML, CSS, and Markdown (ERB) templates for customization
1972
2019
 
1973
2020
  Templates are printed to STDOUT for piping to a file.
1974
2021
  Save them and use them in the configuration file under export_templates.
1975
2022
  ===== Options
2023
+ ===== -p|--path DIRECTORY
2024
+
2025
+ Save template to alternate location
2026
+
2027
+ [Default Value] /Users/ttscoff/.config/doing/templates
2028
+
2029
+
1976
2030
  ===== -c|--[no-]column
1977
2031
  List in single column for completion
1978
2032
 
@@ -1983,6 +2037,11 @@ List all available templates
1983
2037
 
1984
2038
 
1985
2039
 
2040
+ ===== -s|--save
2041
+ Save template to file instead of STDOUT
2042
+
2043
+
2044
+
1986
2045
  ==== Command: <tt>test </tt>
1987
2046
  Test Stuff
1988
2047
 
@@ -2016,7 +2075,7 @@ Time range to show `doing today --from "12pm to 4pm"`
2016
2075
 
2017
2076
  ===== -o|--output FORMAT
2018
2077
 
2019
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
2078
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)
2020
2079
 
2021
2080
  [Default Value] None
2022
2081
 
@@ -2141,7 +2200,7 @@ Date range to show, or a single day to filter date on.
2141
2200
 
2142
2201
  ===== -o|--output FORMAT
2143
2202
 
2144
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
2203
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)
2145
2204
 
2146
2205
  [Default Value] None
2147
2206
 
@@ -2296,10 +2355,10 @@ Only show items with recorded time intervals
2296
2355
 
2297
2356
 
2298
2357
  ==== Command: <tt>yesterday </tt>
2358
+ List entries from yesterday
2359
+
2299
2360
  Show only entries with start times within the previous 24 hour period. Use --before, --after, and --from to limit to
2300
2361
  time spans within the day.
2301
-
2302
-
2303
2362
  ===== Options
2304
2363
  ===== --after TIME_STRING
2305
2364
 
@@ -2324,7 +2383,7 @@ Time range to show, e.g. `doing yesterday --from "1am to 8am"`
2324
2383
 
2325
2384
  ===== -o|--output FORMAT
2326
2385
 
2327
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
2386
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)
2328
2387
 
2329
2388
  [Default Value] None
2330
2389
 
data/example_plugin.rb CHANGED
@@ -47,6 +47,8 @@ module Doing
47
47
  ## - name: display name for template
48
48
  ## - trigger: regular expression for
49
49
  ## `template --type FORMAT`
50
+ ## - format: a descriptor of the file format (erb, haml, stylus, etc.)
51
+ ## - filename: a default filename used when the template is written to disk
50
52
  ##
51
53
  ## If a template is included, a config key will
52
54
  ## automatically be added for the user to override
@@ -73,7 +75,7 @@ module Doing
73
75
  {
74
76
  trigger: 'say(?:it)?',
75
77
  templates: [
76
- { name: 'say', trigger: 'say(?:it)?' }
78
+ { name: 'say', trigger: 'say(?:it)?', format: 'text', filename: 'say.txt' }
77
79
  ],
78
80
  config: {
79
81
  'say_voice' => 'Fiona'
@@ -14,6 +14,8 @@ function _doing() {
14
14
  'move:Move entries between sections'
15
15
  'autotag:Autotag last entry or filtered entries'
16
16
  'cancel:End last X entries with no time tracked'
17
+ 'changelog:List recent changes in Doing'
18
+ 'changes:List recent changes in Doing'
17
19
  'choose:Select a section to display from a menu'
18
20
  'colors:List available color variables for configuration templates and views'
19
21
  'completion:Generate shell completion scripts'
@@ -45,10 +47,11 @@ function _doing() {
45
47
  'show:List all entries'
46
48
  'since:List entries since a date'
47
49
  'tag:Add tag(s) to last entry'
50
+ 'tags:List all tags in the current Doing file'
48
51
  'template:Output HTML'
49
52
  'test:Test Stuff'
50
53
  'today:List entries from today'
51
- 'undo:Undo the last change to the Doing file'
54
+ 'undo:Undo the last X changes to the Doing file'
52
55
  'view:Display a user-created view'
53
56
  'views:List available custom views'
54
57
  'wiki:Output a tag wiki'
@@ -66,21 +69,27 @@ function _doing() {
66
69
  args=( )
67
70
  ;;
68
71
  again)
69
- args=( )
72
+ args=( "(--bool=)--bool=}[Boolean used to combine multiple tags]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-e,--editor}"[Edit duplicated entry with vim before adding]" {-i,--interactive}"[Select item to resume from a menu of matching entries]" "(--in=)--in=}[Add new entry to section]" {-n,--note=}"[Note]" "(--not)--not}[Resume items that *dont* match search/tag filterst* match search/tag filters]" {-s,--section=}"[Get last entry from a specific section]" "(--search=)--search=}[Repeat last entry matching search]" "(--tag=)--tag=}[Repeat last entry matching tags]" {-x,--exact}"[Force exact search string matching]" )
70
73
  ;;
71
74
  resume)
72
- args=( )
75
+ args=( "(--bool=)--bool=}[Boolean used to combine multiple tags]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-e,--editor}"[Edit duplicated entry with vim before adding]" {-i,--interactive}"[Select item to resume from a menu of matching entries]" "(--in=)--in=}[Add new entry to section]" {-n,--note=}"[Note]" "(--not)--not}[Resume items that *dont* match search/tag filterst* match search/tag filters]" {-s,--section=}"[Get last entry from a specific section]" "(--search=)--search=}[Repeat last entry matching search]" "(--tag=)--tag=}[Repeat last entry matching tags]" {-x,--exact}"[Force exact search string matching]" )
73
76
  ;;
74
77
  archive)
75
- args=( )
78
+ args=( "(--before=)--before=}[Archive entries older than date]" "(--bool=)--bool=}[Tag boolean]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-k,--keep=}"[How many items to keep]" "(--label)--label}[Label moved items with @from(SECTION_NAME)]" "(--not)--not}[Show items that *dont* match search stringt* match search string]" "(--search=)--search=}[Search filter]" {-t,--to=}"[Move entries to]" "(--tag=)--tag=}[Tag filter]" {-x,--exact}"[Force exact search string matching]" )
76
79
  ;;
77
80
  move)
78
- args=( )
81
+ args=( "(--before=)--before=}[Archive entries older than date]" "(--bool=)--bool=}[Tag boolean]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-k,--keep=}"[How many items to keep]" "(--label)--label}[Label moved items with @from(SECTION_NAME)]" "(--not)--not}[Show items that *dont* match search stringt* match search string]" "(--search=)--search=}[Search filter]" {-t,--to=}"[Move entries to]" "(--tag=)--tag=}[Tag filter]" {-x,--exact}"[Force exact search string matching]" )
79
82
  ;;
80
83
  autotag)
81
- args=( )
84
+ args=( "(--bool=)--bool=}[Boolean]" {-c,--count=}"[How many recent entries to autotag]" "(--force)--force}[Dont ask permission to autotag all entries when count is 0t ask permission to autotag all entries when count is 0]" {-i,--interactive}"[Select item(s) to tag from a menu of matching entries]" {-s,--section=}"[Section]" "(--search=)--search=}[Autotag entries matching search filter]" "(--tag=)--tag=}[Autotag the last X entries containing TAG]" {-u,--unfinished}"[Autotag last entry]" )
82
85
  ;;
83
86
  cancel)
87
+ args=( {-a,--archive}"[Archive entries]" "(--bool=)--bool=}[Boolean]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-i,--interactive}"[Select item(s) to cancel from a menu of matching entries]" "(--not)--not}[Finish items that *dont* match search/tag filterst* match search/tag filters]" {-s,--section=}"[Section]" "(--search=)--search=}[Cancel the last X entries matching search filter]" "(--tag=)--tag=}[Cancel the last X entries containing TAG]" {-u,--unfinished}"[Cancel last entry]" {-x,--exact}"[Force exact search string matching]" )
88
+ ;;
89
+ changelog)
90
+ args=( )
91
+ ;;
92
+ changes)
84
93
  args=( )
85
94
  ;;
86
95
  choose)
@@ -90,115 +99,118 @@ function _doing() {
90
99
  args=( )
91
100
  ;;
92
101
  completion)
93
- args=( )
102
+ args=( {-f,--file=}"[File to write output to]" {-t,--type=}"[Shell to generate for]" )
94
103
  ;;
95
104
  config)
96
- args=( )
105
+ args=( {-d,--dump}"[DEPRECATED]" {-u,--update}"[DEPRECATED]" )
97
106
  ;;
98
107
  done)
99
- args=( )
108
+ args=( {-a,--archive}"[Immediately archive the entry]" "(--at=)--at=}[Set finish date to specific date/time]" "(--started=)--started=}[Backdate start date by interval or set to time [4pm|20m|2h|"yesterday noon"]]" "(--date)--date}[Include date]" {-e,--editor}"[Edit entry with vim]" {-n,--note=}"[Include a note]" {-r,--remove}"[Remove @done tag]" {-s,--section=}"[Section]" {-t,--took=}"[Set completion date to start date plus interval]" {-u,--unfinished}"[Finish last entry not already marked @done]" )
100
109
  ;;
101
110
  did)
102
- args=( )
111
+ args=( {-a,--archive}"[Immediately archive the entry]" "(--at=)--at=}[Set finish date to specific date/time]" "(--started=)--started=}[Backdate start date by interval or set to time [4pm|20m|2h|"yesterday noon"]]" "(--date)--date}[Include date]" {-e,--editor}"[Edit entry with vim]" {-n,--note=}"[Include a note]" {-r,--remove}"[Remove @done tag]" {-s,--section=}"[Section]" {-t,--took=}"[Set completion date to start date plus interval]" {-u,--unfinished}"[Finish last entry not already marked @done]" )
103
112
  ;;
104
113
  finish)
105
- args=( )
114
+ args=( {-a,--archive}"[Archive entries]" "(--at=)--at=}[Set finish date to specific date/time]" "(--auto)--auto}[Auto-generate finish dates from next entrys start times start time]" {-b,--back=}"[Backdate completed date to date string [4pm|20m|2h|yesterday noon]]" "(--bool=)--bool=}[Boolean]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" "(--date)--date}[Include date]" {-i,--interactive}"[Select item(s) to finish from a menu of matching entries]" "(--not)--not}[Finish items that *dont* match search/tag filterst* match search/tag filters]" {-r,--remove}"[Remove done tag]" {-s,--section=}"[Section]" "(--search=)--search=}[Finish the last X entries matching search filter]" {-t,--took=}"[Set the completed date to the start date plus XX[hmd]]" "(--tag=)--tag=}[Finish the last X entries containing TAG]" {-u,--unfinished}"[Finish last entry]" {-x,--exact}"[Force exact search string matching]" )
106
115
  ;;
107
116
  grep)
108
- args=( )
117
+ args=( "(--after=)--after=}[Search entries newer than date]" "(--before=)--before=}[Search entries older than date]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" "(--duration)--duration}[Show elapsed time on entries without @done tag]" "(--from=)--from=}[Date range to show]" {-i,--interactive}"[Display an interactive menu of results to perform further operations]" "(--not)--not}[Show items that *dont* match search stringt* match search string]" {-o,--output=}"[Output to export format]" "(--only_timed)--only_timed}[Only show items with recorded time intervals]" {-s,--section=}"[Section]" {-t,--times}"[Show time intervals on @done tasks]" "(--tag_sort=)--tag_sort=}[Sort tags by]" "(--totals)--totals}[Show intervals with totals at the end of output]" {-x,--exact}"[Force exact string matching]" )
109
118
  ;;
110
119
  search)
111
- args=( )
120
+ args=( "(--after=)--after=}[Search entries newer than date]" "(--before=)--before=}[Search entries older than date]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" "(--duration)--duration}[Show elapsed time on entries without @done tag]" "(--from=)--from=}[Date range to show]" {-i,--interactive}"[Display an interactive menu of results to perform further operations]" "(--not)--not}[Show items that *dont* match search stringt* match search string]" {-o,--output=}"[Output to export format]" "(--only_timed)--only_timed}[Only show items with recorded time intervals]" {-s,--section=}"[Section]" {-t,--times}"[Show time intervals on @done tasks]" "(--tag_sort=)--tag_sort=}[Sort tags by]" "(--totals)--totals}[Show intervals with totals at the end of output]" {-x,--exact}"[Force exact string matching]" )
112
121
  ;;
113
122
  help)
114
123
  args=( )
115
124
  ;;
116
125
  import)
117
- args=( )
126
+ args=( "(--after=)--after=}[Import entries newer than date]" "(--autotag)--autotag}[Autotag entries]" "(--before=)--before=}[Import entries older than date]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-f,--from=}"[Date range to import]" "(--not)--not}[Import items that *dont* match search/tag/date filterst* match search/tag/date filters]" "(--only_timed)--only_timed}[Only import items with recorded time intervals]" "(--overlap)--overlap}[Allow entries that overlap existing times]" "(--prefix=)--prefix=}[Prefix entries with]" {-s,--section=}"[Target section]" "(--search=)--search=}[Only import items matching search]" "(--tag=)--tag=}[Tag all imported entries]" "(--type=)--type=}[Import type]" {-x,--exact}"[Force exact search string matching]" )
118
127
  ;;
119
128
  last)
120
- args=( )
129
+ args=( "(--bool=)--bool=}[Tag boolean]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" "(--duration)--duration}[Show elapsed time if entry is not tagged @done]" {-e,--editor}"[Edit entry with vim]" "(--not)--not}[Show items that *dont* match search string or tag filtert* match search string or tag filter]" {-s,--section=}"[Specify a section]" "(--search=)--search=}[Search filter]" "(--tag=)--tag=}[Tag filter]" {-x,--exact}"[Force exact search string matching]" )
121
130
  ;;
122
131
  later)
123
- args=( )
132
+ args=( {-b,--back=}"[Backdate start time to date string [4pm|20m|2h|yesterday noon]]" {-e,--editor}"[Edit entry with vim]" {-n,--note=}"[Note]" )
124
133
  ;;
125
134
  mark)
126
- args=( )
135
+ args=( "(--bool=)--bool=}[Boolean]" {-c,--count=}"[How many recent entries to tag]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-d,--date}"[Include current date/time with tag]" "(--force)--force}[Dont ask permission to flag all entries when count is 0t ask permission to flag all entries when count is 0]" {-i,--interactive}"[Select item(s) to flag from a menu of matching entries]" "(--not)--not}[Flag items that *dont* match search/tag/date filterst* match search/tag/date filters]" {-r,--remove}"[Remove flag]" {-s,--section=}"[Section]" "(--search=)--search=}[Flag the last entry matching search filter]" "(--tag=)--tag=}[Flag the last entry containing TAG]" {-u,--unfinished}"[Flag last entry]" {-x,--exact}"[Force exact search string matching]" )
127
136
  ;;
128
137
  flag)
129
- args=( )
138
+ args=( "(--bool=)--bool=}[Boolean]" {-c,--count=}"[How many recent entries to tag]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-d,--date}"[Include current date/time with tag]" "(--force)--force}[Dont ask permission to flag all entries when count is 0t ask permission to flag all entries when count is 0]" {-i,--interactive}"[Select item(s) to flag from a menu of matching entries]" "(--not)--not}[Flag items that *dont* match search/tag/date filterst* match search/tag/date filters]" {-r,--remove}"[Remove flag]" {-s,--section=}"[Section]" "(--search=)--search=}[Flag the last entry matching search filter]" "(--tag=)--tag=}[Flag the last entry containing TAG]" {-u,--unfinished}"[Flag last entry]" {-x,--exact}"[Force exact search string matching]" )
130
139
  ;;
131
140
  meanwhile)
132
- args=( )
141
+ args=( {-a,--archive}"[Archive previous @meanwhile entry]" {-b,--back=}"[Backdate start date for new entry to date string [4pm|20m|2h|yesterday noon]]" {-e,--editor}"[Edit entry with vim]" {-n,--note=}"[Note]" {-s,--section=}"[Section]" )
133
142
  ;;
134
143
  note)
135
- args=( )
144
+ args=( "(--bool=)--bool=}[Boolean]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-e,--editor}"[Edit entry with vim]" {-i,--interactive}"[Select item for new note from a menu of matching entries]" "(--not)--not}[Add note to item that *doesnt* match search/tag filterst* match search/tag filters]" {-r,--remove}"[Replace/Remove last entrys notes note]" {-s,--section=}"[Section]" "(--search=)--search=}[Add/remove note from last entry matching search filter]" "(--tag=)--tag=}[Add/remove note from last entry matching tag]" {-x,--exact}"[Force exact search string matching]" )
136
145
  ;;
137
146
  now)
138
- args=( )
147
+ args=( "(--started=)--started=}[Backdate start time [4pm|20m|2h|"yesterday noon"]]" {-e,--editor}"[Edit entry with vim]" {-f,--finish_last}"[Timed entry]" {-n,--note=}"[Include a note]" {-s,--section=}"[Section]" )
139
148
  ;;
140
149
  next)
141
- args=( )
150
+ args=( "(--started=)--started=}[Backdate start time [4pm|20m|2h|"yesterday noon"]]" {-e,--editor}"[Edit entry with vim]" {-f,--finish_last}"[Timed entry]" {-n,--note=}"[Include a note]" {-s,--section=}"[Section]" )
142
151
  ;;
143
152
  on)
144
- args=( )
153
+ args=( "(--duration)--duration}[Show elapsed time on entries without @done tag]" {-o,--output=}"[Output to export format]" {-s,--section=}"[Section]" {-t,--times}"[Show time intervals on @done tasks]" "(--tag_sort=)--tag_sort=}[Sort tags by]" "(--totals)--totals}[Show time totals at the end of output]" )
145
154
  ;;
146
155
  open)
147
- args=( )
156
+ args=( {-a,--app=}"[Open with app name]" {-b,--bundle_id=}"[Open with app bundle id]" {-e,--editor=}"[Open with editor command]" )
148
157
  ;;
149
158
  plugins)
150
- args=( )
159
+ args=( {-c,--column}"[List in single column for completion]" {-t,--type=}"[List plugins of type]" )
151
160
  ;;
152
161
  recent)
153
- args=( )
162
+ args=( "(--duration)--duration}[Show elapsed time on entries without @done tag]" {-i,--interactive}"[Select from a menu of matching entries to perform additional operations]" {-s,--section=}"[Section]" {-t,--times}"[Show time intervals on @done tasks]" "(--tag_sort=)--tag_sort=}[Sort tags by]" "(--totals)--totals}[Show intervals with totals at the end of output]" )
154
163
  ;;
155
164
  reset)
156
- args=( )
165
+ args=( "(--bool=)--bool=}[Boolean]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-i,--interactive}"[Select from a menu of matching entries]" "(--not)--not}[Reset items that *dont* match search/tag filterst* match search/tag filters]" {-r,--resume}"[Resume entry]" {-s,--section=}"[Limit search to section]" "(--search=)--search=}[Reset last entry matching search filter]" "(--tag=)--tag=}[Reset last entry matching tag]" {-x,--exact}"[Force exact search string matching]" )
157
166
  ;;
158
167
  begin)
159
- args=( )
168
+ args=( "(--bool=)--bool=}[Boolean]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-i,--interactive}"[Select from a menu of matching entries]" "(--not)--not}[Reset items that *dont* match search/tag filterst* match search/tag filters]" {-r,--resume}"[Resume entry]" {-s,--section=}"[Limit search to section]" "(--search=)--search=}[Reset last entry matching search filter]" "(--tag=)--tag=}[Reset last entry matching tag]" {-x,--exact}"[Force exact search string matching]" )
160
169
  ;;
161
170
  rotate)
162
- args=( )
171
+ args=( "(--before=)--before=}[Rotate entries older than date]" "(--bool=)--bool=}[Tag boolean]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-k,--keep=}"[How many items to keep in each section]" "(--not)--not}[Rotate items that *dont* match search string or tag filtert* match search string or tag filter]" {-s,--section=}"[Section to rotate]" "(--search=)--search=}[Search filter]" "(--tag=)--tag=}[Tag filter]" {-x,--exact}"[Force exact search string matching]" )
163
172
  ;;
164
173
  sections)
165
- args=( )
174
+ args=( {-c,--column}"[List in single column]" )
166
175
  ;;
167
176
  select)
168
- args=( )
177
+ args=( {-a,--archive}"[Archive selected items]" "(--after=)--after=}[Select from entries newer than date]" "(--resume)--resume}[Copy selection as a new entry with current time and no @done tag]" "(--before=)--before=}[Select from entries older than date]" {-c,--cancel}"[Cancel selected items]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-d,--delete}"[Delete selected items]" {-e,--editor}"[Edit selected item(s)]" {-f,--finish}"[Add @done with current time to selected item(s)]" "(--flag)--flag}[Add flag to selected item(s)]" "(--force)--force}[Perform action without confirmation]" "(--from=)--from=}[Date range to show]" {-m,--move=}"[Move selected items to section]" "(--menu)--menu}[Use --no-menu to skip the interactive menu]" "(--not)--not}[Select items that *dont* match search/tag filterst* match search/tag filters]" {-o,--output=}"[Output entries to format]" "(--search=)--search=}[Initial search query for filtering]" {-r,--remove}"[Reverse -c]" {-s,--section=}"[Select from a specific section]" "(--save_to=)--save_to=}[Save selected entries to file using --output format]" {-t,--tag=}"[Tag selected entries]" {-x,--exact}"[Force exact search string matching]" )
169
178
  ;;
170
179
  show)
171
- args=( )
180
+ args=( {-a,--age=}"[Age]" "(--after=)--after=}[Show entries newer than date]" {-b,--bool=}"[Tag boolean]" "(--before=)--before=}[Show entries older than date]" {-c,--count=}"[Max count to show]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" "(--duration)--duration}[Show elapsed time on entries without @done tag]" "(--from=)--from=}[Date range to show]" {-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)--not}[Show items that *dont* match search/tag/date filterst* match search/tag/date filters]" {-o,--output=}"[Output to export format]" "(--only_timed)--only_timed}[Only show items with recorded time intervals]" {-s,--sort=}"[Sort order]" "(--search=)--search=}[Search filter]" {-t,--times}"[Show time intervals on @done tasks]" "(--tag=)--tag=}[Tag filter]" "(--tag_order=)--tag_order=}[Tag sort direction]" "(--tag_sort=)--tag_sort=}[Sort tags by]" "(--totals)--totals}[Show intervals with totals at the end of output]" {-x,--exact}"[Force exact search string matching]" )
172
181
  ;;
173
182
  since)
174
- args=( )
183
+ args=( "(--duration)--duration}[Show elapsed time on entries without @done tag]" {-o,--output=}"[Output to export format]" {-s,--section=}"[Section]" {-t,--times}"[Show time intervals on @done tasks]" "(--tag_sort=)--tag_sort=}[Sort tags by]" "(--totals)--totals}[Show time totals at the end of output]" )
175
184
  ;;
176
185
  tag)
177
- args=( )
186
+ args=( {-a,--autotag}"[Autotag entries based on autotag configuration in ~/]" "(--bool=)--bool=}[Boolean]" {-c,--count=}"[How many recent entries to tag]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-d,--date}"[Include current date/time with tag]" "(--force)--force}[Dont ask permission to tag all entries when count is 0t ask permission to tag all entries when count is 0]" {-i,--interactive}"[Select item(s) to tag from a menu of matching entries]" "(--not)--not}[Tag items that *dont* match search/tag filterst* match search/tag filters]" {-r,--remove}"[Remove given tag(s)]" "(--regex)--regex}[Interpret tag string as regular expression]" "(--rename=)--rename=}[Replace existing tag with tag argument]" {-s,--section=}"[Section]" "(--search=)--search=}[Tag entries matching search filter]" "(--tag=)--tag=}[Tag the last X entries containing TAG]" {-u,--unfinished}"[Tag last entry]" {-x,--exact}"[Force exact search string matching]" )
187
+ ;;
188
+ tags)
189
+ args=( "(--bool=)--bool=}[Boolean used to combine multiple tags]" {-c,--counts}"[Show count of occurrences]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" {-i,--interactive}"[Select items to scan from a menu of matching entries]" "(--not)--not}[Get tags from items that *dont* match search/tag filterst* match search/tag filters]" {-o,--order=}"[Sort order]" {-s,--section=}"[Section]" "(--search=)--search=}[Get tags for items matching search]" "(--sort=)--sort=}[Sort by name or count]" "(--tag=)--tag=}[Get tags for entries matching tags]" {-x,--exact}"[Force exact search string matching]" )
178
190
  ;;
179
191
  template)
180
- args=( )
192
+ args=( {-c,--column}"[List in single column for completion]" {-l,--list}"[List all available templates]" {-p,--path=}"[Save template to alternate location]" {-s,--save}"[Save template to file instead of STDOUT]" )
181
193
  ;;
182
194
  test)
183
195
  args=( )
184
196
  ;;
185
197
  today)
186
- args=( )
198
+ args=( "(--after=)--after=}[View entries after specified time]" "(--before=)--before=}[View entries before specified time]" "(--duration)--duration}[Show elapsed time on entries without @done tag]" "(--from=)--from=}[Time range to show `doing today --from "12pm to 4pm"`]" {-o,--output=}"[Output to export format]" {-s,--section=}"[Specify a section]" {-t,--times}"[Show time intervals on @done tasks]" "(--tag_sort=)--tag_sort=}[Sort tags by]" "(--totals)--totals}[Show time totals at the end of output]" )
187
199
  ;;
188
200
  undo)
189
- args=( )
201
+ args=( {-f,--file=}"[Specify alternate doing file]" {-i,--interactive}"[Select from recent backups]" {-p,--prune=}"[Remove old backups]" {-r,--redo}"[Redo last undo]" )
190
202
  ;;
191
203
  view)
192
- args=( )
204
+ args=( "(--after=)--after=}[View entries newer than date]" {-b,--bool=}"[Tag boolean]" "(--before=)--before=}[View entries older than date]" {-c,--count=}"[Count to display]" "(--case=)--case=}[Case sensitivity for search string matching [(c)ase-sensitive]" "(--color)--color}[Include colors in output]" "(--duration)--duration}[Show elapsed time on entries without @done tag]" "(--from=)--from=}[Date range to show]" {-i,--interactive}"[Select from a menu of matching entries to perform additional operations]" "(--not)--not}[Show items that *dont* match search stringt* match search string]" {-o,--output=}"[Output to export format]" "(--only_timed)--only_timed}[Only show items with recorded time intervals]" {-s,--section=}"[Section]" "(--search=)--search=}[Search filter]" {-t,--times}"[Show time intervals on @done tasks]" "(--tag=)--tag=}[Tag filter]" "(--tag_order=)--tag_order=}[Tag sort direction]" "(--tag_sort=)--tag_sort=}[Sort tags by]" "(--totals)--totals}[Show intervals with totals at the end of output]" {-x,--exact}"[Force exact search string matching]" )
193
205
  ;;
194
206
  views)
195
- args=( )
207
+ args=( {-c,--column}"[List in single column]" )
196
208
  ;;
197
209
  wiki)
198
- args=( )
210
+ args=( "(--after=)--after=}[Include entries newer than date]" {-b,--bool=}"[Tag boolean]" "(--before=)--before=}[Include entries older than date]" {-f,--from=}"[Date range to include]" "(--only_timed)--only_timed}[Only show items with recorded time intervals]" {-s,--section=}"[Section to rotate]" "(--search=)--search=}[Search filter]" "(--tag=)--tag=}[Tag filter]" )
199
211
  ;;
200
212
  yesterday)
201
- args=( )
213
+ args=( "(--after=)--after=}[View entries after specified time]" "(--before=)--before=}[View entries before specified time]" "(--duration)--duration}[Show elapsed time on entries without @done tag]" "(--from=)--from=}[Time range to show]" {-o,--output=}"[Output to export format]" {-s,--section=}"[Specify a section]" {-t,--times}"[Show time intervals on @done tasks]" "(--tag_order=)--tag_order=}[Tag sort direction]" "(--tag_sort=)--tag_sort=}[Sort tags by]" "(--totals)--totals}[Show time totals at the end of output]" )
202
214
  ;;
203
215
  esac
204
216
 
@@ -276,9 +276,9 @@ local words=$(doing sections)
276
276
  IFS="$OLD_IFS"
277
277
 
278
278
  if [[ "$token" == --* ]]; then
279
- COMPREPLY=( $( compgen -W '--age --after --bool --before --count --case --duration --from --interactive --not --output --only_timed --sort --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
279
+ COMPREPLY=( $( compgen -W '--age --after --bool --before --count --case --duration --from --interactive --menu --not --output --only_timed --sort --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
280
280
  elif [[ "$token" == -* ]]; then
281
- COMPREPLY=( $( compgen -W '-a -b -c -i -o -s -t -x --age --after --bool --before --count --case --duration --from --interactive --not --output --only_timed --sort --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
281
+ COMPREPLY=( $( compgen -W '-a -b -c -i -m -o -s -t -x --age --after --bool --before --count --case --duration --from --interactive --menu --not --output --only_timed --sort --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
282
282
  else
283
283
  local nocasematchWasOff=0
284
284
  shopt nocasematch >/dev/null || nocasematchWasOff=1
@@ -318,12 +318,22 @@ _doing_tag() {
318
318
  fi
319
319
  }
320
320
 
321
+ _doing_tags() {
322
+
323
+ if [[ "$token" == --* ]]; then
324
+ COMPREPLY=( $( compgen -W '--bool --counts --case --interactive --not --order --section --search --sort --tag --exact' -- $token ) )
325
+ elif [[ "$token" == -* ]]; then
326
+ COMPREPLY=( $( compgen -W '-c -i -o -s -x --bool --counts --case --interactive --not --order --section --search --sort --tag --exact' -- $token ) )
327
+
328
+ fi
329
+ }
330
+
321
331
  _doing_template() {
322
332
 
323
333
  if [[ "$token" == --* ]]; then
324
- COMPREPLY=( $( compgen -W '--column --list' -- $token ) )
334
+ COMPREPLY=( $( compgen -W '--column --list --path --save' -- $token ) )
325
335
  elif [[ "$token" == -* ]]; then
326
- COMPREPLY=( $( compgen -W '-c -l --column --list' -- $token ) )
336
+ COMPREPLY=( $( compgen -W '-c -l -p -s --column --list --path --save' -- $token ) )
327
337
 
328
338
  fi
329
339
  }
@@ -341,9 +351,9 @@ _doing_today() {
341
351
  _doing_undo() {
342
352
 
343
353
  if [[ "$token" == --* ]]; then
344
- COMPREPLY=( $( compgen -W '--file' -- $token ) )
354
+ COMPREPLY=( $( compgen -W '--file --interactive --prune --redo' -- $token ) )
345
355
  elif [[ "$token" == -* ]]; then
346
- COMPREPLY=( $( compgen -W '-f --file' -- $token ) )
356
+ COMPREPLY=( $( compgen -W '-f -i -p -r --file --interactive --prune --redo' -- $token ) )
347
357
 
348
358
  fi
349
359
  }
@@ -441,6 +451,7 @@ _doing()
441
451
  elif [[ $last =~ (show) ]]; then _doing_show
442
452
  elif [[ $last =~ (since) ]]; then _doing_since
443
453
  elif [[ $last =~ (tag) ]]; then _doing_tag
454
+ elif [[ $last =~ (tags) ]]; then _doing_tags
444
455
  elif [[ $last =~ (template) ]]; then _doing_template
445
456
  elif [[ $last =~ (today) ]]; then _doing_today
446
457
  elif [[ $last =~ (undo) ]]; then _doing_undo