doing 2.1.13 → 2.1.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.yardoc/checksums +5 -5
  3. data/.yardoc/object_types +0 -0
  4. data/.yardoc/objects/root.dat +0 -0
  5. data/CHANGELOG.md +14 -0
  6. data/Gemfile.lock +7 -1
  7. data/README.md +1 -1
  8. data/bin/doing +91 -28
  9. data/docs/doc/Array.html +1 -1
  10. data/docs/doc/BooleanTermParser/Clause.html +1 -1
  11. data/docs/doc/BooleanTermParser/Operator.html +1 -1
  12. data/docs/doc/BooleanTermParser/Query.html +1 -1
  13. data/docs/doc/BooleanTermParser/QueryParser.html +1 -1
  14. data/docs/doc/BooleanTermParser/QueryTransformer.html +1 -1
  15. data/docs/doc/BooleanTermParser.html +1 -1
  16. data/docs/doc/Doing/Color.html +1 -1
  17. data/docs/doc/Doing/Completion.html +1 -1
  18. data/docs/doc/Doing/Configuration.html +1 -1
  19. data/docs/doc/Doing/Errors/DoingNoTraceError.html +1 -1
  20. data/docs/doc/Doing/Errors/DoingRuntimeError.html +1 -1
  21. data/docs/doc/Doing/Errors/DoingStandardError.html +1 -1
  22. data/docs/doc/Doing/Errors/EmptyInput.html +1 -1
  23. data/docs/doc/Doing/Errors/NoResults.html +1 -1
  24. data/docs/doc/Doing/Errors/PluginException.html +1 -1
  25. data/docs/doc/Doing/Errors/UserCancelled.html +1 -1
  26. data/docs/doc/Doing/Errors/WrongCommand.html +1 -1
  27. data/docs/doc/Doing/Errors.html +1 -1
  28. data/docs/doc/Doing/Hooks.html +1 -1
  29. data/docs/doc/Doing/Item.html +117 -13
  30. data/docs/doc/Doing/Items.html +1 -1
  31. data/docs/doc/Doing/LogAdapter.html +1 -1
  32. data/docs/doc/Doing/Note.html +1 -1
  33. data/docs/doc/Doing/Pager.html +1 -1
  34. data/docs/doc/Doing/Plugins.html +1 -1
  35. data/docs/doc/Doing/Prompt.html +35 -1
  36. data/docs/doc/Doing/Section.html +1 -1
  37. data/docs/doc/Doing/TemplateString.html +1 -1
  38. data/docs/doc/Doing/Util/Backup.html +1 -1
  39. data/docs/doc/Doing/Util.html +1 -1
  40. data/docs/doc/Doing/WWID.html +7 -5
  41. data/docs/doc/Doing.html +2 -2
  42. data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  43. data/docs/doc/GLI/Commands.html +1 -1
  44. data/docs/doc/GLI.html +1 -1
  45. data/docs/doc/Hash.html +1 -1
  46. data/docs/doc/PhraseParser/Operator.html +1 -1
  47. data/docs/doc/PhraseParser/PhraseClause.html +1 -1
  48. data/docs/doc/PhraseParser/Query.html +1 -1
  49. data/docs/doc/PhraseParser/QueryParser.html +1 -1
  50. data/docs/doc/PhraseParser/QueryTransformer.html +1 -1
  51. data/docs/doc/PhraseParser/TermClause.html +1 -1
  52. data/docs/doc/PhraseParser.html +1 -1
  53. data/docs/doc/Status.html +1 -1
  54. data/docs/doc/String.html +1 -1
  55. data/docs/doc/Symbol.html +1 -1
  56. data/docs/doc/Time.html +1 -1
  57. data/docs/doc/_index.html +1 -1
  58. data/docs/doc/file.README.html +2 -2
  59. data/docs/doc/index.html +2 -2
  60. data/docs/doc/method_list.html +206 -198
  61. data/docs/doc/top-level-namespace.html +1 -1
  62. data/docs/index.md +1 -1
  63. data/doing.gemspec +1 -0
  64. data/doing.rdoc +41 -4
  65. data/lib/completion/_doing.zsh +11 -11
  66. data/lib/completion/doing.bash +15 -15
  67. data/lib/completion/doing.fish +10 -3
  68. data/lib/doing/item.rb +25 -0
  69. data/lib/doing/plugins/import/calendar_import.rb +13 -1
  70. data/lib/doing/plugins/import/doing_import.rb +12 -1
  71. data/lib/doing/plugins/import/timing_import.rb +13 -1
  72. data/lib/doing/prompt.rb +13 -1
  73. data/lib/doing/time.rb +2 -2
  74. data/lib/doing/version.rb +1 -1
  75. data/lib/doing/wwid.rb +10 -5
  76. data/lib/doing.rb +1 -0
  77. metadata +21 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c12d0846431cd0468f217f3e1e9b80bcb9a86038fbee7ff057c1db8ad6c56bb3
4
- data.tar.gz: a144f25b2798825ad042d690e21c1a798b83e06e49480c92be7acea752d37e48
3
+ metadata.gz: 83151006df40e5509447d601aad17f68c0652923cd4444759568bdc510f809d8
4
+ data.tar.gz: 66cbfb07d1038a5ffa327911039d55aab88695f831735a7f78969ad1f216e3b7
5
5
  SHA512:
6
- metadata.gz: 66f76cd0588f4dca848c94313051bcb39bc776c4679b8bd9a648887dd764dcc3232d45e18bb260edb7500e3c398aef8a02216a11ce5a593b8822f89267c92214
7
- data.tar.gz: bc852708998d6e670fe72c882f2e254f64bbec487cd56b659e75220bdd5a5c75b5495d1a9b4a734d56825a00563b1b3052bdcd2c4a93761479a2bbe9a2eb397d
6
+ metadata.gz: 59bc1165eeab6e6e8e838e81afb226d978878c813627239b909b89a989a20e9318af5ec43d06b90558ad0ed7f4b6f0061f9ed5a96840e1d8a2e2cae5eb471045
7
+ data.tar.gz: 651ded056737cfab0e8ccae8885f8972fbf1a166315fc0b1952911d4884cd3ed8791f8dedaa3400f94c60c199d229bc409223c1426ed35ef3af55906cb8a3925
data/.yardoc/checksums CHANGED
@@ -1,20 +1,20 @@
1
1
  lib/doing/hash.rb c2960de9603dcf90be85ce423d9430de27f4f893
2
- lib/doing/item.rb 54cea2275eaa19a9285e358c51f8630a558730ee
2
+ lib/doing/item.rb be85c6274e7bb07f4dfd00f9d4fe3b93ee3d816c
3
3
  lib/doing/note.rb bbadd9e34e6dc43a2af1110a5107f46c39d2547f
4
- lib/doing/time.rb 4411af636082d3abf6f6402a7d6c9038d96a9ead
4
+ lib/doing/time.rb 6e79c48949e48b8896b18b1856f179d04fd936f9
5
5
  lib/doing/util.rb 33ad79455893213a0f2993edec0e158526657f09
6
- lib/doing/wwid.rb a6e14548e14219d46a6fdc1c9c9accb5f4277654
6
+ lib/doing/wwid.rb 5f3cedc2d4ac8761e869db9d9cc63e0ecfca9681
7
7
  lib/doing/array.rb a17004c4811d239932254f9ed94a6eb10456c8e8
8
8
  lib/doing/hooks.rb acf6e0615ccf1949f84915c979297845242c1205
9
9
  lib/doing/items.rb 8cda7caaef10645893267262f5eee681e35046ce
10
10
  lib/doing/pager.rb b58e478b0cb8d400ddb97988ba741e3a127b53c3
11
11
  lib/doing/colors.rb 9a628d48c821313c502deedc5b61a046a2bf79ef
12
12
  lib/doing/errors.rb af07e482a5389924edc2337749c81cda501098f0
13
- lib/doing/prompt.rb a78b6f4488fe58b5653ce541a88d24559661459c
13
+ lib/doing/prompt.rb 075dc22031e0f1cd5b2a8dd4cb6e6c3b3dfd2c36
14
14
  lib/doing/string.rb 7cbe3e0bd136c52f7b12d4d6133afe20fe204be2
15
15
  lib/doing/symbol.rb 309799458a1bc715c2707307c9a62ab26086275e
16
16
  lib/doing/section.rb 206e119cf818f1e76798753e611180fe77bc299a
17
- lib/doing/version.rb d2b8ae34e7fd7354adae5386fe3ed84c88e5dc88
17
+ lib/doing/version.rb 9a591fb642591742cb202b30af1f46f206220021
18
18
  lib/doing/cli_status.rb dbedd454c4cbbd0fed9ef30120f6ec85d18b9356
19
19
  lib/doing/completion.rb c658e7dc7898fb022a21b2bd77bedb958ca3b067
20
20
  lib/doing/log_adapter.rb 6cf0c9a405d17449643e54d35a04897b1da44eaf
data/.yardoc/object_types CHANGED
Binary file
Binary file
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ### 2.1.14
2
+
3
+ #### NEW
4
+
5
+ - All commands that accept --note now accept --ask, which requests input via readline after creating the note. Multiple lines are allowed, hit return twice to end editing. Works alongside --note and --editor
6
+
7
+ #### IMPROVED
8
+
9
+ - Implement --search and --from filtering for import plugins
10
+ - UTC format date strings in select menus for consistency (was relative date formatting)
11
+ - Don't populate the fzf search with --search, it's already filtered. Separated --query from --search if you do want to populate the query string in addition to --search filtering
12
+ - When showing relative dates, don't include the year if the date is the previous year but a later month than the current month (less than a year old)
13
+ - When using --editor while adding an entry, include any note specified on the command line or via --ask for further editing
14
+
1
15
  ### 2.1.13
2
16
 
3
17
  #### NEW
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- doing (2.1.13)
4
+ doing (2.1.14)
5
5
  chronic (~> 0.10, >= 0.10.2)
6
6
  deep_merge (~> 1.2, >= 1.2.1)
7
7
  gli (~> 2.19, >= 2.19.2)
@@ -12,6 +12,7 @@ PATH
12
12
  tty-link (~> 0.1, >= 0.1.1)
13
13
  tty-markdown (~> 0.7, >= 0.7.0)
14
14
  tty-progressbar (~> 0.18, >= 0.18.2)
15
+ tty-reader (~> 0.9, >= 0.9.0)
15
16
  tty-which (~> 0.5, >= 0.5.0)
16
17
 
17
18
  GEM
@@ -131,6 +132,10 @@ GEM
131
132
  tty-cursor (~> 0.7)
132
133
  tty-screen (~> 0.8)
133
134
  unicode-display_width (>= 1.6, < 3.0)
135
+ tty-reader (0.9.0)
136
+ tty-cursor (~> 0.7)
137
+ tty-screen (~> 0.8)
138
+ wisper (~> 2.0)
134
139
  tty-screen (0.8.1)
135
140
  tty-spinner (0.9.3)
136
141
  tty-cursor (~> 0.7)
@@ -139,6 +144,7 @@ GEM
139
144
  concurrent-ruby (~> 1.0)
140
145
  unicode-display_width (2.1.0)
141
146
  unicode_utils (1.4.0)
147
+ wisper (2.0.1)
142
148
  yard (0.9.26)
143
149
  zeitwerk (2.5.1)
144
150
 
data/README.md CHANGED
@@ -6,7 +6,7 @@ _If you're one of the rare people like me who find this useful, feel free to [bu
6
6
 
7
7
  <!--README-->
8
8
 
9
- The current version of `doing` is <!--VER-->2.1.12<!--END VER-->.
9
+ The current version of `doing` is <!--VER-->2.1.13<!--END VER-->.
10
10
 
11
11
  Find all of the documentation in the [doing wiki](https://github.com/ttscoff/doing/wiki).
12
12
 
data/bin/doing CHANGED
@@ -70,6 +70,12 @@ if settings.dig('plugins', 'command_path')
70
70
  commands_from File.expand_path(settings.dig('plugins', 'command_path'))
71
71
  end
72
72
 
73
+ class TagArray < Array; end
74
+
75
+ accept TagArray do |value|
76
+ value.gsub(/[, ]+/, ' ').split(' ').map { |tag| tag.sub(/^@/, '')}.map(&:strip)
77
+ end
78
+
73
79
  program_desc 'A CLI for a What Was I Doing system'
74
80
  program_long_desc %(Doing uses a TaskPaper-like formatting to keep a plain text
75
81
  record of what you've been doing, complete with tag-based time tracking. The
@@ -139,7 +145,7 @@ command %i[again resume] do |c|
139
145
 
140
146
  c.desc 'Repeat last entry matching tags. Combine multiple tags with a comma. Wildcards allowed (*, ?)'
141
147
  c.arg_name 'TAG'
142
- c.flag [:tag]
148
+ c.flag [:tag], type: TagArray
143
149
 
144
150
  c.desc 'Repeat last entry matching search. Surround with
145
151
  slashes for regex (e.g. "/query/"), start with a single quote for exact match ("\'query").'
@@ -170,16 +176,19 @@ command %i[again resume] do |c|
170
176
  c.desc "Edit duplicated entry with #{Doing::Util.default_editor} before adding"
171
177
  c.switch %i[e editor], negatable: false, default_value: false
172
178
 
173
- c.desc 'Note'
179
+ c.desc 'Add a note'
174
180
  c.arg_name 'TEXT'
175
181
  c.flag %i[n note]
176
182
 
183
+ c.desc 'Prompt for note via multi-line input'
184
+ c.switch %i[ask], negatable: false, default_value: false
185
+
177
186
  c.desc 'Select item to resume from a menu of matching entries'
178
187
  c.switch %i[i interactive], negatable: false, default_value: false
179
188
 
180
189
  c.action do |_global_options, options, _args|
181
190
  options[:fuzzy] = false
182
- tags = options[:tag].nil? ? [] : options[:tag].to_tags
191
+ tags = options[:tag].nil? ? [] : options[:tag]
183
192
 
184
193
  options[:case] = options[:case].normalize_case
185
194
 
@@ -189,6 +198,11 @@ command %i[again resume] do |c|
189
198
  options[:search] = search
190
199
  end
191
200
 
201
+ note = Doing::Note.new(options[:note])
202
+ note.add(Doing::Prompt.request_lines(prompt: 'Add a note')) if options[:ask]
203
+
204
+ options[:note] = note
205
+
192
206
  opts = options.dup
193
207
 
194
208
  opts[:tag] = tags
@@ -216,7 +230,7 @@ command :cancel do |c|
216
230
 
217
231
  c.desc 'Cancel the last X entries containing TAG. Separate multiple tags with comma (--tag=tag1,tag2). Wildcards allowed (*, ?)'
218
232
  c.arg_name 'TAG'
219
- c.flag [:tag]
233
+ c.flag [:tag], type: TagArray
220
234
 
221
235
  c.desc 'Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans'
222
236
  c.arg_name 'BOOLEAN'
@@ -260,7 +274,7 @@ command :cancel do |c|
260
274
  if options[:tag].nil?
261
275
  tags = []
262
276
  else
263
- tags = options[:tag].to_tags
277
+ tags = options[:tag]
264
278
  end
265
279
 
266
280
  raise InvalidArgument, 'Only one argument allowed' if args.length > 1
@@ -349,6 +363,9 @@ command %i[done did] do |c|
349
363
  c.arg_name 'TEXT'
350
364
  c.flag %i[n note]
351
365
 
366
+ c.desc 'Prompt for note via multi-line input'
367
+ c.switch %i[ask], negatable: false, default_value: false
368
+
352
369
  c.desc 'Finish last entry not already marked @done'
353
370
  c.switch %i[u unfinished], negatable: false, default_value: false
354
371
 
@@ -395,6 +412,7 @@ command %i[done did] do |c|
395
412
 
396
413
  note = Doing::Note.new
397
414
  note.add(options[:note]) if options[:note]
415
+ note.add(Doing::Prompt.request_lines(prompt: 'Add a note')) if options[:ask]
398
416
 
399
417
  if options[:editor]
400
418
  raise MissingEditor, 'No EDITOR variable defined in environment' if Doing::Util.default_editor.nil?
@@ -539,7 +557,7 @@ command :finish do |c|
539
557
  c.desc 'Finish the last X entries containing TAG.
540
558
  Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).'
541
559
  c.arg_name 'TAG'
542
- c.flag [:tag]
560
+ c.flag [:tag], type: TagArray
543
561
 
544
562
  c.desc 'Finish the last X entries matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("\'query")'
545
563
  c.arg_name 'QUERY'
@@ -618,7 +636,7 @@ command :finish do |c|
618
636
  if options[:tag].nil?
619
637
  tags = []
620
638
  else
621
- tags = options[:tag].to_tags
639
+ tags = options[:tag]
622
640
  end
623
641
 
624
642
  raise InvalidArgument, 'Only one argument allowed' if args.length > 1
@@ -681,6 +699,9 @@ command :later do |c|
681
699
  c.arg_name 'TEXT'
682
700
  c.flag %i[n note]
683
701
 
702
+ c.desc 'Prompt for note via multi-line input'
703
+ c.switch %i[ask], negatable: false, default_value: false
704
+
684
705
  c.action do |_global_options, options, args|
685
706
  if options[:back]
686
707
  date = options[:back].chronify(guess: :begin)
@@ -689,11 +710,16 @@ command :later do |c|
689
710
  date = Time.now
690
711
  end
691
712
 
713
+ ask_note = options[:ask] ? Doing::Prompt.request_lines(prompt: 'Add a note') : ''
714
+
692
715
  if options[:editor] || (args.empty? && $stdin.stat.size.zero?)
693
716
  raise MissingEditor, 'No EDITOR variable defined in environment' if Doing::Util.default_editor.nil?
694
717
 
695
718
  input += date.strftime('%F %R | ')
696
719
  input += args.empty? ? '' : args.join(' ')
720
+ input += "\n#{options[:note]}" if options[:note]
721
+ input += "\n#{ask_note}" unless ask_note.empty?
722
+
697
723
  input = wwid.fork_editor(input).strip
698
724
  raise EmptyInput, 'No content' unless input && !input.empty?
699
725
 
@@ -706,6 +732,7 @@ command :later do |c|
706
732
  d, title, note = wwid.format_input(args.join(' '))
707
733
  date = d.nil? ? date : d
708
734
  note.add(options[:note]) if options[:note]
735
+ note.add(ask_note) unless ask_note.empty?
709
736
  wwid.add_item(title.cap_first, 'Later', { note: note, back: date })
710
737
  wwid.write(wwid.doing_file)
711
738
  elsif $stdin.stat.size.positive?
@@ -715,6 +742,7 @@ command :later do |c|
715
742
  date = d
716
743
  end
717
744
  note.add(options[:note]) if options[:note]
745
+ note.add(ask_note) unless ask_note.empty?
718
746
  wwid.add_item(title.cap_first, 'Later', { note: note, back: date })
719
747
  wwid.write(wwid.doing_file)
720
748
  else
@@ -754,7 +782,7 @@ command %i[mark flag] do |c|
754
782
  c.desc 'Flag the last entry containing TAG.
755
783
  Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).'
756
784
  c.arg_name 'TAG'
757
- c.flag [:tag]
785
+ c.flag [:tag], type: TagArray
758
786
 
759
787
  c.desc 'Flag the last entry matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("\'query")'
760
788
  c.arg_name 'QUERY'
@@ -799,7 +827,7 @@ command %i[mark flag] do |c|
799
827
  if options[:tag].nil?
800
828
  search_tags = []
801
829
  else
802
- search_tags = options[:tag].to_tags
830
+ search_tags = options[:tag]
803
831
  end
804
832
 
805
833
  if options[:interactive]
@@ -881,6 +909,9 @@ command :meanwhile do |c|
881
909
  c.arg_name 'TEXT'
882
910
  c.flag %i[n note]
883
911
 
912
+ c.desc 'Prompt for note via multi-line input'
913
+ c.switch %i[ask], negatable: false, default_value: false
914
+
884
915
  c.action do |_global_options, options, args|
885
916
  if options[:back]
886
917
  date = options[:back].chronify(guess: :begin)
@@ -897,10 +928,15 @@ command :meanwhile do |c|
897
928
  end
898
929
  input = ''
899
930
 
931
+ ask_note = options[:ask] ? Doing::Prompt.request_lines(prompt: 'Add a note') : []
932
+
900
933
  if options[:editor]
901
934
  raise MissingEditor, 'No EDITOR variable defined in environment' if Doing::Util.default_editor.nil?
902
935
  input += date.strftime('%F %R | ')
903
936
  input += args.join(' ') unless args.empty?
937
+ input += "\n#{options[:note]}" if options[:note]
938
+ input += "\n#{ask_note}" unless ask_note.empty?
939
+
904
940
  input = wwid.fork_editor(input).strip
905
941
  elsif !args.empty?
906
942
  input = args.join(' ')
@@ -919,10 +955,9 @@ command :meanwhile do |c|
919
955
  note = []
920
956
  end
921
957
 
922
- if options[:note]
923
- note.push(options[:note])
924
- elsif note.empty?
925
- note = nil
958
+ unless options[:editor]
959
+ note.add(options[:note]) if options[:note]
960
+ note.add(ask_note) unless ask_note.empty?
926
961
  end
927
962
 
928
963
  wwid.stop_start('meanwhile', { new_item: input, back: date, section: section, archive: options[:archive], note: note })
@@ -958,7 +993,7 @@ command :note do |c|
958
993
 
959
994
  c.desc 'Add/remove note from last entry matching tag. Wildcards allowed (*, ?)'
960
995
  c.arg_name 'TAG'
961
- c.flag [:tag]
996
+ c.flag [:tag], type: TagArray
962
997
 
963
998
  c.desc 'Add/remove note from last entry matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("\'query")'
964
999
  c.arg_name 'QUERY'
@@ -988,6 +1023,9 @@ command :note do |c|
988
1023
  c.desc 'Select item for new note from a menu of matching entries'
989
1024
  c.switch %i[i interactive], negatable: false, default_value: false
990
1025
 
1026
+ c.desc 'Prompt for note via multi-line input'
1027
+ c.switch %i[ask], negatable: false, default_value: false
1028
+
991
1029
  c.action do |_global_options, options, args|
992
1030
  options[:fuzzy] = false
993
1031
  if options[:section]
@@ -1014,8 +1052,9 @@ command :note do |c|
1014
1052
 
1015
1053
  last_note = last_entry.note || Doing::Note.new
1016
1054
  new_note = Doing::Note.new
1055
+ ask_note = options[:ask] ? Doing::Prompt.request_lines(prompt: 'Add a note') : ''
1017
1056
 
1018
- if options[:editor] || (args.empty? && $stdin.stat.size.zero? && !options[:remove])
1057
+ if options[:editor] || (args.empty? && $stdin.stat.size.zero? && !options[:remove] && !options[:ask])
1019
1058
  raise MissingEditor, 'No EDITOR variable defined in environment' if Doing::Util.default_editor.nil?
1020
1059
 
1021
1060
  input = !args.empty? ? args.join(' ') : ''
@@ -1026,7 +1065,9 @@ command :note do |c|
1026
1065
  prev_input = last_entry.note || Doing::Note.new
1027
1066
  end
1028
1067
 
1068
+
1029
1069
  input = prev_input.add(input)
1070
+ input.add(ask_note) unless ask_note.empty?
1030
1071
 
1031
1072
  input = wwid.fork_editor(prev_input.strip_lines.join("\n"), message: nil).strip
1032
1073
  note = input
@@ -1037,9 +1078,12 @@ command :note do |c|
1037
1078
  elsif $stdin.stat.size.positive?
1038
1079
  new_note.add($stdin.read.strip)
1039
1080
  else
1040
- raise EmptyInput, 'You must provide content when adding a note' unless options[:remove]
1081
+ raise EmptyInput, 'You must provide content when adding a note' unless options[:remove] || !ask_note.empty?
1082
+
1041
1083
  end
1042
1084
 
1085
+ new_note.add(ask_note) unless ask_note.empty?
1086
+
1043
1087
  if last_note.equal?(new_note)
1044
1088
  Doing.logger.debug('Skipped:', 'No note change')
1045
1089
  else
@@ -1085,6 +1129,9 @@ command %i[now next] do |c|
1085
1129
  c.arg_name 'TEXT'
1086
1130
  c.flag %i[n note]
1087
1131
 
1132
+ c.desc 'Prompt for note via multi-line input'
1133
+ c.switch %i[ask], negatable: false, default_value: false
1134
+
1088
1135
  # c.desc "Edit entry with specified app"
1089
1136
  # c.arg_name 'editor_app'
1090
1137
  # # c.flag [:a, :app]
@@ -1104,23 +1151,28 @@ command %i[now next] do |c|
1104
1151
  options[:section] = settings['current_section']
1105
1152
  end
1106
1153
 
1154
+ ask_note = options[:ask] ? Doing::Prompt.request_lines(prompt: 'Add a note') : ''
1155
+
1107
1156
  if options[:editor] || (args.empty? && $stdin.stat.size.zero?)
1108
1157
  raise MissingEditor, 'No EDITOR variable defined in environment' if Doing::Util.default_editor.nil?
1109
1158
 
1110
1159
  input = date.strftime('%F %R | ')
1111
1160
  input += args.join(' ') unless args.empty?
1161
+ input += "\n#{options[:note]}" if options[:note]
1162
+ input += "\n#{ask_note}" unless ask_note.empty?
1112
1163
  input = wwid.fork_editor(input).strip
1113
1164
 
1114
1165
  raise EmptyInput, 'No content' if input.empty?
1115
1166
 
1116
1167
  date, title, note = wwid.format_input(input)
1117
- note.add(options[:note]) if options[:note]
1168
+
1118
1169
  wwid.add_item(title.cap_first, section, { note: note, back: date, timed: options[:finish_last] })
1119
1170
  wwid.write(wwid.doing_file)
1120
1171
  elsif args.length.positive?
1121
1172
  d, title, note = wwid.format_input(args.join(' '))
1122
1173
  date = d.nil? ? date : d
1123
1174
  note.add(options[:note]) if options[:note]
1175
+ note.add(ask_note) unless ask_note.empty?
1124
1176
  wwid.add_item(title.cap_first, section, { note: note, back: date, timed: options[:finish_last] })
1125
1177
  wwid.write(wwid.doing_file)
1126
1178
  elsif $stdin.stat.size.positive?
@@ -1131,6 +1183,7 @@ command %i[now next] do |c|
1131
1183
  date = d
1132
1184
  end
1133
1185
  note.add(options[:note]) if options[:note]
1186
+ note.add(ask_note) unless ask_note.empty?
1134
1187
  wwid.add_item(title.cap_first, section, { note: note, back: date, timed: options[:finish_last] })
1135
1188
  wwid.write(wwid.doing_file)
1136
1189
  else
@@ -1283,7 +1336,11 @@ command :select do |c|
1283
1336
 
1284
1337
  c.desc 'Initial search query for filtering. Matching is fuzzy. For exact matching, start query with a single quote, e.g. `--query "\'search"'
1285
1338
  c.arg_name 'QUERY'
1286
- c.flag %i[q query search]
1339
+ c.flag %i[q query]
1340
+
1341
+ c.desc 'Select from entries matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("\'query")'
1342
+ c.arg_name 'QUERY'
1343
+ c.flag [:search]
1287
1344
 
1288
1345
  c.desc 'Perform a tag value query ("@done > two hours ago" or "@progress < 50"). May be used multiple times, combined with --bool'
1289
1346
  c.arg_name 'QUERY'
@@ -1421,7 +1478,7 @@ command :tag do |c|
1421
1478
  c.desc 'Tag the last X entries containing TAG.
1422
1479
  Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).'
1423
1480
  c.arg_name 'TAG'
1424
- c.flag [:tag]
1481
+ c.flag [:tag], type: TagArray
1425
1482
 
1426
1483
  c.desc 'Tag entries matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("\'query")'
1427
1484
  c.arg_name 'QUERY'
@@ -1467,7 +1524,7 @@ command :tag do |c|
1467
1524
  if options[:tag].nil?
1468
1525
  search_tags = []
1469
1526
  else
1470
- search_tags = options[:tag].to_tags
1527
+ search_tags = options[:tag]
1471
1528
  end
1472
1529
 
1473
1530
  if options[:autotag]
@@ -1688,7 +1745,7 @@ command :last do |c|
1688
1745
 
1689
1746
  c.desc 'Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?)'
1690
1747
  c.arg_name 'TAG'
1691
- c.flag [:tag]
1748
+ c.flag [:tag], type: TagArray
1692
1749
 
1693
1750
  c.desc 'Tag boolean (AND|OR|NOT). Use PATTERN to parse + and - as booleans'
1694
1751
  c.arg_name 'BOOLEAN'
@@ -1725,7 +1782,7 @@ command :last do |c|
1725
1782
  if options[:tag].nil?
1726
1783
  options[:tag] = []
1727
1784
  else
1728
- options[:tag] = options[:tag].to_tags
1785
+ options[:tag] = options[:tag]
1729
1786
  options[:bool] = options[:bool].normalize_bool
1730
1787
  end
1731
1788
 
@@ -1855,7 +1912,7 @@ command :show do |c|
1855
1912
 
1856
1913
  c.desc 'Tag filter, combine multiple tags with a comma. Use `--tag pick` for a menu of available tags. Wildcards allowed (*, ?). Added for compatibility with other commands'
1857
1914
  c.arg_name 'TAG'
1858
- c.flag [:tag]
1915
+ c.flag [:tag], type: TagArray
1859
1916
 
1860
1917
  c.desc 'Perform a tag value query ("@done > two hours ago" or "@progress < 50"). May be used multiple times, combined with --bool'
1861
1918
  c.arg_name 'QUERY'
@@ -1988,7 +2045,7 @@ command :show do |c|
1988
2045
  section ||= 'All'
1989
2046
  end
1990
2047
 
1991
- tags.concat(options[:tag].to_tags) if options[:tag]
2048
+ tags.concat(options[:tag]) if options[:tag]
1992
2049
 
1993
2050
  options[:times] = true if options[:totals]
1994
2051
 
@@ -3004,7 +3061,7 @@ command %i[archive move] do |c|
3004
3061
 
3005
3062
  c.desc 'Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?). Added for compatibility with other commands'
3006
3063
  c.arg_name 'TAG'
3007
- c.flag [:tag]
3064
+ c.flag [:tag], type: TagArray
3008
3065
 
3009
3066
  c.desc 'Tag boolean (AND|OR|NOT). Use PATTERN to parse + and - as booleans'
3010
3067
  c.arg_name 'BOOLEAN'
@@ -3053,7 +3110,7 @@ command %i[archive move] do |c|
3053
3110
 
3054
3111
  raise InvalidArgument, '--keep and --count can not be used together' if options[:keep] && options[:count]
3055
3112
 
3056
- tags.concat(options[:tag].to_tags) if options[:tag]
3113
+ tags.concat(options[:tag]) if options[:tag]
3057
3114
 
3058
3115
  search = nil
3059
3116
 
@@ -3113,7 +3170,7 @@ command :import do |c|
3113
3170
 
3114
3171
  c.desc 'Tag all imported entries'
3115
3172
  c.arg_name 'TAGS'
3116
- c.flag :tag
3173
+ c.flag %i[t tag]
3117
3174
 
3118
3175
  c.desc 'Autotag entries'
3119
3176
  c.switch :autotag, negatable: true, default_value: true
@@ -3148,6 +3205,12 @@ command :import do |c|
3148
3205
  options[:section] = wwid.guess_section(options[:section]) || options[:section].cap_first
3149
3206
  end
3150
3207
 
3208
+ if options[:search]
3209
+ search = options[:search]
3210
+ search.sub!(/^'?/, "'") if options[:exact]
3211
+ options[:search] = search
3212
+ end
3213
+
3151
3214
  if options[:from]
3152
3215
  date_string = options[:from]
3153
3216
  if date_string =~ / (to|through|thru|(un)?til|-+) /
@@ -3156,7 +3219,7 @@ command :import do |c|
3156
3219
  finish = dates[2].chronify(guess: :end)
3157
3220
  else
3158
3221
  start = date_string.chronify(guess: :begin)
3159
- finish = false
3222
+ finish = date_string.chronify(guess: :end)
3160
3223
  end
3161
3224
  raise InvalidTimeExpression, 'Unrecognized date string' unless start
3162
3225
  dates = [start, finish]
data/docs/doc/Array.html CHANGED
@@ -540,7 +540,7 @@ with</p>
540
540
  </div>
541
541
 
542
542
  <div id="footer">
543
- Generated on Fri Jan 14 21:59:14 2022 by
543
+ Generated on Sat Jan 15 17:27:48 2022 by
544
544
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
545
545
  0.9.26 (ruby-3.0.1).
546
546
  </div>
@@ -283,7 +283,7 @@
283
283
  </div>
284
284
 
285
285
  <div id="footer">
286
- Generated on Fri Jan 14 21:59:14 2022 by
286
+ Generated on Sat Jan 15 17:27:48 2022 by
287
287
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
288
288
  0.9.26 (ruby-3.0.1).
289
289
  </div>
@@ -162,7 +162,7 @@
162
162
  </div>
163
163
 
164
164
  <div id="footer">
165
- Generated on Fri Jan 14 21:59:14 2022 by
165
+ Generated on Sat Jan 15 17:27:48 2022 by
166
166
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
167
167
  0.9.26 (ruby-3.0.1).
168
168
  </div>
@@ -407,7 +407,7 @@
407
407
  </div>
408
408
 
409
409
  <div id="footer">
410
- Generated on Fri Jan 14 21:59:14 2022 by
410
+ Generated on Sat Jan 15 17:27:48 2022 by
411
411
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
412
412
  0.9.26 (ruby-3.0.1).
413
413
  </div>
@@ -125,7 +125,7 @@ parser. In order to do that, a new &quot;clause&quot; node is added to the parse
125
125
  </div>
126
126
 
127
127
  <div id="footer">
128
- Generated on Fri Jan 14 21:59:14 2022 by
128
+ Generated on Sat Jan 15 17:27:48 2022 by
129
129
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
130
130
  0.9.26 (ruby-3.0.1).
131
131
  </div>
@@ -114,7 +114,7 @@
114
114
  </div>
115
115
 
116
116
  <div id="footer">
117
- Generated on Fri Jan 14 21:59:14 2022 by
117
+ Generated on Sat Jan 15 17:27:48 2022 by
118
118
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
119
119
  0.9.26 (ruby-3.0.1).
120
120
  </div>
@@ -105,7 +105,7 @@
105
105
  </div>
106
106
 
107
107
  <div id="footer">
108
- Generated on Fri Jan 14 21:59:14 2022 by
108
+ Generated on Sat Jan 15 17:27:48 2022 by
109
109
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
110
110
  0.9.26 (ruby-3.0.1).
111
111
  </div>
@@ -508,7 +508,7 @@ ANSI-sequences are stripped from the string.</p>
508
508
  </div>
509
509
 
510
510
  <div id="footer">
511
- Generated on Fri Jan 14 21:59:13 2022 by
511
+ Generated on Sat Jan 15 17:27:48 2022 by
512
512
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
513
513
  0.9.26 (ruby-3.0.1).
514
514
  </div>
@@ -206,7 +206,7 @@ stdout</p>
206
206
  </div>
207
207
 
208
208
  <div id="footer">
209
- Generated on Fri Jan 14 21:59:14 2022 by
209
+ Generated on Sat Jan 15 17:27:48 2022 by
210
210
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
211
211
  0.9.26 (ruby-3.0.1).
212
212
  </div>
@@ -1101,7 +1101,7 @@ matched, first match wins)</p>
1101
1101
  </div>
1102
1102
 
1103
1103
  <div id="footer">
1104
- Generated on Fri Jan 14 21:59:14 2022 by
1104
+ Generated on Sat Jan 15 17:27:48 2022 by
1105
1105
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1106
1106
  0.9.26 (ruby-3.0.1).
1107
1107
  </div>
@@ -176,7 +176,7 @@
176
176
  </div>
177
177
 
178
178
  <div id="footer">
179
- Generated on Fri Jan 14 21:59:14 2022 by
179
+ Generated on Sat Jan 15 17:27:48 2022 by
180
180
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
181
181
  0.9.26 (ruby-3.0.1).
182
182
  </div>
@@ -176,7 +176,7 @@
176
176
  </div>
177
177
 
178
178
  <div id="footer">
179
- Generated on Fri Jan 14 21:59:14 2022 by
179
+ Generated on Sat Jan 15 17:27:48 2022 by
180
180
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
181
181
  0.9.26 (ruby-3.0.1).
182
182
  </div>
@@ -176,7 +176,7 @@
176
176
  </div>
177
177
 
178
178
  <div id="footer">
179
- Generated on Fri Jan 14 21:59:14 2022 by
179
+ Generated on Sat Jan 15 17:27:48 2022 by
180
180
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
181
181
  0.9.26 (ruby-3.0.1).
182
182
  </div>
@@ -176,7 +176,7 @@
176
176
  </div>
177
177
 
178
178
  <div id="footer">
179
- Generated on Fri Jan 14 21:59:14 2022 by
179
+ Generated on Sat Jan 15 17:27:48 2022 by
180
180
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
181
181
  0.9.26 (ruby-3.0.1).
182
182
  </div>