na 1.2.59 → 1.2.60

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 271fbdd631a1b52f0f642ceb291de5b1827282b568d0b510d4cf3ab745660327
4
- data.tar.gz: 730d5d92191a55c352282429f16215a0a2aab0087bb7072278034d44340ac0ac
3
+ metadata.gz: c10e15eae9292e8245903b543c8adbb990be7fe7f166ee7d8636e557b4324aa5
4
+ data.tar.gz: e625f1a56c6aa903ba273909b0dad8e230313ab119276d44f76a58da51c8561d
5
5
  SHA512:
6
- metadata.gz: 9b67d5f684b95260f3df6b991b9ad86004ab0a55a088f71aaf7028ac41671538109315dbc8e96188cc4ab3efd37472d1da1d3bf2c1f51cd2af3757bf687f5463
7
- data.tar.gz: 8c3af84aac1bcc1355dcc0eb116146c28cbb2da00d6d636516a58d533bb71aff02960034fcdad9773989e746a01d7e64e0865bf20f3896092ecb4edf7a1475df
6
+ metadata.gz: e84356c63836c19be6d87c3acb213c3741d8476b9c9ce4f03df6ce5024b21cdb6e0ba01dcdeca8bda0a8fbeea6a8fbd4bf42db6a44c77b574162f94e2e1bb868
7
+ data.tar.gz: 93f0d4512a6fed663e7717e2ba3a64358dd8f3d931aa39ae0a44744ba0c479c6b0b3a24fd312bf7c754f24b3be07adf46d85342065e18fc012a52728069a6bf9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ### 1.2.60
2
+
3
+ 2023-10-03 12:31
4
+
5
+ #### NEW
6
+
7
+ - Added `--search_notes` to allow searching of notes when using `find` or `tagged --search`. Defaults to true, can be disabled with `--no-search_notes`
8
+
9
+ #### IMPROVED
10
+
11
+ - Added `--search_notes` to completed, restore, edit, and update
12
+ - Add `--search_notes` to `tag`
13
+ - Add `--search_notes` to `complete`
14
+ - Add `--search_notes` to `next`
15
+
1
16
  ### 1.2.59
2
17
 
3
18
  2023-10-03 07:43
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- na (1.2.59)
4
+ na (1.2.60)
5
5
  chronic (~> 0.10, >= 0.10.2)
6
6
  gli (~> 2.21.0)
7
7
  mdless (~> 1.0, >= 1.0.32)
data/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  _If you're one of the rare people like me who find this useful, feel free to
10
10
  [buy me some coffee][donate]._
11
11
 
12
- The current version of `na` is 1.2.59
12
+ The current version of `na` is 1.2.60
13
13
  .
14
14
 
15
15
  `na` ("next action") is a command line tool designed to make it easy to see what your next actions are for any project, right from the command line. It works with TaskPaper-formatted files (but any plain text format will do), looking for `@na` tags (or whatever you specify) in todo files in your current folder.
@@ -77,7 +77,7 @@ SYNOPSIS
77
77
  na [global options] command [command options] [arguments...]
78
78
 
79
79
  VERSION
80
- 1.2.59
80
+ 1.2.60
81
81
 
82
82
  GLOBAL OPTIONS
83
83
  -a, --add - Add a next action (deprecated, for backwards compatibility)
@@ -190,6 +190,7 @@ COMMAND OPTIONS
190
190
  -e, --regex - Interpret search pattern as regular expression
191
191
  --file=PATH - Specify the file to search for the task (default: none)
192
192
  --in, --todo=TODO_FILE - Use a known todo file, partial matches allowed (default: none)
193
+ --[no-]search_notes - Include notes in search (default: enabled)
193
194
  --tagged=TAG - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
194
195
  -x, --exact - Match pattern exactly
195
196
 
@@ -227,6 +228,7 @@ COMMAND OPTIONS
227
228
  --omnifocus - Output actions nested by file and project
228
229
  --proj, --project=PROJECT[/SUBPROJECT] - Show actions from a specific project (default: none)
229
230
  --save=TITLE - Save this search for future use (default: none)
231
+ --[no-]search_notes - Include notes in search (default: enabled)
230
232
  --tagged=TAG - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
231
233
  -v, --invert - Show actions not matching search pattern
232
234
  -x, --exact - Match pattern exactly
@@ -288,7 +290,8 @@ COMMAND OPTIONS
288
290
  -d, --depth=DEPTH - Recurse to depth (default: none)
289
291
  --[no-]done - Include @done actions
290
292
  --exact - Search query is exact text match (not tokens)
291
- --in, --todo=TODO_FILE - Display matches from a known todo file (may be used more than once, default: none)
293
+ --file=TODO_FILE - Display matches from specific todo file ([relative] path) (default: none)
294
+ --in, --todo=TODO - Display matches from a known todo file anywhere in history (short name) (may be used more than once, default: none)
292
295
  --nest - Output actions nested by file
293
296
  --[no-]notes - Include notes in output
294
297
  --omnifocus - Output actions nested by file and project
@@ -296,6 +299,7 @@ COMMAND OPTIONS
296
299
  --regex - Search query is regular expression
297
300
  --save=TITLE - Save this search for future use (default: none)
298
301
  --search, --find, --grep=QUERY - Filter results using search terms (may be used more than once, default: none)
302
+ --[no-]search_notes - Include notes in search (default: enabled)
299
303
  -t, --tag=TAG - Alternate tag to search for (default: none)
300
304
  --tagged=TAG - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
301
305
 
@@ -402,7 +406,8 @@ COMMAND OPTIONS
402
406
  -d, --depth=DEPTH - Recurse to depth (default: none)
403
407
  --[no-]done - Include @done actions
404
408
  --exact - Search query is exact text match (not tokens)
405
- --in, --todo=TODO_FILE - Display matches from a known todo file (may be used more than once, default: none)
409
+ --file=TODO_FILE - Display matches from specific todo file ([relative] path) (default: none)
410
+ --in, --todo=TODO - Display matches from a known todo file anywhere in history (short name) (may be used more than once, default: none)
406
411
  --nest - Output actions nested by file
407
412
  --[no-]notes - Include notes in output
408
413
  --omnifocus - Output actions nested by file and project
@@ -410,6 +415,7 @@ COMMAND OPTIONS
410
415
  --regex - Search query is regular expression
411
416
  --save=TITLE - Save this search for future use (default: none)
412
417
  --search, --find, --grep=QUERY - Filter results using search terms (may be used more than once, default: none)
418
+ --[no-]search_notes - Include notes in search (default: enabled)
413
419
  -t, --tag=TAG - Alternate tag to search for (default: none)
414
420
  --tagged=TAG - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
415
421
 
@@ -509,6 +515,7 @@ COMMAND OPTIONS
509
515
  --replace=TEXT - Use with --find to find and replace with new text. Enables --exact when used (default: none)
510
516
  --restore - Remove @done tag from action
511
517
  --search, --find, --grep=QUERY - Filter results using search terms (may be used more than once, default: none)
518
+ --[no-]search_notes - Include notes in search (default: enabled)
512
519
  -t, --tag=TAG - Add a tag to the action, @tag(values) allowed, use multiple times or combine multiple tags with a comma (may be used more than once, default: none)
513
520
  --tagged=TAG - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
514
521
  --to, --move=PROJECT - Move action to specific project (default: none)
@@ -562,6 +569,7 @@ COMMAND OPTIONS
562
569
  -o, --overwrite - Overwrite note instead of appending
563
570
  --proj, --project=PROJECT[/SUBPROJECT] - Affect actions from a specific project (default: none)
564
571
  --search, --find, --grep=QUERY - Filter results using search terms (may be used more than once, default: none)
572
+ --[no-]search_notes - Include notes in search (default: enabled)
565
573
  --tagged=TAG - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
566
574
  --to, --move=PROJECT - Move action to specific project (default: none)
567
575
  -x, --exact - Match pattern exactly
@@ -632,6 +640,7 @@ COMMAND OPTIONS
632
640
  --file=PATH - Specify the file to search for the task (default: none)
633
641
  --in, --todo=TODO_FILE - Use a known todo file, partial matches allowed (default: none)
634
642
  --search, --find, --grep=QUERY - Filter results using search terms (may be used more than once, default: none)
643
+ --[no-]search_notes - Include notes in search (default: enabled)
635
644
  --tagged=TAG - Match actions containing tag. Allows value comparisons (may be used more than once, default: none)
636
645
  -x, --exact - Match pattern exactly
637
646
 
@@ -44,6 +44,9 @@ class App
44
44
  c.arg_name 'QUERY'
45
45
  c.flag %i[search find grep], multiple: true
46
46
 
47
+ c.desc 'Include notes in search'
48
+ c.switch %i[search_notes], negatable: true, default_value: true
49
+
47
50
  c.desc 'Match actions containing tag. Allows value comparisons'
48
51
  c.arg_name 'TAG'
49
52
  c.flag %i[tagged], multiple: true
@@ -44,6 +44,9 @@ class App
44
44
  c.desc 'Include notes in output'
45
45
  c.switch %i[notes], negatable: true, default_value: false
46
46
 
47
+ c.desc 'Include notes in search'
48
+ c.switch %i[search_notes], negatable: true, default_value: true
49
+
47
50
  c.desc 'Show actions from a specific project'
48
51
  c.arg_name 'PROJECT[/SUBPROJECT]'
49
52
  c.flag %i[proj project]
@@ -75,9 +78,9 @@ class App
75
78
  tag_string.concat(options[:tagged]) if options[:tagged]
76
79
 
77
80
  if args.empty?
78
- cmd_string = %(tagged --done "#{tag_string.join(',')}")
81
+ cmd_string = %(tagged --done)
79
82
  else
80
- cmd_string = %(find --tagged "#{tag_string.join(',')}" --done #{args.join(' ')})
83
+ cmd_string = %(find --tagged "#{tag_string.join(',')}" --done)
81
84
  end
82
85
 
83
86
  cmd_string += ' --or' if options[:or]
@@ -86,13 +89,20 @@ class App
86
89
  cmd_string += %( --depth #{options[:depth]}) if options[:depth]
87
90
  cmd_string += ' --nest' if options[:nest]
88
91
  cmd_string += ' --omnifocus' if options[:omnifocus]
92
+ cmd_string += " --#{options[:search_notes] ? 'search_notes' : 'no-search_notes'}"
89
93
  cmd_string += " --#{options[:notes] ? 'notes' : 'no-notes' }"
90
94
 
95
+ if args.empty?
96
+ cmd_string += " #{tag_string.join(',')}"
97
+ else
98
+ cmd_string += " #{args.join(' ')}"
99
+ end
100
+
91
101
  if options[:save]
92
102
  title = options[:save].gsub(/[^a-z0-9]/, '_').gsub(/_+/, '_')
93
103
  NA.save_search(title, cmd_string)
94
104
  end
95
-
105
+ puts cmd_string
96
106
  exit run(Shellwords.shellsplit(cmd_string))
97
107
  end
98
108
  end
data/bin/commands/edit.rb CHANGED
@@ -39,6 +39,9 @@ class App
39
39
  c.desc 'Match pattern exactly'
40
40
  c.switch %i[x exact], negatable: false
41
41
 
42
+ c.desc 'Include notes in search'
43
+ c.switch %i[search_notes], negatable: true, default_value: true
44
+
42
45
  c.action do |global_options, options, args|
43
46
  options[:edit] = true
44
47
  action = if args.count.positive?
@@ -130,6 +133,7 @@ class App
130
133
  targets.each do |target|
131
134
  NA.update_action(target,
132
135
  tokens,
136
+ search_note: options[:search_notes],
133
137
  done: options[:done],
134
138
  edit: options[:edit],
135
139
  project: target_proj,
data/bin/commands/find.rb CHANGED
@@ -29,6 +29,9 @@ class App
29
29
  c.desc 'Include notes in output'
30
30
  c.switch %i[notes], negatable: true, default_value: false
31
31
 
32
+ c.desc 'Include notes in search'
33
+ c.switch %i[search_notes], negatable: true, default_value: true
34
+
32
35
  c.desc 'Combine search tokens with OR, displaying actions matching ANY of the terms'
33
36
  c.switch %i[o or], negatable: false
34
37
 
@@ -93,7 +96,7 @@ class App
93
96
 
94
97
  search = search.gsub(/ +/, ' ').strip
95
98
 
96
- all_req = options[:tagged].join(' ') !~ /[+!-]/ && !options[:or]
99
+ all_req = options[:tagged].join(' ') !~ /(?<=[, ])[+!-]/ && !options[:or]
97
100
  tags = []
98
101
  options[:tagged].join(',').split(/ *, */).each do |arg|
99
102
  m = arg.match(/^(?<req>[+!-])?(?<tag>[^ =<>$~\^]+?) *(?:(?<op>[=<>~]{1,2}|[*$\^]=) *(?<val>.*?))?$/)
@@ -149,6 +152,7 @@ class App
149
152
  done: options[:done],
150
153
  query: todos,
151
154
  search: tokens,
155
+ search_note: options[:search_notes],
152
156
  tag: tags,
153
157
  negate: options[:invert],
154
158
  regex: options[:regex],
data/bin/commands/next.rb CHANGED
@@ -22,10 +22,14 @@ class App
22
22
  c.desc 'Show next actions from all known todo files (in any directory)'
23
23
  c.switch %i[all], negatable: false, default_value: false
24
24
 
25
- c.desc 'Display matches from a known todo file'
26
- c.arg_name 'TODO_FILE'
25
+ c.desc 'Display matches from a known todo file anywhere in history (short name)'
26
+ c.arg_name 'TODO'
27
27
  c.flag %i[in todo], multiple: true
28
28
 
29
+ c.desc 'Display matches from specific todo file ([relative] path)'
30
+ c.arg_name 'TODO_FILE'
31
+ c.flag %i[file]
32
+
29
33
  c.desc 'Alternate tag to search for'
30
34
  c.arg_name 'TAG'
31
35
  c.flag %i[t tag]
@@ -42,6 +46,9 @@ class App
42
46
  c.arg_name 'QUERY'
43
47
  c.flag %i[search find grep], multiple: true
44
48
 
49
+ c.desc 'Include notes in search'
50
+ c.switch %i[search_notes], negatable: true, default_value: true
51
+
45
52
  c.desc 'Search query is regular expression'
46
53
  c.switch %i[regex], negatable: false
47
54
 
@@ -169,13 +176,17 @@ class App
169
176
  tag << { tag: 'done', value: nil, negate: true } unless options[:done]
170
177
  tag.concat(tags)
171
178
 
179
+ file_path = options[:file] ? File.expand_path(options[:file]) : nil
180
+
172
181
  todo = NA::Todo.new({ depth: depth,
173
182
  done: options[:done],
183
+ file_path: file_path,
184
+ project: options[:project],
174
185
  query: tokens,
175
- tag: tag,
186
+ require_na: require_na,
176
187
  search: search_tokens,
177
- project: options[:project],
178
- require_na: require_na })
188
+ search_note: options[:search_notes],
189
+ tag: tag })
179
190
  if todo.files.empty? && tokens
180
191
  NA.notify("#{NA.theme[:error]}No matches found for #{tokens[0][:token]}.
181
192
  Run `na todos` to see available todo files.")
@@ -183,9 +194,9 @@ class App
183
194
  NA::Pager.paginate = false if options[:omnifocus]
184
195
  todo.actions.output(depth,
185
196
  files: todo.files,
186
- notes: options[:notes],
187
197
  nest: options[:nest],
188
- nest_projects: options[:omnifocus])
198
+ nest_projects: options[:omnifocus],
199
+ notes: options[:notes])
189
200
  end
190
201
  end
191
202
  end
@@ -23,7 +23,7 @@ class App
23
23
 
24
24
  c.desc 'Specify the file to search for the task'
25
25
  c.arg_name 'PATH'
26
- c.flag %i[file]
26
+ c.flag %i[file in]
27
27
 
28
28
  c.desc 'Search for files X directories deep'
29
29
  c.arg_name 'DEPTH'
@@ -42,6 +42,9 @@ class App
42
42
  c.desc 'Match pattern exactly'
43
43
  c.switch %i[x exact], negatable: false
44
44
 
45
+ c.desc 'Include notes in search'
46
+ c.switch %i[search_notes], negatable: true, default_value: true
47
+
45
48
  c.action do |global, options, args|
46
49
  options[:remove] = ['done']
47
50
  options[:done] = true
data/bin/commands/tag.rb CHANGED
@@ -46,6 +46,9 @@ class App
46
46
  c.arg_name 'QUERY'
47
47
  c.flag %i[search find grep], multiple: true
48
48
 
49
+ c.desc 'Include notes in search'
50
+ c.switch %i[search_notes], negatable: true, default_value: true
51
+
49
52
  c.desc 'Interpret search pattern as regular expression'
50
53
  c.switch %i[e regex], negatable: false
51
54
 
@@ -152,6 +155,7 @@ class App
152
155
 
153
156
  targets.each do |target|
154
157
  NA.update_action(target, tokens,
158
+ search_note: options[:search_notes],
155
159
  add_tag: add_tags,
156
160
  all: options[:all],
157
161
  done: options[:done],
@@ -40,6 +40,9 @@ class App
40
40
  c.arg_name 'QUERY'
41
41
  c.flag %i[search find grep], multiple: true
42
42
 
43
+ c.desc 'Include notes in search'
44
+ c.switch %i[search_notes], negatable: true, default_value: true
45
+
43
46
  c.desc 'Search query is regular expression'
44
47
  c.switch %i[regex], negatable: false
45
48
 
@@ -139,6 +142,7 @@ class App
139
142
  done: options[:done],
140
143
  query: todos,
141
144
  search: tokens,
145
+ search_note: options[:search_notes],
142
146
  tag: tags,
143
147
  negate: options[:invert],
144
148
  project: options[:project],
@@ -87,6 +87,9 @@ class App
87
87
  c.arg_name 'QUERY'
88
88
  c.flag %i[search find grep], multiple: true
89
89
 
90
+ c.desc 'Include notes in search'
91
+ c.switch %i[search_notes], negatable: true, default_value: true
92
+
90
93
  c.desc 'Match actions containing tag. Allows value comparisons'
91
94
  c.arg_name 'TAG'
92
95
  c.flag %i[tagged], multiple: true
@@ -103,7 +106,7 @@ class App
103
106
  c.action do |global_options, options, args|
104
107
  reader = TTY::Reader.new
105
108
 
106
- args.concat(options[:search])
109
+ args.concat(options[:search]) unless options[:search].nil?
107
110
 
108
111
  append = options[:at] ? options[:at] =~ /^[ae]/i : global_options[:add_at] =~ /^[ae]/i
109
112
 
@@ -257,6 +260,7 @@ class App
257
260
  project: options[:project],
258
261
  remove_tag: remove_tags,
259
262
  replace: options[:replace],
263
+ search_note: options[:search_notes],
260
264
  tagged: tags)
261
265
  end
262
266
  end
data/lib/na/action.rb CHANGED
@@ -140,31 +140,36 @@ module NA
140
140
  tag_matches_any(any) && tag_matches_all(all) && tag_matches_none(none)
141
141
  end
142
142
 
143
- def search_match?(any: [], all: [], none: [])
144
- search_matches_any(any) && search_matches_all(all) && search_matches_none(none)
143
+ def search_match?(any: [], all: [], none: [], include_note: true)
144
+ search_matches_any(any, include_note: include_note) &&
145
+ search_matches_all(all, include_note: include_note) &&
146
+ search_matches_none(none, include_note: include_note)
145
147
  end
146
148
 
147
149
  private
148
150
 
149
- def search_matches_none(regexes)
151
+ def search_matches_none(regexes, include_note: true)
150
152
  regexes.each do |rx|
151
- return false if @action.match(Regexp.new(rx, Regexp::IGNORECASE))
153
+ note_matches = include_note && @note.join(' ').match(Regexp.new(rx, Regexp::IGNORECASE))
154
+ return false if @action.match(Regexp.new(rx, Regexp::IGNORECASE)) || note_matches
152
155
  end
153
156
  true
154
157
  end
155
158
 
156
- def search_matches_any(regexes)
159
+ def search_matches_any(regexes, include_note: true)
157
160
  return true if regexes.empty?
158
161
 
159
162
  regexes.each do |rx|
160
- return true if @action.match(Regexp.new(rx, Regexp::IGNORECASE))
163
+ note_matches = include_note && @note.join(' ').match(Regexp.new(rx, Regexp::IGNORECASE))
164
+ return true if @action.match(Regexp.new(rx, Regexp::IGNORECASE)) || note_matches
161
165
  end
162
166
  false
163
167
  end
164
168
 
165
- def search_matches_all(regexes)
169
+ def search_matches_all(regexes, include_note: true)
166
170
  regexes.each do |rx|
167
- return false unless @action.match(Regexp.new(rx, Regexp::IGNORECASE))
171
+ note_matches = include_note && @note.join(' ').match(Regexp.new(rx, Regexp::IGNORECASE))
172
+ return false unless @action.match(Regexp.new(rx, Regexp::IGNORECASE)) || note_matches
168
173
  end
169
174
  true
170
175
  end
@@ -139,8 +139,9 @@ module NA
139
139
  todo.projects
140
140
  end
141
141
 
142
- def find_actions(target, search, tagged = nil, all: false, done: false, project: nil)
142
+ def find_actions(target, search, tagged = nil, all: false, done: false, project: nil, search_note: true)
143
143
  todo = NA::Todo.new({ search: search,
144
+ search_note: search_note,
144
145
  require_na: false,
145
146
  file_path: target,
146
147
  project: project,
@@ -231,6 +232,7 @@ module NA
231
232
 
232
233
  def update_action(target,
233
234
  search,
235
+ search_note: true,
234
236
  add: nil,
235
237
  add_tag: [],
236
238
  all: false,
@@ -327,7 +329,7 @@ module NA
327
329
 
328
330
  notify(add.pretty)
329
331
  else
330
- _, actions = find_actions(target, search, tagged, done: done, all: all, project: project)
332
+ _, actions = find_actions(target, search, tagged, done: done, all: all, project: project, search_note: search_note)
331
333
 
332
334
  return if actions.nil?
333
335
 
data/lib/na/string.rb CHANGED
@@ -39,6 +39,8 @@ class ::String
39
39
  file = File.expand_path(self)
40
40
  raise "Missing file #{file}" unless File.exist?(file)
41
41
 
42
+ NA.notify("#{NA.theme[:error]}#{file} is a directory", exit_code: 2) if File.directory?(file)
43
+
42
44
  # IO.read(file).force_encoding('ASCII-8BIT').encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')
43
45
  IO.read(file).force_encoding('utf-8')
44
46
  end
data/lib/na/todo.rb CHANGED
@@ -37,6 +37,7 @@ module NA
37
37
  regex: false,
38
38
  require_na: true,
39
39
  search: nil,
40
+ search_note: true,
40
41
  tag: nil
41
42
  }
42
43
 
@@ -93,7 +94,7 @@ module NA
93
94
  else
94
95
  NA.match_working_dir(settings[:query])
95
96
  end
96
-
97
+ NA.notify("Files: #{files.join(', ')}", debug:true)
97
98
  files.each do |file|
98
99
  NA.save_working_dir(File.expand_path(file))
99
100
  content = file.read_file
@@ -124,7 +125,7 @@ module NA
124
125
 
125
126
  indent_level = indent
126
127
  elsif line.blank?
127
- in_action = false
128
+ in_action = false # Comment out to allow line breaks in of notes, which isn't TaskPaper-compatible
128
129
  elsif line.action?
129
130
  in_action = false
130
131
 
@@ -137,10 +138,6 @@ module NA
137
138
 
138
139
  next if settings[:require_na] && !line.na?
139
140
 
140
- has_search = !optional.empty? || !required.empty? || !negated.empty?
141
- next if has_search && !new_action.search_match?(any: optional,
142
- all: required,
143
- none: negated)
144
141
  if settings[:project]
145
142
  rx = settings[:project].split(%r{[/:]}).join('.*?/')
146
143
  next unless parent.join('/') =~ Regexp.new("#{rx}.*?", Regexp::IGNORECASE)
@@ -161,6 +158,14 @@ module NA
161
158
  projects = projects.dup
162
159
  end
163
160
 
161
+ actions.delete_if do |new_action|
162
+ has_search = !optional.empty? || !required.empty? || !negated.empty?
163
+ has_search && !new_action.search_match?(any: optional,
164
+ all: required,
165
+ none: negated,
166
+ include_note: settings[:search_note])
167
+ end
168
+
164
169
  [files, actions, projects]
165
170
  end
166
171
 
data/lib/na/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Na
2
- VERSION = '1.2.59'
2
+ VERSION = '1.2.60'
3
3
  end
data/src/_README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  _If you're one of the rare people like me who find this useful, feel free to
10
10
  [buy me some coffee][donate]._
11
11
 
12
- The current version of `na` is <!--VER-->1.2.58<!--END VER-->.
12
+ The current version of `na` is <!--VER-->1.2.59<!--END VER-->.
13
13
 
14
14
  `na` ("next action") is a command line tool designed to make it easy to see what your next actions are for any project, right from the command line. It works with TaskPaper-formatted files (but any plain text format will do), looking for `@na` tags (or whatever you specify) in todo files in your current folder.
15
15
 
data/test.md CHANGED
@@ -3,13 +3,18 @@ comment: 2023-09-03
3
3
  keywords:
4
4
  ---
5
5
  Other New Project:
6
- - testing @na
6
+ - testing @na @butter
7
7
  Brand New Project:
8
8
  - testing @na
9
+ A multi line (multiline) note
10
+ with a line break
9
11
  - testing @na
10
12
  Project0:
13
+
11
14
  - Test1
15
+
12
16
  - Test2
17
+
13
18
  Project1:
14
19
  - Test4
15
20
  - Test5
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: na
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.59
4
+ version: 1.2.60
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra