doing 2.1.39 → 2.1.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/CHANGELOG.md +67 -0
  4. data/Gemfile.lock +1 -1
  5. data/README.md +1 -1
  6. data/Rakefile +4 -4
  7. data/bin/commands/again.rb +1 -3
  8. data/bin/commands/changes.rb +50 -34
  9. data/bin/commands/commands.rb +77 -52
  10. data/bin/commands/commands_accepting.rb +57 -53
  11. data/bin/commands/config.rb +45 -36
  12. data/bin/commands/done.rb +1 -18
  13. data/bin/commands/finish.rb +90 -59
  14. data/bin/commands/flag.rb +5 -1
  15. data/bin/commands/grep.rb +3 -14
  16. data/bin/commands/last.rb +2 -8
  17. data/bin/commands/meanwhile.rb +13 -6
  18. data/bin/commands/now.rb +151 -107
  19. data/bin/commands/on.rb +8 -18
  20. data/bin/commands/recent.rb +2 -8
  21. data/bin/commands/reset.rb +24 -1
  22. data/bin/commands/select.rb +1 -1
  23. data/bin/commands/show.rb +6 -17
  24. data/bin/commands/since.rb +1 -12
  25. data/bin/commands/tag_dir.rb +49 -15
  26. data/bin/commands/today.rb +2 -13
  27. data/bin/commands/undo.rb +4 -6
  28. data/bin/commands/view.rb +1 -1
  29. data/bin/commands/yesterday.rb +2 -13
  30. data/bin/doing +15 -8
  31. data/{Dockerfile → docker/Dockerfile} +3 -1
  32. data/{Dockerfile-2.6 → docker/Dockerfile-2.6} +2 -2
  33. data/{Dockerfile-2.7 → docker/Dockerfile-2.7} +2 -2
  34. data/{Dockerfile-3.0 → docker/Dockerfile-3.0} +2 -2
  35. data/{bash_profile → docker/bash_profile} +0 -0
  36. data/{inputrc → docker/inputrc} +0 -0
  37. data/docs/doc/Array.html +85 -2
  38. data/docs/doc/BooleanTermParser/Clause.html +1 -1
  39. data/docs/doc/BooleanTermParser/Operator.html +1 -1
  40. data/docs/doc/BooleanTermParser/Query.html +1 -1
  41. data/docs/doc/BooleanTermParser/QueryParser.html +1 -1
  42. data/docs/doc/BooleanTermParser/QueryTransformer.html +1 -1
  43. data/docs/doc/BooleanTermParser.html +1 -1
  44. data/docs/doc/Doing/ArrayNestedHash.html +198 -0
  45. data/docs/doc/Doing/ArrayTags.html +424 -0
  46. data/docs/doc/Doing/CSVExport.html +266 -0
  47. data/docs/doc/Doing/CalendarImport.html +232 -0
  48. data/docs/doc/Doing/Change.html +617 -0
  49. data/docs/doc/Doing/Changes.html +468 -0
  50. data/docs/doc/Doing/ChronifyArray.html +347 -0
  51. data/docs/doc/Doing/ChronifyNumeric.html +271 -0
  52. data/docs/doc/Doing/ChronifyString.html +682 -0
  53. data/docs/doc/Doing/Color.html +167 -21
  54. data/docs/doc/Doing/Completion/BashCompletions.html +445 -0
  55. data/docs/doc/Doing/Completion/FishCompletions.html +445 -0
  56. data/docs/doc/Doing/Completion/StringUtils.html +229 -0
  57. data/docs/doc/Doing/Completion/ZshCompletions.html +445 -0
  58. data/docs/doc/Doing/Completion.html +17 -3
  59. data/docs/doc/Doing/Configuration.html +3 -2
  60. data/docs/doc/Doing/DayOneRenderer.html +383 -0
  61. data/docs/doc/Doing/DayoneExport.html +290 -0
  62. data/docs/doc/Doing/DoingImport.html +391 -0
  63. data/docs/doc/Doing/Entry.html +381 -0
  64. data/docs/doc/Doing/Errors/DoingNoTraceError.html +7 -3
  65. data/docs/doc/Doing/Errors/DoingRuntimeError.html +7 -3
  66. data/docs/doc/Doing/Errors/DoingStandardError.html +1 -1
  67. data/docs/doc/Doing/Errors/EmptyInput.html +10 -2
  68. data/docs/doc/Doing/Errors/HistoryLimitError.html +194 -0
  69. data/docs/doc/Doing/Errors/InvalidPlugin.html +194 -0
  70. data/docs/doc/Doing/Errors/MissingBackupFile.html +194 -0
  71. data/docs/doc/Doing/Errors/NoResults.html +10 -2
  72. data/docs/doc/Doing/Errors/PluginException.html +1 -1
  73. data/docs/doc/Doing/Errors/UserCancelled.html +10 -2
  74. data/docs/doc/Doing/Errors/WrongCommand.html +10 -2
  75. data/docs/doc/Doing/Errors.html +9 -9
  76. data/docs/doc/Doing/HTMLExport.html +256 -0
  77. data/docs/doc/Doing/Hooks.html +1 -1
  78. data/docs/doc/Doing/Item.html +179 -1660
  79. data/docs/doc/Doing/ItemDates.html +564 -0
  80. data/docs/doc/Doing/ItemQuery.html +614 -0
  81. data/docs/doc/Doing/ItemState.html +387 -0
  82. data/docs/doc/Doing/ItemTags.html +498 -0
  83. data/docs/doc/Doing/Items.html +581 -15
  84. data/docs/doc/Doing/JSONExport.html +222 -0
  85. data/docs/doc/Doing/Logger.html +1 -1
  86. data/docs/doc/Doing/MarkdownExport.html +266 -0
  87. data/docs/doc/Doing/MarkdownRenderer.html +383 -0
  88. data/docs/doc/Doing/Note.html +18 -4
  89. data/docs/doc/Doing/Pager.html +1 -1
  90. data/docs/doc/Doing/Plugins.html +181 -76
  91. data/docs/doc/Doing/Prompt.html +32 -683
  92. data/docs/doc/Doing/PromptChoose.html +484 -0
  93. data/docs/doc/Doing/PromptFZF.html +391 -0
  94. data/docs/doc/Doing/PromptInput.html +572 -0
  95. data/docs/doc/Doing/PromptSTD.html +293 -0
  96. data/docs/doc/Doing/PromptYN.html +237 -0
  97. data/docs/doc/Doing/Section.html +58 -2
  98. data/docs/doc/Doing/StringHighlight.html +533 -0
  99. data/docs/doc/Doing/StringNormalize.html +929 -0
  100. data/docs/doc/Doing/StringQuery.html +725 -0
  101. data/docs/doc/Doing/StringTags.html +884 -0
  102. data/docs/doc/Doing/StringTransform.html +599 -0
  103. data/docs/doc/Doing/StringTruncate.html +448 -0
  104. data/docs/doc/Doing/StringURL.html +409 -0
  105. data/docs/doc/Doing/SymbolNormalize.html +341 -0
  106. data/docs/doc/Doing/TaskPaperExport.html +222 -0
  107. data/docs/doc/Doing/TemplateExport.html +249 -0
  108. data/docs/doc/Doing/TemplateString.html +102 -3
  109. data/docs/doc/Doing/TimingImport.html +285 -0
  110. data/docs/doc/Doing/Types.html +1 -1
  111. data/docs/doc/Doing/Util/Backup.html +11 -163
  112. data/docs/doc/Doing/Util.html +67 -10
  113. data/docs/doc/Doing/Version.html +523 -0
  114. data/docs/doc/Doing/WWID/WWIDUtil.html +510 -0
  115. data/docs/doc/Doing/WWID.html +476 -139
  116. data/docs/doc/Doing/WWIDDisplay.html +865 -0
  117. data/docs/doc/Doing/WWIDEditor.html +466 -0
  118. data/docs/doc/Doing/WWIDFileTools.html +359 -0
  119. data/docs/doc/Doing/WWIDFilter.html +466 -0
  120. data/docs/doc/Doing/WWIDGuess.html +299 -0
  121. data/docs/doc/Doing/WWIDInteractive.html +752 -0
  122. data/docs/doc/Doing/WWIDModify.html +1078 -0
  123. data/docs/doc/Doing/WWIDTags.html +302 -0
  124. data/docs/doc/Doing/WWIDTimers.html +359 -0
  125. data/docs/doc/Doing/WWIDUtil.html +510 -0
  126. data/docs/doc/Doing.html +9 -6
  127. data/docs/doc/FalseClass.html +1 -1
  128. data/docs/doc/GLI/Commands/Help.html +1 -1
  129. data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  130. data/docs/doc/GLI/Commands.html +1 -1
  131. data/docs/doc/GLI.html +1 -1
  132. data/docs/doc/Hash.html +1 -1
  133. data/docs/doc/Numeric.html +23 -78
  134. data/docs/doc/Object.html +1 -1
  135. data/docs/doc/PhraseParser/Operator.html +1 -1
  136. data/docs/doc/PhraseParser/PhraseClause.html +1 -1
  137. data/docs/doc/PhraseParser/Query.html +1 -1
  138. data/docs/doc/PhraseParser/QueryParser.html +1 -1
  139. data/docs/doc/PhraseParser/QueryTransformer.html +1 -1
  140. data/docs/doc/PhraseParser/TermClause.html +1 -1
  141. data/docs/doc/PhraseParser.html +1 -1
  142. data/docs/doc/Status.html +1 -1
  143. data/docs/doc/String.html +58 -633
  144. data/docs/doc/Symbol.html +9 -224
  145. data/docs/doc/Time.html +119 -13
  146. data/docs/doc/TrueClass.html +1 -1
  147. data/docs/doc/_index.html +348 -4
  148. data/docs/doc/class_list.html +1 -1
  149. data/docs/doc/file.README.html +2 -2
  150. data/docs/doc/index.html +2 -2
  151. data/docs/doc/method_list.html +1904 -592
  152. data/docs/doc/top-level-namespace.html +12 -4
  153. data/docs/index.md +1 -1
  154. data/doing.rdoc +67 -15
  155. data/lib/completion/_doing.zsh +6 -6
  156. data/lib/completion/doing.bash +10 -10
  157. data/lib/completion/doing.fish +10 -3
  158. data/lib/doing/add_options.rb +39 -1
  159. data/lib/doing/array/array.rb +18 -12
  160. data/lib/doing/array/cleanup.rb +31 -0
  161. data/lib/doing/array/nested_hash.rb +1 -1
  162. data/lib/doing/array/tags.rb +6 -5
  163. data/lib/doing/changelog/changelog.rb +6 -0
  164. data/lib/doing/chronify/array.rb +65 -25
  165. data/lib/doing/chronify/chronify.rb +12 -0
  166. data/lib/doing/chronify/numeric.rb +3 -2
  167. data/lib/doing/chronify/string.rb +1 -1
  168. data/lib/doing/colors.rb +77 -30
  169. data/lib/doing/completion/completion_string.rb +25 -0
  170. data/lib/doing/completion.rb +4 -5
  171. data/lib/doing/configuration.rb +7 -3
  172. data/lib/doing/errors.rb +51 -35
  173. data/lib/doing/good.rb +8 -0
  174. data/lib/doing/hooks.rb +3 -3
  175. data/lib/doing/item/dates.rb +112 -0
  176. data/lib/doing/item/item.rb +128 -0
  177. data/lib/doing/{item.rb → item/query.rb} +2 -353
  178. data/lib/doing/item/state.rb +59 -0
  179. data/lib/doing/item/tags.rb +87 -0
  180. data/lib/doing/items/filter.rb +67 -0
  181. data/lib/doing/items/items.rb +57 -0
  182. data/lib/doing/items/modify.rb +36 -0
  183. data/lib/doing/items/sections.rb +83 -0
  184. data/lib/doing/items/util.rb +74 -0
  185. data/lib/doing/normalize.rb +10 -2
  186. data/lib/doing/note.rb +1 -1
  187. data/lib/doing/pager.rb +9 -3
  188. data/lib/doing/plugin_manager.rb +33 -8
  189. data/lib/doing/plugins/export/markdown_export.rb +4 -2
  190. data/lib/doing/plugins/export/template_export.rb +4 -4
  191. data/lib/doing/plugins/import/cal_to_json.scpt +0 -0
  192. data/lib/doing/plugins/import/doing_import.rb +1 -1
  193. data/lib/doing/prompt/choose.rb +118 -0
  194. data/lib/doing/prompt/fzf.rb +84 -0
  195. data/lib/doing/prompt/input.rb +129 -0
  196. data/lib/doing/prompt/prompt.rb +41 -0
  197. data/lib/doing/prompt/std.rb +32 -0
  198. data/lib/doing/prompt/yn.rb +64 -0
  199. data/lib/doing/section.rb +4 -0
  200. data/lib/doing/string/highlight.rb +1 -1
  201. data/lib/doing/string/query.rb +1 -1
  202. data/lib/doing/string/string.rb +18 -7
  203. data/lib/doing/string/tags.rb +14 -3
  204. data/lib/doing/string/transform.rb +7 -1
  205. data/lib/doing/string/truncate.rb +1 -1
  206. data/lib/doing/string/url.rb +1 -1
  207. data/lib/doing/time.rb +19 -1
  208. data/lib/doing/util.rb +12 -6
  209. data/lib/doing/util_backup.rb +62 -57
  210. data/lib/doing/version.rb +1 -1
  211. data/lib/doing/wwid/display.rb +396 -0
  212. data/lib/doing/wwid/editor.rb +214 -0
  213. data/lib/doing/wwid/filetools.rb +183 -0
  214. data/lib/doing/wwid/filter.rb +226 -0
  215. data/lib/doing/wwid/guess.rb +85 -0
  216. data/lib/doing/wwid/interactive.rb +377 -0
  217. data/lib/doing/wwid/modify.rb +617 -0
  218. data/lib/doing/wwid/tags.rb +51 -0
  219. data/lib/doing/wwid/timers.rb +342 -0
  220. data/lib/doing/wwid/wwid.rb +121 -0
  221. data/lib/doing/wwid/wwidutil.rb +101 -0
  222. data/lib/doing.rb +7 -7
  223. data/lib/helpers/threaded_tests.rb +1 -0
  224. metadata +94 -14
  225. data/lib/doing/changelog.rb +0 -6
  226. data/lib/doing/completion/string.rb +0 -17
  227. data/lib/doing/items.rb +0 -196
  228. data/lib/doing/prompt.rb +0 -330
  229. data/lib/doing/wwid.rb +0 -2398
@@ -86,7 +86,7 @@
86
86
 
87
87
 
88
88
 
89
- <strong class="classes">Classes:</strong> <span class='object_link'><a href="Array.html" title="Array (class)">Array</a></span>, <span class='object_link'><a href="FalseClass.html" title="FalseClass (class)">FalseClass</a></span>, <span class='object_link'><a href="Hash.html" title="Hash (class)">Hash</a></span>, <span class='object_link'><a href="Object.html" title="Object (class)">Object</a></span>, <span class='object_link'><a href="String.html" title="String (class)">String</a></span>, <span class='object_link'><a href="Symbol.html" title="Symbol (class)">Symbol</a></span>, <span class='object_link'><a href="Time.html" title="Time (class)">Time</a></span>, <span class='object_link'><a href="TrueClass.html" title="TrueClass (class)">TrueClass</a></span>
89
+ <strong class="classes">Classes:</strong> <span class='object_link'><a href="Array.html" title="Array (class)">Array</a></span>, <span class='object_link'><a href="FalseClass.html" title="FalseClass (class)">FalseClass</a></span>, <span class='object_link'><a href="Hash.html" title="Hash (class)">Hash</a></span>, <span class='object_link'><a href="Numeric.html" title="Numeric (class)">Numeric</a></span>, <span class='object_link'><a href="Object.html" title="Object (class)">Object</a></span>, <span class='object_link'><a href="String.html" title="String (class)">String</a></span>, <span class='object_link'><a href="Symbol.html" title="Symbol (class)">Symbol</a></span>, <span class='object_link'><a href="Time.html" title="Time (class)">Time</a></span>, <span class='object_link'><a href="TrueClass.html" title="TrueClass (class)">TrueClass</a></span>
90
90
 
91
91
 
92
92
  </p>
@@ -108,7 +108,7 @@
108
108
  <li class="public ">
109
109
  <span class="summary_signature">
110
110
 
111
- <a href="top-level-namespace.html#add_options-instance_method" title="#add_options (instance method)">#<strong>add_options</strong>(type, cmd) &#x21d2; Object </a>
111
+ <a href="top-level-namespace.html#add_options-instance_method" title="#add_options (instance method)">#<strong>add_options</strong>(type, cmd, default_template: &#39;default&#39;) &#x21d2; Object </a>
112
112
 
113
113
 
114
114
 
@@ -140,7 +140,7 @@
140
140
  <div class="method_details first">
141
141
  <h3 class="signature first" id="add_options-instance_method">
142
142
 
143
- #<strong>add_options</strong>(type, cmd) &#x21d2; <tt><span class='object_link'><a href="Object.html" title="Object (class)">Object</a></span></tt>
143
+ #<strong>add_options</strong>(type, cmd, default_template: &#39;default&#39;) &#x21d2; <tt><span class='object_link'><a href="Object.html" title="Object (class)">Object</a></span></tt>
144
144
 
145
145
 
146
146
 
@@ -150,12 +150,20 @@
150
150
  <div class="discussion">
151
151
  <p>Add presets of flags and switches to a command.</p>
152
152
 
153
+ <p>:output_template =&gt; --output, --config_template, --template</p>
154
+
153
155
  <p>:add_entry =&gt; --noauto, --note, --ask, --editor, --back</p>
154
156
 
157
+ <p>:finish_entry =&gt; --at/finished, --from, --took</p>
158
+
159
+ <p>:time_display =&gt; --times, --duration, --totals, --tag_sort, --tag_order, --only_timed</p>
160
+
155
161
  <p>:search =&gt; --search, --case, --exact</p>
156
162
 
157
163
  <p>:tag_filter =&gt; --tag, --bool, --not, --val</p>
158
164
 
165
+ <p>:time_filter =&gt; --before, --after, --from</p>
166
+
159
167
  <p>:date_filter =&gt; --before, --after, --from</p>
160
168
 
161
169
 
@@ -206,7 +214,7 @@
206
214
  </div>
207
215
 
208
216
  <div id="footer">
209
- Generated on Sun Mar 13 05:08:08 2022 by
217
+ Generated on Fri Mar 18 12:56:57 2022 by
210
218
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
211
219
  0.9.27 (ruby-3.0.1).
212
220
  </div>
data/docs/index.md CHANGED
@@ -8,7 +8,7 @@ _If you're one of the rare people like me who find this useful, feel free to
8
8
 
9
9
 
10
10
 
11
- The current version of `doing` is 2.1.31.
11
+ The current version of `doing` is 2.1.39.
12
12
 
13
13
  Find all of the documentation in the [doing wiki][wiki].
14
14
 
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.39
8
+ v2.1.42
9
9
 
10
10
  === Global Options
11
11
  === --config_file arg
@@ -435,17 +435,17 @@ Display a formatted list of changes in recent versions.
435
435
  ===== -l|--lookup VERSION
436
436
 
437
437
  Look up a specific version. Specify versions as "MAJ.MIN.PATCH", MIN
438
- and PATCH are optional. Use > or < to see all changes since or prior
439
- to a version. Wildcards (*?) accepted unless using < or >.
438
+ and PATCH are optional. Use > or < to see all changes since or prior
439
+ to a version. Wildcards (*?) accepted unless using < or >.
440
440
 
441
441
  [Default Value] None
442
- [Must Match] (?-mix:^(?:(?:(?:[<>=]+|p(?:rior)|b(?:efore)|o(?:lder)|s(?:ince)|a(?:fter)|n(?:ewer))? *[0-9.*?]+ *)+|(?:[\d.]+ *(?:-|to)+ *[0-9.]+))$)
442
+ [Must Match] (?-mix:^(?:(?:(?:[<>=]+|p(?:rior)|b(?:efore)|o(?:lder)|s(?:ince)|a(?:fter)|n(?:ewer))? *[0-9.*?]{1,10} *)+|(?:[\d.]+ *(?:-|to)+ *[0-9.]{1,10}))$)
443
443
 
444
444
 
445
445
  ===== -s|--search arg
446
446
 
447
447
  Show changelogs matching search terms (uses pattern-based searching).
448
- Add slashes to search with regular expressions, e.g. `--search "/output.*flag/"`
448
+ Add slashes to search with regular expressions, e.g. `--search "/output.*flag/"`
449
449
 
450
450
  [Default Value] None
451
451
 
@@ -645,7 +645,7 @@ way to add entries in post and maintain accurate (albeit manual) time tracking.
645
645
  ===== --at|--finished DATE_STRING
646
646
 
647
647
  Set finish date to specific date/time (natural langauge parsed, e.g. --at=1:30pm).
648
- Used with --took, backdates start date
648
+ Used with --took, backdates start date
649
649
 
650
650
  [Default Value] None
651
651
 
@@ -660,7 +660,7 @@ Backdate start date for new entry to date string [4pm|20m|2h|yesterday noon]
660
660
  ===== --from TIME_RANGE
661
661
 
662
662
  Start and end times as a date/time range `doing done --from "1am to 8am"`.
663
- Overrides other date flags.
663
+ Overrides other date flags.
664
664
 
665
665
  [Default Value] None
666
666
  [Must Match] (?i-mx:^\S+.*? +(?:to|through|thru|(?:un)?til|-+) +\S+.*?$)
@@ -683,8 +683,8 @@ Section
683
683
  ===== -t|--took|--for INTERVAL
684
684
 
685
685
  Set completion date to start date plus interval (XX[mhd] or HH:MM).
686
- If used without the --back option, the start date will be moved back to allow
687
- the completion date to be the current time.
686
+ If used without the --back option, the start date will be moved back to allow
687
+ the completion date to be the current time.
688
688
 
689
689
  [Default Value] None
690
690
 
@@ -731,7 +731,8 @@ Marks the last X entries with a @done tag and current date. Does not alter alrea
731
731
  ===== Options
732
732
  ===== --at|--finished DATE_STRING
733
733
 
734
- Set finish date to specific date/time (natural langauge parsed, e.g. --at=1:30pm). If used, ignores --back.
734
+ Set finish date to specific date/time (natural langauge parsed, e.g. --at=1:30pm).
735
+ Used with --took, backdates start date
735
736
 
736
737
  [Default Value] None
737
738
 
@@ -759,6 +760,15 @@ Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart
759
760
  [Must Match] (?i-mx:^[cis].*?$)
760
761
 
761
762
 
763
+ ===== --from TIME_RANGE
764
+
765
+ Start and end times as a date/time range `doing done --from "1am to 8am"`.
766
+ Overrides other date flags.
767
+
768
+ [Default Value] None
769
+ [Must Match] (?i-mx:^\S+.*? +(?:to|through|thru|(?:un)?til|-+) +\S+.*?$)
770
+
771
+
762
772
  ===== -s|--section NAME
763
773
 
764
774
  Section
@@ -776,7 +786,9 @@ Filter entries using a search query, surround with slashes for regex (e.g. "/que
776
786
 
777
787
  ===== -t|--took|--for INTERVAL
778
788
 
779
- Set the completed date to the start date plus XX[hmd]
789
+ Set completion date to start date plus interval (XX[mhd] or HH:MM).
790
+ If used without the --back option, the start date will be moved back to allow
791
+ the completion date to be the current time.
780
792
 
781
793
  [Default Value] None
782
794
 
@@ -804,8 +816,8 @@ Archive entries
804
816
 
805
817
  ===== --auto
806
818
  Auto-generate finish dates from next entry's start time.
807
- Automatically generate completion dates 1 minute before next item (in any section) began.
808
- --auto overrides the --date and --back parameters.
819
+ Automatically generate completion dates 1 minute before next item (in any section) began.
820
+ --auto overrides the --date and --back parameters.
809
821
 
810
822
 
811
823
 
@@ -1144,6 +1156,13 @@ Output using a template from configuration
1144
1156
  [Default Value] last
1145
1157
 
1146
1158
 
1159
+ ===== -o|--output FORMAT
1160
+
1161
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)
1162
+
1163
+ [Default Value] None
1164
+
1165
+
1147
1166
  ===== -s|--section NAME
1148
1167
 
1149
1168
  Specify a section
@@ -1463,7 +1482,7 @@ Backdate start date for new entry to date string [4pm|20m|2h|yesterday noon]
1463
1482
  ===== --from TIME_RANGE
1464
1483
 
1465
1484
  Set a start and optionally end time as a date range ("from 1pm to 2:30pm").
1466
- If an end time is provided, a dated @done tag will be added
1485
+ If an end time is provided, a dated @done tag will be added
1467
1486
 
1468
1487
  [Default Value] None
1469
1488
 
@@ -1706,6 +1725,13 @@ Output using a template from configuration
1706
1725
  [Default Value] recent
1707
1726
 
1708
1727
 
1728
+ ===== -o|--output FORMAT
1729
+
1730
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|json|markdown|say|taskpaper|template|timeline|wiki)
1731
+
1732
+ [Default Value] None
1733
+
1734
+
1709
1735
  ===== -s|--section NAME
1710
1736
 
1711
1737
  Section
@@ -1801,6 +1827,15 @@ Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart
1801
1827
  [Must Match] (?i-mx:^[cis].*?$)
1802
1828
 
1803
1829
 
1830
+ ===== --from TIME_RANGE
1831
+
1832
+ Start and end times as a date/time range `doing done --from "1am to 8am"`.
1833
+ Overrides any date argument and disables --resume.
1834
+
1835
+ [Default Value] None
1836
+ [Must Match] (?i-mx:^\S+.*? +(?:to|through|thru|(?:un)?til|-+) +\S+.*?$)
1837
+
1838
+
1804
1839
  ===== -s|--section NAME
1805
1840
 
1806
1841
  Limit search to section
@@ -1816,6 +1851,13 @@ Filter entries using a search query, surround with slashes for regex (e.g. "/que
1816
1851
  [Default Value] None
1817
1852
 
1818
1853
 
1854
+ ===== -t|--took|--for INTERVAL
1855
+
1856
+ Set completion date to start date plus interval (XX[mhd] or HH:MM). Disables --resume
1857
+
1858
+ [Default Value] None
1859
+
1860
+
1819
1861
  ===== --tag TAG
1820
1862
 
1821
1863
  Filter entries by tag. Combine multiple tags with a comma. Wildcards allowed (*, ?)
@@ -2586,11 +2628,21 @@ Adds default_tags to a .doingrc file in the current directory. Any entry created
2586
2628
  subdirectories will be tagged with the default tags. You can modify these any time using the `config set` commnand or
2587
2629
  manually editing the .doingrc file.
2588
2630
  ===== Options
2589
- ===== -r|--remove
2631
+ ===== --clear
2590
2632
  Remove all default_tags from the local .doingrc
2591
2633
 
2592
2634
 
2593
2635
 
2636
+ ===== -e|--editor
2637
+ Use default editor to edit tag list
2638
+
2639
+
2640
+
2641
+ ===== -r|--remove
2642
+ Delete tag(s) from the current list
2643
+
2644
+
2645
+
2594
2646
  ==== Command: <tt>tags [MAX_COUNT]</tt>
2595
2647
  List all tags in the current Doing file
2596
2648
 
@@ -108,7 +108,7 @@ function _doing() {
108
108
  args=( {'(--noauto)-X','(-X)--noauto'}"[Exclude auto tags and default tags]" {'(--archive)-a','(-a)--archive'}"[Immediately archive the entry]" "--ask[Prompt for note via multi-line input]" "--finished[Set finish date to specific date/time]:DATE_STRING:" "--started[Backdate start date for new entry to date string (4pm|20m|2h|yesterday noon)]:DATE_STRING:" "--date[Include date]" {'(--editor)-e','(-e)--editor'}"[Edit entry with vim]" "--from[Start and end times as a date/time range `doing done --from "1am to 8am"`]:TIME_RANGE:" {'(--note)-n','(-n)--note'}"[Include a note]:TEXT:" {'(--remove)-r','(-r)--remove'}"[Remove @done tag]" {'(--section)-s','(-s)--section'}"[Section]:NAME:" "--for[Set completion date to start date plus interval]:INTERVAL:" {'(--unfinished)-u','(-u)--unfinished'}"[Finish last entry not already marked @done]" )
109
109
  ;;
110
110
  finish)
111
- args=( {'(--archive)-a','(-a)--archive'}"[Archive entries]" "--finished[Set finish date to specific date/time]:DATE_STRING:" "--auto[Auto-generate finish dates from next entrys start times start time]" "--started[Backdate completed date to date string (4pm|20m|2h|yesterday noon)]:DATE_STRING:" "--bool[Boolean used to combine multiple tags]:BOOLEAN:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" "--date[Include date]" {'(--interactive)-i','(-i)--interactive'}"[Select item(s) to finish from a menu of matching entries]" "--not[Finish items that *dont* match search/tag filterst* match search/tag filters]" {'(--remove)-r','(-r)--remove'}"[Remove @done tag]" {'(--section)-s','(-s)--section'}"[Section]:NAME:" "--search[Filter entries using a search query]:QUERY:" "--for[Set the completed date to the start date plus XX(hmd)]:INTERVAL:" "--tag[Filter entries by tag]:TAG:" {'(--unfinished)-u','(-u)--unfinished'}"[Finish last entry]" "--update[Overwrite existing @done tag with new date]" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
111
+ args=( {'(--archive)-a','(-a)--archive'}"[Archive entries]" "--finished[Set finish date to specific date/time]:DATE_STRING:" "--auto[Auto-generate finish dates from next entrys start times start time]" "--started[Backdate completed date to date string (4pm|20m|2h|yesterday noon)]:DATE_STRING:" "--bool[Boolean used to combine multiple tags]:BOOLEAN:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" "--date[Include date]" "--from[Start and end times as a date/time range `doing done --from "1am to 8am"`]:TIME_RANGE:" {'(--interactive)-i','(-i)--interactive'}"[Select item(s) to finish from a menu of matching entries]" "--not[Finish items that *dont* match search/tag filterst* match search/tag filters]" {'(--remove)-r','(-r)--remove'}"[Remove @done tag]" {'(--section)-s','(-s)--section'}"[Section]:NAME:" "--search[Filter entries using a search query]:QUERY:" "--for[Set completion date to start date plus interval]:INTERVAL:" "--tag[Filter entries by tag]:TAG:" {'(--unfinished)-u','(-u)--unfinished'}"[Finish last entry]" "--update[Overwrite existing @done tag with new date]" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
112
112
  ;;
113
113
  grep)
114
114
  args=( "--after[Search entries newer than date]:DATE_STRING:" "--before[Search entries older than date]:DATE_STRING:" "--bool[Boolean used to combine multiple tags]:BOOLEAN:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" "--config_template[Output using a template from configuration]:TEMPLATE_KEY:" {'(--delete)-d','(-d)--delete'}"[Delete matching entries]" "--duration[Show elapsed time on entries without @done tag]" {'(--editor)-e','(-e)--editor'}"[Edit matching entries with vim]" "--from[Date range]:DATE_OR_RANGE:" {'(--hilite)-h','(-h)--hilite'}"[Highlight search matches in output]" {'(--interactive)-i','(-i)--interactive'}"[Display an interactive menu of results to perform further operations]" "--not[Search items that *dont* match search/tag filterst* match search/tag filters]" {'(--output)-o','(-o)--output'}"[Output to export format]:FORMAT:" "--only_timed[Only show items with recorded time intervals]" {'(--section)-s','(-s)--section'}"[Section]:NAME:" {'(--times)-t','(-t)--times'}"[Show time intervals on @done tasks]" "--tag[Filter entries by tag]:TAG:" "--tag_order[Tag sort direction]:DIRECTION:" "--tag_sort[Sort tags by]:KEY:" "--template[Override output format with a template string containing %placeholders]:TEMPLATE_STRING:" "--totals[Show time totals at the end of output]" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact string matching]" )
@@ -123,7 +123,7 @@ function _doing() {
123
123
  args=( "--after[Import entries newer than date]:DATE_STRING:" "--autotag[Autotag entries]" "--before[Import entries older than date]:DATE_STRING:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" "--from[Date range]:DATE_OR_RANGE:" "--not[Import items that *dont* match search/tag/date filterst* match search/tag/date filters]" "--only_timed[Only import items with recorded time intervals]" "--overlap[Allow entries that overlap existing times]" "--prefix[Prefix entries with]:PREFIX:" {'(--section)-s','(-s)--section'}"[Target section]:NAME:" "--search[Filter entries using a search query]:QUERY:" {'(--tag)-t','(-t)--tag'}"[Tag all imported entries]:TAGS:" "--type[Import type]:TYPE:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
124
124
  ;;
125
125
  last)
126
- args=( "--bool[Boolean used to combine multiple tags]:BOOLEAN:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" "--config_template[Output using a template from configuration]:TEMPLATE_KEY:" {'(--delete)-d','(-d)--delete'}"[Delete the last entry]" "--duration[Show elapsed time if entry is not tagged @done]" {'(--editor)-e','(-e)--editor'}"[Edit entry with vim]" {'(--hilite)-h','(-h)--hilite'}"[Highlight search matches in output]" "--not[Show items that *dont* match search/tag filterst* match search/tag filters]" {'(--section)-s','(-s)--section'}"[Specify a section]:NAME:" "--search[Filter entries using a search query]:QUERY:" "--tag[Filter entries by tag]:TAG:" "--template[Override output format with a template string containing %placeholders]:TEMPLATE_STRING:" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
126
+ args=( "--bool[Boolean used to combine multiple tags]:BOOLEAN:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" "--config_template[Output using a template from configuration]:TEMPLATE_KEY:" {'(--delete)-d','(-d)--delete'}"[Delete the last entry]" "--duration[Show elapsed time if entry is not tagged @done]" {'(--editor)-e','(-e)--editor'}"[Edit entry with vim]" {'(--hilite)-h','(-h)--hilite'}"[Highlight search matches in output]" "--not[Show items that *dont* match search/tag filterst* match search/tag filters]" {'(--output)-o','(-o)--output'}"[Output to export format]:FORMAT:" {'(--section)-s','(-s)--section'}"[Specify a section]:NAME:" "--search[Filter entries using a search query]:QUERY:" "--tag[Filter entries by tag]:TAG:" "--template[Override output format with a template string containing %placeholders]:TEMPLATE_STRING:" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
127
127
  ;;
128
128
  mark)
129
129
  args=( "--bool[Boolean used to combine multiple tags]:BOOLEAN:" {'(--count)-c','(-c)--count'}"[How many recent entries to tag]:COUNT:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" {'(--date)-d','(-d)--date'}"[Include current date/time with tag]" "--force[Dont ask permission to flag all entries when count is 0t ask permission to flag all entries when count is 0]" {'(--interactive)-i','(-i)--interactive'}"[Select item(s) to flag from a menu of matching entries]" "--not[Flag items that *dont* match search/tag filterst* match search/tag filters]" {'(--remove)-r','(-r)--remove'}"[Remove flag]" {'(--section)-s','(-s)--section'}"[Section]:SECTION_NAME:" "--search[Filter entries using a search query]:QUERY:" "--tag[Filter entries by tag]:TAG:" {'(--unfinished)-u','(-u)--unfinished'}"[Flag last entry]" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
@@ -153,16 +153,16 @@ function _doing() {
153
153
  args=( {'(--column)-c','(-c)--column'}"[List in single column for completion]" {'(--type)-t','(-t)--type'}"[List plugins of type]:TYPE:" )
154
154
  ;;
155
155
  recent)
156
- args=( "--config_template[Output using a template from configuration]:TEMPLATE_KEY:" "--duration[Show elapsed time on entries without @done tag]" {'(--interactive)-i','(-i)--interactive'}"[Select from a menu of matching entries to perform additional operations]" "--only_timed[Only show items with recorded time intervals]" {'(--section)-s','(-s)--section'}"[Section]:NAME:" {'(--times)-t','(-t)--times'}"[Show time intervals on @done tasks]" "--tag_order[Tag sort direction]:DIRECTION:" "--tag_sort[Sort tags by]:KEY:" "--template[Override output format with a template string containing %placeholders]:TEMPLATE_STRING:" "--totals[Show time totals at the end of output]" )
156
+ args=( "--config_template[Output using a template from configuration]:TEMPLATE_KEY:" "--duration[Show elapsed time on entries without @done tag]" {'(--interactive)-i','(-i)--interactive'}"[Select from a menu of matching entries to perform additional operations]" {'(--output)-o','(-o)--output'}"[Output to export format]:FORMAT:" "--only_timed[Only show items with recorded time intervals]" {'(--section)-s','(-s)--section'}"[Section]:NAME:" {'(--times)-t','(-t)--times'}"[Show time intervals on @done tasks]" "--tag_order[Tag sort direction]:DIRECTION:" "--tag_sort[Sort tags by]:KEY:" "--template[Override output format with a template string containing %placeholders]:TEMPLATE_STRING:" "--totals[Show time totals at the end of output]" )
157
157
  ;;
158
158
  redo)
159
159
  args=( {'(--file)-f','(-f)--file'}"[Specify alternate doing file]:PATH:" {'(--interactive)-i','(-i)--interactive'}"[Select from an interactive menu]" )
160
160
  ;;
161
161
  reset)
162
- args=( "--bool[Boolean used to combine multiple tags]:BOOLEAN:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" {'(--interactive)-i','(-i)--interactive'}"[Select from a menu of matching entries]" "--not[Reset items that *dont* match search/tag filterst* match search/tag filters]" {'(--resume)-r','(-r)--resume'}"[Resume entry]" {'(--section)-s','(-s)--section'}"[Limit search to section]:NAME:" "--search[Filter entries using a search query]:QUERY:" "--tag[Filter entries by tag]:TAG:" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
162
+ args=( "--bool[Boolean used to combine multiple tags]:BOOLEAN:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" "--from[Start and end times as a date/time range `doing done --from "1am to 8am"`]:TIME_RANGE:" {'(--interactive)-i','(-i)--interactive'}"[Select from a menu of matching entries]" "--not[Reset items that *dont* match search/tag filterst* match search/tag filters]" {'(--resume)-r','(-r)--resume'}"[Resume entry]" {'(--section)-s','(-s)--section'}"[Limit search to section]:NAME:" "--search[Filter entries using a search query]:QUERY:" "--for[Set completion date to start date plus interval]:INTERVAL:" "--tag[Filter entries by tag]:TAG:" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
163
163
  ;;
164
164
  begin)
165
- args=( "--bool[Boolean used to combine multiple tags]:BOOLEAN:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" {'(--interactive)-i','(-i)--interactive'}"[Select from a menu of matching entries]" "--not[Reset items that *dont* match search/tag filterst* match search/tag filters]" {'(--resume)-r','(-r)--resume'}"[Resume entry]" {'(--section)-s','(-s)--section'}"[Limit search to section]:NAME:" "--search[Filter entries using a search query]:QUERY:" "--tag[Filter entries by tag]:TAG:" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
165
+ args=( "--bool[Boolean used to combine multiple tags]:BOOLEAN:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" "--from[Start and end times as a date/time range `doing done --from "1am to 8am"`]:TIME_RANGE:" {'(--interactive)-i','(-i)--interactive'}"[Select from a menu of matching entries]" "--not[Reset items that *dont* match search/tag filterst* match search/tag filters]" {'(--resume)-r','(-r)--resume'}"[Resume entry]" {'(--section)-s','(-s)--section'}"[Limit search to section]:NAME:" "--search[Filter entries using a search query]:QUERY:" "--for[Set completion date to start date plus interval]:INTERVAL:" "--tag[Filter entries by tag]:TAG:" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
166
166
  ;;
167
167
  rotate)
168
168
  args=( "--before[Rotate entries older than date]:DATE_STRING:" "--bool[Boolean used to combine multiple tags]:BOOLEAN:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" {'(--keep)-k','(-k)--keep'}"[How many items to keep in each section]:X:" "--not[Rotate items that *dont* match search/tag filterst* match search/tag filters]" {'(--section)-s','(-s)--section'}"[Section to rotate]:SECTION_NAME:" "--search[Filter entries using a search query]:QUERY:" "--tag[Filter entries by tag]:TAG:" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
@@ -183,7 +183,7 @@ function _doing() {
183
183
  args=( {'(--autotag)-a','(-a)--autotag'}"[Autotag entries based on autotag configuration in ~/]" "--bool[Boolean used to combine multiple tags]:BOOLEAN:" {'(--count)-c','(-c)--count'}"[How many recent entries to tag]:COUNT:" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" {'(--date)-d','(-d)--date'}"[Include current date/time with tag]" "--force[Dont ask permission to tag all entries when count is 0t ask permission to tag all entries when count is 0]" {'(--interactive)-i','(-i)--interactive'}"[Select item(s) to tag from a menu of matching entries]" "--not[Tag items that *dont* match search/tag filterst* match search/tag filters]" {'(--remove)-r','(-r)--remove'}"[Remove given tag(s)]" "--regex[Interpret tag string as regular expression]" "--rename[Replace existing tag with tag argument]:ORIG_TAG:" {'(--section)-s','(-s)--section'}"[Section]:SECTION_NAME:" "--search[Filter entries using a search query]:QUERY:" "--tag[Filter entries by tag]:TAG:" {'(--unfinished)-u','(-u)--unfinished'}"[Tag last entry]" {'(--value)-v','(-v)--value'}"[Include a value]:VALUE:" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
184
184
  ;;
185
185
  tag_dir)
186
- args=( {'(--remove)-r','(-r)--remove'}"[Remove all default_tags from the local]" )
186
+ args=( "--clear[Remove all default_tags from the local]" {'(--editor)-e','(-e)--editor'}"[Use default editor to edit tag list]" {'(--remove)-r','(-r)--remove'}"[Delete tag(s) from the current list]" )
187
187
  ;;
188
188
  tags)
189
189
  args=( "--bool[Boolean used to combine multiple tags]:BOOLEAN:" {'(--counts)-c','(-c)--counts'}"[Show count of occurrences]" "--case[Case sensitivity for search string matching ((c)ase-sensitive]:TYPE:" {'(--interactive)-i','(-i)--interactive'}"[Select items to scan from a menu of matching entries]" {'(--line)-l','(-l)--line'}"[Output in a single line with @ symbols]" "--not[Show items that *dont* match search/tag filterst* match search/tag filters]" {'(--order)-o','(-o)--order'}"[Sort order]:ORDER:" {'(--section)-s','(-s)--section'}"[Section]:SECTION_NAME:" "--search[Filter entries using a search query]:QUERY:" "--sort[Sort by name or count]:SORT_ORDER:" "--tag[Filter entries by tag]:TAG:" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
@@ -101,9 +101,9 @@ _doing_done() {
101
101
  _doing_finish() {
102
102
 
103
103
  if [[ "$token" == --* ]]; then
104
- COMPREPLY=( $( compgen -W '--archive --finished --auto --started --bool --case --date --interactive --not --remove --section --search --for --tag --unfinished --update --val --exact' -- $token ) )
104
+ COMPREPLY=( $( compgen -W '--archive --finished --auto --started --bool --case --date --from --interactive --not --remove --section --search --for --tag --unfinished --update --val --exact' -- $token ) )
105
105
  elif [[ "$token" == -* ]]; then
106
- COMPREPLY=( $( compgen -W '-a -i -r -s -u -x --archive --finished --auto --started --bool --case --date --interactive --not --remove --section --search --for --tag --unfinished --update --val --exact' -- $token ) )
106
+ COMPREPLY=( $( compgen -W '-a -i -r -s -u -x --archive --finished --auto --started --bool --case --date --from --interactive --not --remove --section --search --for --tag --unfinished --update --val --exact' -- $token ) )
107
107
 
108
108
  fi
109
109
  }
@@ -141,9 +141,9 @@ _doing_import() {
141
141
  _doing_last() {
142
142
 
143
143
  if [[ "$token" == --* ]]; then
144
- COMPREPLY=( $( compgen -W '--bool --case --config_template --delete --duration --editor --hilite --not --section --search --tag --template --val --exact' -- $token ) )
144
+ COMPREPLY=( $( compgen -W '--bool --case --config_template --delete --duration --editor --hilite --not --output --section --search --tag --template --val --exact' -- $token ) )
145
145
  elif [[ "$token" == -* ]]; then
146
- COMPREPLY=( $( compgen -W '-d -e -h -s -x --bool --case --config_template --delete --duration --editor --hilite --not --section --search --tag --template --val --exact' -- $token ) )
146
+ COMPREPLY=( $( compgen -W '-d -e -h -o -s -x --bool --case --config_template --delete --duration --editor --hilite --not --output --section --search --tag --template --val --exact' -- $token ) )
147
147
 
148
148
  fi
149
149
  }
@@ -221,9 +221,9 @@ _doing_plugins() {
221
221
  _doing_recent() {
222
222
 
223
223
  if [[ "$token" == --* ]]; then
224
- COMPREPLY=( $( compgen -W '--config_template --duration --interactive --only_timed --section --times --tag_order --tag_sort --template --totals' -- $token ) )
224
+ COMPREPLY=( $( compgen -W '--config_template --duration --interactive --output --only_timed --section --times --tag_order --tag_sort --template --totals' -- $token ) )
225
225
  elif [[ "$token" == -* ]]; then
226
- COMPREPLY=( $( compgen -W '-i -s -t --config_template --duration --interactive --only_timed --section --times --tag_order --tag_sort --template --totals' -- $token ) )
226
+ COMPREPLY=( $( compgen -W '-i -o -s -t --config_template --duration --interactive --output --only_timed --section --times --tag_order --tag_sort --template --totals' -- $token ) )
227
227
 
228
228
  fi
229
229
  }
@@ -241,9 +241,9 @@ _doing_redo() {
241
241
  _doing_reset() {
242
242
 
243
243
  if [[ "$token" == --* ]]; then
244
- COMPREPLY=( $( compgen -W '--bool --case --interactive --not --resume --section --search --tag --val --exact' -- $token ) )
244
+ COMPREPLY=( $( compgen -W '--bool --case --from --interactive --not --resume --section --search --for --tag --val --exact' -- $token ) )
245
245
  elif [[ "$token" == -* ]]; then
246
- COMPREPLY=( $( compgen -W '-i -r -s -x --bool --case --interactive --not --resume --section --search --tag --val --exact' -- $token ) )
246
+ COMPREPLY=( $( compgen -W '-i -r -s -x --bool --case --from --interactive --not --resume --section --search --for --tag --val --exact' -- $token ) )
247
247
 
248
248
  fi
249
249
  }
@@ -321,9 +321,9 @@ _doing_tag() {
321
321
  _doing_tag_dir() {
322
322
 
323
323
  if [[ "$token" == --* ]]; then
324
- COMPREPLY=( $( compgen -W '--remove' -- $token ) )
324
+ COMPREPLY=( $( compgen -W '--clear --editor --remove' -- $token ) )
325
325
  elif [[ "$token" == -* ]]; then
326
- COMPREPLY=( $( compgen -W '-r --remove' -- $token ) )
326
+ COMPREPLY=( $( compgen -W '-e -r --clear --editor --remove' -- $token ) )
327
327
 
328
328
  fi
329
329
  }
@@ -254,12 +254,13 @@ complete -c doing -l started -f -r -n '__fish_doing_using_command finish' -d Ba
254
254
  complete -c doing -l bool -f -r -n '__fish_doing_using_command finish' -d Boolean\ used\ to\ combine\ multiple\ tags
255
255
  complete -c doing -l case -f -r -n '__fish_doing_using_command finish' -d Case\ sensitivity\ for\ search\ string\ matching\ \[\(c\)ase-sensitive
256
256
  complete -c doing -l date -f -n '__fish_doing_using_command finish' -d Include\ date
257
+ complete -c doing -l from -f -r -n '__fish_doing_using_command finish' -d Start\ and\ end\ times\ as\ a\ date/time\ range\ \`doing\ done\ --from\ \"1am\ to\ 8am\"\`
257
258
  complete -c doing -l interactive -s i -f -n '__fish_doing_using_command finish' -d Select\ item\(s\)\ to\ finish\ from\ a\ menu\ of\ matching\ entries
258
259
  complete -c doing -l not -f -n '__fish_doing_using_command finish' -d Finish\ items\ that\ \*don\'t\*\ match\ search/tag\ filters
259
260
  complete -c doing -l remove -s r -f -n '__fish_doing_using_command finish' -d Remove\ @done\ tag
260
261
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command finish' -d Section
261
262
  complete -c doing -l search -f -r -n '__fish_doing_using_command finish' -d Filter\ entries\ using\ a\ search\ query
262
- complete -c doing -l for -f -r -n '__fish_doing_using_command finish' -d Set\ the\ completed\ date\ to\ the\ start\ date\ plus\ XX\[hmd\]
263
+ complete -c doing -l for -f -r -n '__fish_doing_using_command finish' -d Set\ completion\ date\ to\ start\ date\ plus\ interval
263
264
  complete -c doing -l tag -f -r -n '__fish_doing_using_command finish' -d Filter\ entries\ by\ tag
264
265
  complete -c doing -l unfinished -s u -f -n '__fish_doing_using_command finish' -d Finish\ last\ entry
265
266
  complete -c doing -l update -f -n '__fish_doing_using_command finish' -d Overwrite\ existing\ @done\ tag\ with\ new\ date
@@ -311,6 +312,7 @@ complete -c doing -l duration -f -n '__fish_doing_using_command last' -d Show\
311
312
  complete -c doing -l editor -s e -f -n '__fish_doing_using_command last' -d Edit\ entry\ with\ vim
312
313
  complete -c doing -l hilite -s h -f -n '__fish_doing_using_command last' -d Highlight\ search\ matches\ in\ output
313
314
  complete -c doing -l not -f -n '__fish_doing_using_command last' -d Show\ items\ that\ \*don\'t\*\ match\ search/tag\ filters
315
+ complete -c doing -l output -s o -f -r -n '__fish_doing_using_command last' -d Output\ to\ export\ format
314
316
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command last' -d Specify\ a\ section
315
317
  complete -c doing -l search -f -r -n '__fish_doing_using_command last' -d Filter\ entries\ using\ a\ search\ query
316
318
  complete -c doing -l tag -f -r -n '__fish_doing_using_command last' -d Filter\ entries\ by\ tag
@@ -386,6 +388,7 @@ complete -c doing -l type -s t -f -r -n '__fish_doing_using_command plugins' -d
386
388
  complete -c doing -l config_template -f -r -n '__fish_doing_using_command recent' -d Output\ using\ a\ template\ from\ configuration
387
389
  complete -c doing -l duration -f -n '__fish_doing_using_command recent' -d Show\ elapsed\ time\ on\ entries\ without\ @done\ tag
388
390
  complete -c doing -l interactive -s i -f -n '__fish_doing_using_command recent' -d Select\ from\ a\ menu\ of\ matching\ entries\ to\ perform\ additional\ operations
391
+ complete -c doing -l output -s o -f -r -n '__fish_doing_using_command recent' -d Output\ to\ export\ format
389
392
  complete -c doing -l only_timed -f -n '__fish_doing_using_command recent' -d Only\ show\ items\ with\ recorded\ time\ intervals
390
393
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command recent' -d Section
391
394
  complete -c doing -l times -s t -f -n '__fish_doing_using_command recent' -d Show\ time\ intervals\ on\ @done\ tasks
@@ -397,11 +400,13 @@ complete -c doing -l file -s f -f -r -n '__fish_doing_using_command redo' -d Spe
397
400
  complete -c doing -l interactive -s i -f -n '__fish_doing_using_command redo' -d Select\ from\ an\ interactive\ menu
398
401
  complete -c doing -l bool -f -r -n '__fish_doing_using_command reset begin' -d Boolean\ used\ to\ combine\ multiple\ tags
399
402
  complete -c doing -l case -f -r -n '__fish_doing_using_command reset begin' -d Case\ sensitivity\ for\ search\ string\ matching\ \[\(c\)ase-sensitive
403
+ complete -c doing -l from -f -r -n '__fish_doing_using_command reset begin' -d Start\ and\ end\ times\ as\ a\ date/time\ range\ \`doing\ done\ --from\ \"1am\ to\ 8am\"\`
400
404
  complete -c doing -l interactive -s i -f -n '__fish_doing_using_command reset begin' -d Select\ from\ a\ menu\ of\ matching\ entries
401
405
  complete -c doing -l not -f -n '__fish_doing_using_command reset begin' -d Reset\ items\ that\ \*don\'t\*\ match\ search/tag\ filters
402
406
  complete -c doing -l resume -s r -f -n '__fish_doing_using_command reset begin' -d Resume\ entry
403
407
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command reset begin' -d Limit\ search\ to\ section
404
408
  complete -c doing -l search -f -r -n '__fish_doing_using_command reset begin' -d Filter\ entries\ using\ a\ search\ query
409
+ complete -c doing -l for -f -r -n '__fish_doing_using_command reset begin' -d Set\ completion\ date\ to\ start\ date\ plus\ interval
405
410
  complete -c doing -l tag -f -r -n '__fish_doing_using_command reset begin' -d Filter\ entries\ by\ tag
406
411
  complete -c doing -l val -f -r -n '__fish_doing_using_command reset begin' -d Perform\ a\ tag\ value\ query
407
412
  complete -c doing -l exact -s x -f -n '__fish_doing_using_command reset begin' -d Force\ exact\ search\ string\ matching
@@ -500,7 +505,9 @@ complete -c doing -l unfinished -s u -f -n '__fish_doing_using_command tag' -d
500
505
  complete -c doing -l value -s v -f -r -n '__fish_doing_using_command tag' -d Include\ a\ value
501
506
  complete -c doing -l val -f -r -n '__fish_doing_using_command tag' -d Perform\ a\ tag\ value\ query
502
507
  complete -c doing -l exact -s x -f -n '__fish_doing_using_command tag' -d Force\ exact\ search\ string\ matching
503
- complete -c doing -l remove -s r -f -n '__fish_doing_using_command tag_dir' -d Remove\ all\ default_tags\ from\ the\ local
508
+ complete -c doing -l clear -f -n '__fish_doing_using_command tag_dir' -d Remove\ all\ default_tags\ from\ the\ local
509
+ complete -c doing -l editor -s e -f -n '__fish_doing_using_command tag_dir' -d Use\ default\ editor\ to\ edit\ tag\ list
510
+ complete -c doing -l remove -s r -f -n '__fish_doing_using_command tag_dir' -d Delete\ tag\(s\)\ from\ the\ current\ list
504
511
  complete -c doing -l bool -f -r -n '__fish_doing_using_command tags' -d Boolean\ used\ to\ combine\ multiple\ tags
505
512
  complete -c doing -l counts -s c -f -n '__fish_doing_using_command tags' -d Show\ count\ of\ occurrences
506
513
  complete -c doing -l case -f -r -n '__fish_doing_using_command tags' -d Case\ sensitivity\ for\ search\ string\ matching\ \[\(c\)ase-sensitive
@@ -580,7 +587,7 @@ complete -c doing -l tag_order -f -r -n '__fish_doing_using_command yesterday'
580
587
  complete -c doing -l tag_sort -f -r -n '__fish_doing_using_command yesterday' -d Sort\ tags\ by
581
588
  complete -c doing -l template -f -r -n '__fish_doing_using_command yesterday' -d Override\ output\ format\ with\ a\ template\ string\ containing\ \%placeholders
582
589
  complete -c doing -l totals -f -n '__fish_doing_using_command yesterday' -d Show\ time\ totals\ at\ the\ end\ of\ output
583
- complete -f -c doing -s o -l output -x -n '__fish_doing_using_command grep search on select show since today view yesterday' -a '(__fish_doing_export_plugin)'
590
+ complete -f -c doing -s o -l output -x -n '__fish_doing_using_command grep search last on recent select show since today view yesterday' -a '(__fish_doing_export_plugin)'
584
591
  complete -f -c doing -s b -l bool -x -n '__fish_doing_using_command again resume archive move autotag cancel finish grep search last mark flag note on reset begin rotate show since tag tags view wiki' -a 'and or not pattern'
585
592
  complete -f -c doing -l case -x -n '__fish_doing_using_command again resume archive move cancel finish grep search import last mark flag note on reset begin rotate select show since tag tags view' -a 'case-sensitive ignore smart'
586
593
  complete -f -c doing -l sort -x -n '__fish_doing_using_command changes changelog show tags' -a 'asc desc'
@@ -3,18 +3,26 @@
3
3
  ##
4
4
  ## Add presets of flags and switches to a command.
5
5
  ##
6
+ ## :output_template => --output, --config_template, --template
7
+ ##
6
8
  ## :add_entry => --noauto, --note, --ask, --editor, --back
7
9
  ##
10
+ ## :finish_entry => --at/finished, --from, --took
11
+ ##
12
+ ## :time_display => --times, --duration, --totals, --tag_sort, --tag_order, --only_timed
13
+ ##
8
14
  ## :search => --search, --case, --exact
9
15
  ##
10
16
  ## :tag_filter => --tag, --bool, --not, --val
11
17
  ##
18
+ ## :time_filter => --before, --after, --from
19
+ ##
12
20
  ## :date_filter => --before, --after, --from
13
21
  ##
14
22
  ## @param type [Symbol] The type
15
23
  ## @param cmd The GLI command to which the options will be added
16
24
  ##
17
- def add_options(type, cmd)
25
+ def add_options(type, cmd, default_template: 'default')
18
26
  cmd_name = cmd.name.to_s
19
27
  action = case cmd_name
20
28
  when /again/
@@ -30,6 +38,18 @@ def add_options(type, cmd)
30
38
  end
31
39
 
32
40
  case type
41
+ when :output_template
42
+ cmd.desc "Output to export format (#{Doing::Plugins.plugin_names(type: :export)})"
43
+ cmd.arg_name 'FORMAT'
44
+ cmd.flag %i[o output]
45
+
46
+ cmd.desc "Output using a template from configuration"
47
+ cmd.arg_name 'TEMPLATE_KEY'
48
+ cmd.flag [:config_template], type: TemplateName, default_value: default_template
49
+
50
+ cmd.desc 'Override output format with a template string containing %placeholders'
51
+ cmd.arg_name 'TEMPLATE_STRING'
52
+ cmd.flag [:template]
33
53
  when :add_entry
34
54
  cmd.desc 'Exclude auto tags and default tags'
35
55
  cmd.switch %i[X noauto], default_value: false, negatable: false
@@ -47,6 +67,24 @@ def add_options(type, cmd)
47
67
  cmd.desc 'Backdate start date for new entry to date string [4pm|20m|2h|yesterday noon]'
48
68
  cmd.arg_name 'DATE_STRING'
49
69
  cmd.flag %i[b back started], type: DateBeginString
70
+ when :finish_entry
71
+ cmd.desc %(Set finish date to specific date/time (natural langauge parsed, e.g. --at=1:30pm).
72
+ Used with --took, backdates start date)
73
+ cmd.arg_name 'DATE_STRING'
74
+ cmd.flag %i[at finished], type: DateEndString
75
+
76
+ cmd.desc %(
77
+ Start and end times as a date/time range `doing done --from "1am to 8am"`.
78
+ Overrides other date flags.
79
+ )
80
+ cmd.arg_name 'TIME_RANGE'
81
+ cmd.flag [:from], must_match: REGEX_RANGE
82
+
83
+ cmd.desc %(Set completion date to start date plus interval (XX[mhd] or HH:MM).
84
+ If used without the --back option, the start date will be moved back to allow
85
+ the completion date to be the current time.)
86
+ cmd.arg_name 'INTERVAL'
87
+ cmd.flag %i[t took for], type: DateIntervalString
50
88
  when :search
51
89
  cmd.desc 'Filter entries using a search query, surround with slashes for regex (e.g. "/query.*/"),
52
90
  start with single quote for exact match ("\'query")'
@@ -2,19 +2,25 @@
2
2
 
3
3
  require_relative 'tags'
4
4
  require_relative 'nested_hash'
5
+ require_relative 'cleanup'
5
6
 
6
- class ::Array
7
- ##
8
- ## Force UTF-8 encoding of strings in array
9
- ##
10
- ## @return [Array] Encoded lines
11
- ##
12
- def utf8
13
- c = self.class
14
- if String.method_defined? :force_encoding
15
- replace c.new(map(&:utf8))
16
- else
17
- self
7
+ module Doing
8
+ class ::Array
9
+ include ArrayTags
10
+ include ArrayNestedHash
11
+ include ArrayCleanup
12
+ ##
13
+ ## Force UTF-8 encoding of strings in array
14
+ ##
15
+ ## @return [Array] Encoded lines
16
+ ##
17
+ def utf8
18
+ c = self.class
19
+ if String.method_defined? :force_encoding
20
+ replace c.new(map(&:utf8))
21
+ else
22
+ self
23
+ end
18
24
  end
19
25
  end
20
26
  end
@@ -0,0 +1,31 @@
1
+ module Doing
2
+ module ArrayCleanup
3
+ ##
4
+ ## Like Array#compact -- removes nil items, but also
5
+ ## removes empty strings, zero or negative numbers and FalseClass items
6
+ ##
7
+ ## @return [Array] Array without "bad" elements
8
+ ##
9
+ def remove_bad
10
+ compact.map { |x| x.is_a?(String) ? x.strip : x }.select(&:good?)
11
+ end
12
+
13
+ def remove_bad!
14
+ replace remove_empty
15
+ end
16
+
17
+ ##
18
+ ## Like Array#compact -- removes nil items, but also
19
+ ## removes empty elements
20
+ ##
21
+ ## @return [Array] Array without empty elements
22
+ ##
23
+ def remove_empty
24
+ compact.map { |x| x.is_a?(String) ? x.strip : x }.reject { |x| x.is_a?(String) ? x.empty? : false }
25
+ end
26
+
27
+ def remove_empty!
28
+ replace remove_empty
29
+ end
30
+ end
31
+ end
@@ -2,7 +2,7 @@ module Doing
2
2
  ##
3
3
  ## Array helpers
4
4
  ##
5
- class ::Array
5
+ module ArrayNestedHash
6
6
  ##
7
7
  ## Convert array to nested hash, setting last key to value
8
8
  ##