markdown_exec 2.5.0 → 2.6.0

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/Gemfile.lock +2 -2
  4. data/Rakefile +3 -3
  5. data/bats/block-types.bats +13 -7
  6. data/bats/import.bats +6 -0
  7. data/bats/markup.bats +6 -15
  8. data/bats/options-collapse.bats +26 -0
  9. data/bats/options.bats +1 -1
  10. data/bats/table.bats +8 -0
  11. data/bats/test_helper.bash +74 -49
  12. data/bats/variable-expansion.bats +46 -0
  13. data/bin/tab_completion.sh +1 -1
  14. data/docs/dev/bats-document-configuration.md +8 -1
  15. data/docs/dev/block-type-bash.md +1 -1
  16. data/docs/dev/block-type-opts.md +1 -5
  17. data/docs/dev/block-type-vars.md +4 -0
  18. data/docs/dev/import-missing.md +2 -0
  19. data/docs/dev/menu-cli.md +1 -1
  20. data/docs/dev/options-collapse.md +47 -0
  21. data/docs/dev/requiring-blocks.md +3 -0
  22. data/docs/dev/specs.md +2 -1
  23. data/docs/dev/table-crash.md +39 -0
  24. data/docs/dev/table-indent.md +26 -0
  25. data/docs/dev/text-decoration.md +2 -5
  26. data/docs/dev/variable-expansion.md +2 -4
  27. data/examples/bash-blocks.md +1 -1
  28. data/examples/block-names.md +1 -1
  29. data/examples/block-types.md +1 -1
  30. data/examples/data-files.md +1 -1
  31. data/examples/document_options.md +2 -2
  32. data/examples/indent.md +1 -1
  33. data/examples/interrupt.md +1 -1
  34. data/examples/link-blocks-vars.md +1 -1
  35. data/examples/linked.md +1 -1
  36. data/examples/linked1.md +1 -1
  37. data/examples/nickname.md +1 -1
  38. data/examples/opts-blocks-require.md +1 -1
  39. data/examples/opts-blocks.md +1 -1
  40. data/examples/opts_output_execution.md +1 -1
  41. data/examples/pass-through-arguments.md +1 -1
  42. data/examples/pause-after-execution.md +1 -1
  43. data/examples/port-blocks.md +1 -1
  44. data/examples/save.md +1 -1
  45. data/examples/text-markup.md +1 -1
  46. data/examples/variable-expansion.md +6 -2
  47. data/examples/vars-blocks.md +1 -1
  48. data/examples/wrap.md +1 -1
  49. data/lib/block_types.rb +4 -0
  50. data/lib/cached_nested_file_reader.rb +7 -4
  51. data/lib/collapser.rb +302 -0
  52. data/lib/constants.rb +10 -0
  53. data/lib/evaluate_shell_expressions.rb +0 -3
  54. data/lib/fcb.rb +13 -17
  55. data/lib/format_table.rb +11 -7
  56. data/lib/hash_delegator.rb +461 -272
  57. data/lib/hierarchy_string.rb +5 -1
  58. data/lib/markdown_exec/version.rb +1 -1
  59. data/lib/markdown_exec.rb +16 -32
  60. data/lib/mdoc.rb +100 -35
  61. data/lib/menu.src.yml +124 -17
  62. data/lib/menu.yml +102 -16
  63. data/lib/ww.rb +75 -22
  64. metadata +12 -9
  65. data/lib/append_to_bash_history.rb +0 -303
  66. data/lib/ce_get_cost_and_usage.rb +0 -23
  67. data/lib/doh.rb +0 -190
  68. data/lib/layered_hash.rb +0 -143
  69. data/lib/poly.rb +0 -171
@@ -30,7 +30,7 @@ class HierarchyString
30
30
  attr_accessor :substrings
31
31
 
32
32
  # Initialize with a single hash or an array of hashes
33
- def initialize(substrings, text_sym: :text, style_sym: :color)
33
+ def initialize(substrings = [], text_sym: :text, style_sym: :color)
34
34
  @substrings = parse_substrings(substrings)
35
35
  @text_sym = text_sym
36
36
  @style_sym = style_sym
@@ -82,6 +82,10 @@ class HierarchyString
82
82
  decorate_substrings(@substrings)
83
83
  end
84
84
 
85
+ def padded_width
86
+ concatenate.length
87
+ end
88
+
85
89
  # Handle string inspection methods and pass them to the concatenated string
86
90
  def method_missing(method_name, *arguments, &block)
87
91
  if ''.respond_to?(method_name)
@@ -7,5 +7,5 @@ module MarkdownExec
7
7
  BIN_NAME = 'mde'
8
8
  GEM_NAME = 'markdown_exec'
9
9
  TAP_DEBUG = 'MDE_DEBUG'
10
- VERSION = '2.5.0'
10
+ VERSION = '2.6.0'
11
11
  end
data/lib/markdown_exec.rb CHANGED
@@ -15,7 +15,6 @@ require 'tty-prompt'
15
15
  require 'yaml'
16
16
 
17
17
  require_relative 'ansi_formatter'
18
- # require_relative 'block_label'
19
18
  require_relative 'cached_nested_file_reader'
20
19
  require_relative 'cli'
21
20
  require_relative 'color_scheme'
@@ -94,6 +93,7 @@ class NamedCaptureExtractor
94
93
  regexp = pattern.is_a?(Regexp) ? pattern : Regexp.new(pattern)
95
94
  str&.match(regexp)&.named_captures&.transform_keys(&:to_sym)
96
95
  end
96
+
97
97
  def self.extract_named_group2(match_data)
98
98
  match_data&.named_captures&.transform_keys(&:to_sym)
99
99
  end
@@ -415,14 +415,10 @@ module MarkdownExec
415
415
  options = calculated_options.merge(options)
416
416
  update_options(options, over: false)
417
417
  # recognize commands with an opt_name, no procname
418
- # !!b
419
418
  return if execute_simple_commands(options, stage: 1)
420
- # !!b
421
419
 
422
420
  mde_vux_main_loop(opts_prepare_file_list(options))
423
- # !!b
424
421
  return unless @options[:output_saved_script_filename]
425
- # !!b
426
422
 
427
423
  @fout.fout "script_block_name: #{run_state.script_block_name}"
428
424
  @fout.fout "s_save_filespec: #{run_state.saved_filespec}"
@@ -433,16 +429,10 @@ module MarkdownExec
433
429
  # !!p stage
434
430
  simple_commands(options).each do |key, (cstage, proc)|
435
431
  if @options[key].is_a?(TrueClass) || @options[key].present?
436
- # !!v key, 'cstage', cstage
437
432
  if stage && stage == cstage
438
- # !!b
439
433
  proc.call
440
434
  return true
441
- else
442
- # !!b
443
435
  end
444
- else
445
- # !!b
446
436
  end
447
437
  end
448
438
  false
@@ -584,7 +574,7 @@ module MarkdownExec
584
574
 
585
575
  files_table_rows = @options.read_saved_assets_for_history_table(
586
576
  asset: @options[:filename]
587
- ) # !!v files_table_rows
577
+ )
588
578
  if sift_regexp
589
579
  # Filter history to file names matching a pattern
590
580
  files_table_rows.select! { |item| sift_regexp.match(item[:file]) }
@@ -816,20 +806,14 @@ module MarkdownExec
816
806
 
817
807
  # Reports and executes block logic
818
808
  def mde_vux_main_loop(files)
819
- # !!b
820
809
  @options[:filename] = select_document_if_multiple(files)
821
810
  @options.vux_main_loop do |type, data|
822
811
  case type
823
812
  when :command_names
824
- # !!b
825
813
  simple_commands(data).keys
826
814
  when :call_proc
827
- # !!b
828
- # simple_commands(data[0])[data[1]].call
829
815
  simple_commands(data[0])[data[1]][1].call
830
-
831
816
  when :end_of_cli
832
- # !!b
833
817
  execute_simple_commands(options, stage: 2)
834
818
  else
835
819
  raise
@@ -1041,21 +1025,21 @@ module MarkdownExec
1041
1025
  list_default_yaml: [1, -> { @fout.fout_list list_default_yaml }],
1042
1026
  list_docs: [1, -> { @fout.fout_list opts_prepare_file_list(options) }],
1043
1027
  list_recent_output: [1, -> {
1044
- @fout.fout_list list_recent_output(
1045
- @options[:saved_stdout_folder],
1046
- @options[:saved_stdout_glob], @options[:list_count]
1047
- )
1048
- }],
1028
+ @fout.fout_list list_recent_output(
1029
+ @options[:saved_stdout_folder],
1030
+ @options[:saved_stdout_glob], @options[:list_count]
1031
+ )
1032
+ }],
1049
1033
  list_recent_scripts: [1, -> {
1050
- @fout.fout_list list_recent_scripts(
1051
- options[:saved_script_folder],
1052
- options[:saved_script_glob], options[:list_count]
1053
- )
1054
- }],
1055
- menu_export: [1, -> {@fout.fout menu_export }],
1056
- pwd: [1, -> {@fout.fout File.expand_path('..', __dir__) }],
1057
- run_last_script: [1, -> {run_last_script }],
1058
- tab_completions: [1, -> {@fout.fout tab_completions }]
1034
+ @fout.fout_list list_recent_scripts(
1035
+ options[:saved_script_folder],
1036
+ options[:saved_script_glob], options[:list_count]
1037
+ )
1038
+ }],
1039
+ menu_export: [1, -> { @fout.fout menu_export }],
1040
+ pwd: [1, -> { @fout.fout File.expand_path('..', __dir__) }],
1041
+ run_last_script: [1, -> { run_last_script }],
1042
+ tab_completions: [1, -> { @fout.fout tab_completions }]
1059
1043
  }
1060
1044
  end
1061
1045
 
data/lib/mdoc.rb CHANGED
@@ -4,6 +4,7 @@
4
4
  # encoding=utf-8
5
5
 
6
6
  require_relative 'block_types'
7
+ require_relative 'collapser'
7
8
  require_relative 'filter'
8
9
 
9
10
  $pd = false unless defined?($pd)
@@ -206,27 +207,114 @@ module MarkdownExec
206
207
 
207
208
  ### hide rows correctly
208
209
 
209
- unless options[:menu_include_imported_blocks]
210
- selrows = selrows.reject do |block|
211
- block.fetch(:depth, 0).positive?
210
+ unless opts[:menu_include_imported_blocks]
211
+ selrows = selrows.reject do |fcb|
212
+ fcb.fetch(:depth, 0).positive?
212
213
  end
213
214
  end
214
215
 
215
216
  if opts[:hide_blocks_by_name]
216
- selrows = selrows.reject do |block|
217
- hide_menu_block_on_name opts, block
217
+ selrows = selrows.reject do |fcb|
218
+ hide_menu_block_on_name(opts, fcb)
218
219
  end
219
220
  end
220
221
 
222
+ collapser = Collapser.new(
223
+ options: opts, state: opts[:compressed_ids] || {}
224
+ )
225
+ selrows = collapser.reject(selrows, initialize: opts[:compressed_ids].nil?) do |fcb, hide, collapsed_level|
226
+ # update fcb per state
227
+ if fcb.collapsible
228
+ fcb.s1decorated = fcb.s1decorated + ' ' + (fcb.collapse ? opts[:menu_collapsible_symbol_collapsed] : opts[:menu_collapsible_symbol_expanded])
229
+ end
230
+ end
231
+ opts[:compressed_ids] = collapser.state
232
+
221
233
  # remove
222
234
  # . empty chrome between code; edges are same as blanks
223
235
  #
224
- select_elements_with_neighbor_conditions(selrows) do |prev_element, current, next_element|
225
- !(current[:chrome] && !current.oname.present?) ||
226
- !(!prev_element.nil? &&
227
- prev_element.shell.present? &&
228
- !next_element.nil? &&
229
- next_element.shell.present?)
236
+ [
237
+ select_elements_with_neighbor_conditions(selrows) do |prev_element, current, next_element|
238
+ !(current[:chrome] && !current.oname.present?) ||
239
+ !(!prev_element.nil? &&
240
+ prev_element.shell.present? &&
241
+ !next_element.nil? &&
242
+ next_element.shell.present?)
243
+ end,
244
+ opts[:compressed_ids]
245
+ ]
246
+ end
247
+
248
+ # Filters out blocks that are nested within a hierarchy of "hidden" blocks.
249
+ #
250
+ # The method iterates over selected rows and uses a callback block to determine if a given block
251
+ # should trigger hiding for subsequent blocks in the hierarchy. Once hiding is triggered, all
252
+ # blocks with a level greater than the triggering block's level are excluded until the next
253
+ # visible collapsible block.
254
+ #
255
+ # @param selrows [Array] The array of selected rows to filter based on the callback's results.
256
+ # @param callback [Lambda/Proc] Alternate to yield block.
257
+ # @param collapsible_types [Array] Types to select, nil for all.
258
+ # @yield [block] A callback to evaluate each block; should return true to initiate hiding.
259
+ # @return [Array] Filtered list of rows, excluding those hidden by hierarchical hiding rules.
260
+ #
261
+ # Example:
262
+ # proc_condition = Proc.new { |fcb| fcb.type == BlockType::HEADING && fcb.level == 1 }
263
+ # reject_collapsed_blocks(selrows, callback: proc_condition)
264
+ #
265
+ # lambda_condition = ->(fcb) { fcb.type == BlockType::HEADING && fcb.level == 1 }
266
+ # reject_collapsed_blocks(selrows, callback: lambda_condition)
267
+ #
268
+ # Block: Exits the enclosing method (test_with_block) if return is used.
269
+ # Flexible with arguments
270
+ # Proc: Exits the enclosing method (test_with_proc) when return is encountered, similar to a block.
271
+ # Lambda: Only exits the lambda itself, allowing reject_collapsed_blocks to continue execution.
272
+ # Stricter argument checking.
273
+ #
274
+ # **`lambda` provides more control** and avoids the early exit behavior caused by `return` in blocks or `Proc` objects, making it a safer choice when you want `reject_collapsed_blocks` to complete its execution regardless of the callback’s behavior.
275
+ def reject_collapsed_blocks(
276
+ selrows,
277
+ callback: nil,
278
+ reject_callback: nil,
279
+ collapsible_types: nil,
280
+ &block
281
+ )
282
+ block ||= callback # Use callback if no block is provided
283
+ hiding = false # State to indicate if hiding is active
284
+ hidden_level = nil # Level at which hiding was triggered
285
+
286
+ selrows.reject do |fcb| # Reject rows that should be hidden based on the hierarchy
287
+ if hiding
288
+ # Currently in hiding mode; evaluate if the current block should remain hidden
289
+ if collapsible_types.nil? || collapsible_types.include?(fcb.type)
290
+ if hidden_level.nil?
291
+ # No specific hidden level yet, allow the item to show
292
+ false
293
+ elsif fcb.level > hidden_level
294
+ reject_callback.call(fcb, ) if reject_callback
295
+ # The current block is at a deeper level and thus remains hidden
296
+ true
297
+ else
298
+ # At the same or higher level than hidden_level, check if the callback initiates hiding again
299
+ hiding = block.call(fcb)
300
+ hidden_level = fcb.level if hiding # Update hidden level if hiding continues
301
+ false # Do not hide the initiating block itself
302
+ end
303
+ else
304
+ reject_callback.call(fcb) if reject_callback
305
+ # Non-collapsible block types (e.g., text or note) continue hiding by default
306
+ true
307
+ end
308
+
309
+ elsif block.call(fcb)
310
+ # If callback triggers hiding, initialize hiding state and hidden_level
311
+ hiding = fcb.type # Start hiding subsequent blocks
312
+ hidden_level = fcb.level # Define the hierarchical level for hiding
313
+ false # Do not hide the initiating block itself
314
+
315
+ else
316
+ false # Default: do not hide if no hiding state
317
+ end
230
318
  end
231
319
  end
232
320
 
@@ -416,29 +504,6 @@ module MarkdownExec
416
504
 
417
505
  selected_elements
418
506
  end
419
-
420
- # def select_elements_with_neighbor_conditions(array)
421
- # # This function filters elements from the array where the current element has property A set to true
422
- # # and both the previous and next elements have property B set to true.
423
- # selected_elements = []
424
-
425
- # array.each_with_index do |element, index|
426
- # next if index.zero? # Skip the first element since it has no previous element
427
- # break if index >= array.size - 1 # Break before the last to avoid out-of-bound errors
428
-
429
- # prev_element = array[index - 1]
430
- # next_element = array[index + 1]
431
-
432
- # # Check the conditions for property A on the current element and property B on adjacent elements
433
- # unless element[:chrome] && !element[:oname].present? && prev_element.shell.present? && next_element.shell.present?
434
- # selected_elements << element
435
- # # else
436
- # # pp 'SKIPPING', element
437
- # end
438
- # end
439
-
440
- # selected_elements
441
- # end
442
507
  end
443
508
  end
444
509
 
@@ -540,7 +605,7 @@ if $PROGRAM_NAME == __FILE__
540
605
 
541
606
  def test_fcbs_per_options
542
607
  opts = { hide_blocks_by_name: true, block_name_hidden_match: 'block1' }
543
- result = @doc.fcbs_per_options(opts)
608
+ result, _ = @doc.fcbs_per_options(opts)
544
609
  assert_equal [@table[1], @table[2]], result
545
610
  end if false ### broken test
546
611
 
data/lib/menu.src.yml CHANGED
@@ -11,6 +11,11 @@
11
11
  :default: false
12
12
  :procname: val_as_bool
13
13
 
14
+ - :opt_name: block_batch_match
15
+ :env_var: MDE_BLOCK_BATCH_MATCH
16
+ :default: '@batch'
17
+ :procname: val_as_str
18
+
14
19
  - :opt_name: block_calls_scan
15
20
  :env_var: MDE_BLOCK_CALLS_SCAN
16
21
  :default: "%\\([^\\)]+\\)"
@@ -21,6 +26,11 @@
21
26
  :default: '@disable'
22
27
  :procname: val_as_str
23
28
 
29
+ - :opt_name: block_interactive_match
30
+ :env_var: MDE_BLOCK_INTERACTIVE_MATCH
31
+ :default: '@interactive'
32
+ :procname: val_as_str
33
+
24
34
  - :opt_name: block_name
25
35
  :long_name: block-name
26
36
  :short_name: b
@@ -92,6 +102,12 @@
92
102
  :default: true
93
103
  :procname: val_as_bool
94
104
 
105
+ # - :opt_name: command_substitution_regexp
106
+ # :env_var: MDE_COMMAND_SUBSTITUTION_REGEXP
107
+ # :description: command_substitution_regexp
108
+ # :default: "(?<expression>\\$\\((?<variable>[A-Z0-9a-z_]+)\\))"
109
+ # :procname: val_as_str
110
+
95
111
  - :long_name: config
96
112
  :description: Read configuration file
97
113
  :arg_name: PATH
@@ -136,6 +152,27 @@
136
152
  :default: "> "
137
153
  :procname: val_as_str
138
154
 
155
+ - :opt_name: divider_match
156
+ :env_var: MDE_DIVIDER_MATCH
157
+ :description: Pattern for topics/dividers in block selection menu
158
+ :default: "^(?<indent>[ \t]*):::(?<collapse>[+-~]?)(?<leading>[ \t]*)(?<line>(?<text>.*?)(?<trailing>[ \t]*))?$"
159
+ :procname: val_as_str
160
+
161
+ - :opt_name: divider4_center
162
+ :env_var: MDE_DIVIDER4_CENTER
163
+ :default: true
164
+ :procname: val_as_bool
165
+
166
+ - :opt_name: divider4_collapse
167
+ :env_var: MDE_DIVIDER_COLLAPSE
168
+ :default: false
169
+ :procname: val_as_bool
170
+
171
+ - :opt_name: divider4_collapsible
172
+ :env_var: MDE_DIVIDER_COLLAPSIBLE
173
+ :default: true
174
+ :procname: val_as_bool
175
+
139
176
  - :opt_name: document_configurations_directory
140
177
  :env_var: MDE_DOCUMENT_CONFIGURATIONS_DIRECTORY
141
178
  :description: Directory with files
@@ -160,7 +197,18 @@
160
197
  - :opt_name: document_load_opts_block_name
161
198
  :env_var: MDE_DOCUMENT_LOAD_OPTS_BLOCK_NAME
162
199
  :description: Name of Opts block to load with the document
163
- :default: "(document_options)"
200
+ :default: "(document_opts)"
201
+ :procname: val_as_str
202
+
203
+ - :opt_name: document_load_vars_block_name
204
+ :env_var: MDE_DOCUMENT_LOAD_VARS_BLOCK_NAME
205
+ :description: Name of Vars block to load with the document
206
+ :default: "(document_vars)"
207
+ :procname: val_as_str
208
+
209
+ - :opt_name: document_play_bin
210
+ :env_var: MDE_DOCUMENT_PLAY_BIN
211
+ :default: play
164
212
  :procname: val_as_str
165
213
 
166
214
  - :opt_name: document_saved_lines_glob
@@ -402,29 +450,59 @@
402
450
  :default: true
403
451
  :procname: val_as_bool
404
452
 
405
- - :opt_name: heading2_center
406
- :env_var: MDE_HEADING1_CENTER
407
- :default: true
453
+ - :opt_name: heading1_collapse
454
+ :env_var: MDE_HEADING1_COLLAPSE
455
+ :default: false
408
456
  :procname: val_as_bool
409
457
 
410
- - :opt_name: heading3_center
411
- :env_var: MDE_HEADING1_CENTER
412
- :default: true
458
+ - :opt_name: heading1_collapsible
459
+ :env_var: MDE_HEADING1_COLLAPSIBLE
460
+ :default: false
413
461
  :procname: val_as_bool
414
462
 
415
463
  - :opt_name: heading1_match
416
464
  :env_var: MDE_HEADING1_MATCH
417
- :default: "^#(?<line>(?!#)(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
465
+ :default: "^#(?<line>(?!#)(?<collapse>[+-~]?)(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
418
466
  :procname: val_as_str
419
467
 
468
+ - :opt_name: heading2_center
469
+ :env_var: MDE_HEADING2_CENTER
470
+ :default: true
471
+ :procname: val_as_bool
472
+
473
+ - :opt_name: heading2_collapse
474
+ :env_var: MDE_HEADING2_COLLAPSE
475
+ :default: false
476
+ :procname: val_as_bool
477
+
478
+ - :opt_name: heading2_collapsible
479
+ :env_var: MDE_HEADING2_COLLAPSIBLE
480
+ :default: true
481
+ :procname: val_as_bool
482
+
420
483
  - :opt_name: heading2_match
421
484
  :env_var: MDE_HEADING2_MATCH
422
- :default: "^##(?<line>(?!#)(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
485
+ :default: "^##(?<line>(?!#)(?<collapse>[+-~]?)(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
423
486
  :procname: val_as_str
424
487
 
488
+ - :opt_name: heading3_center
489
+ :env_var: MDE_HEADING3_CENTER
490
+ :default: true
491
+ :procname: val_as_bool
492
+
493
+ - :opt_name: heading3_collapse
494
+ :env_var: MDE_HEADING3_COLLAPSE
495
+ :default: false
496
+ :procname: val_as_bool
497
+
498
+ - :opt_name: heading3_collapsible
499
+ :env_var: MDE_HEADING3_COLLAPSIBLE
500
+ :default: true
501
+ :procname: val_as_bool
502
+
425
503
  - :opt_name: heading3_match
426
504
  :env_var: MDE_HEADING3_MATCH
427
- :default: "^###(?<line>(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
505
+ :default: "^###(?<collapse>[+-~]?)(?<line>(?<indent>[ \t]*)(?<text>.*?)(?<trailing>[ \t]*))?$"
428
506
  :procname: val_as_str
429
507
 
430
508
  - :long_name: help
@@ -593,6 +671,13 @@
593
671
  :default: ".+\\.md"
594
672
  :procname: val_as_str
595
673
 
674
+ - :opt_name: menu_active_color_pastel_messages
675
+ :env_var: MDE_MENU_ACTIVE_COLOR_PASTEL_MESSAGES
676
+ :description: menu_active_color_pastel_messages
677
+ :default:
678
+ - bright_magenta
679
+ - on_black
680
+
596
681
  - :opt_name: menu_back_at_top
597
682
  :env_var: MDE_MENU_BACK_AT_TOP
598
683
  :description: Display Back option at top of menu (vs bottom)
@@ -632,6 +717,18 @@
632
717
  :default: "%{line}"
633
718
  :procname: val_as_str
634
719
 
720
+ - :opt_name: menu_collapsible_symbol_collapsed
721
+ :env_var: MDE_MENU_COLLAPSIBLE_SYMBOL_COLLAPSED
722
+ :description: menu_collapsible_symbol_collapsed
723
+ :default: '⬢' # ∆ ⬢ +
724
+ :procname: val_as_str
725
+
726
+ - :opt_name: menu_collapsible_symbol_expanded
727
+ :env_var: MDE_MENU_COLLAPSIBLE_SYMBOL_expandED
728
+ :description: menu_collapsible_symbol_expanded
729
+ :default: '⬡' # … ⬡ -
730
+ :procname: val_as_str
731
+
635
732
  - :opt_name: menu_divider_color
636
733
  :env_var: MDE_MENU_DIVIDER_COLOR
637
734
  :description: Color of menu divider
@@ -644,12 +741,6 @@
644
741
  :default: "-:= %{line} =:-"
645
742
  :procname: val_as_str
646
743
 
647
- - :opt_name: menu_divider_match
648
- :env_var: MDE_MENU_DIVIDER_MATCH
649
- :description: Pattern for topics/dividers in block selection menu
650
- :default: "^(?<indent>[ \t]*):::(?<line>(?<text>.*?)(?<trailing>[ \t]*))?$"
651
- :procname: val_as_str
652
-
653
744
  - :opt_name: menu_divider_symbol
654
745
  :env_var: MDE_MENU_DIVIDER_SYMBOL
655
746
  :description: Symbol before each divider
@@ -903,7 +994,7 @@
903
994
  - :opt_name: menu_table_rows_match
904
995
  :env_var: MDE_MENU_TABLE_ROWS_MATCH
905
996
  :description: Pattern for table rows
906
- :default: '^(?<line>[ \t]*(?<text>\|.*?)(?<trailing>[ \t]*))$'
997
+ :default: '^(?<line>(?<indent>[ \t]*)(?<text>\|.*?)(?<trailing>[ \t]*))$'
907
998
  :procname: val_as_str
908
999
 
909
1000
  - :opt_name: menu_task_color
@@ -1095,6 +1186,16 @@
1095
1186
  :default: false
1096
1187
  :procname: val_as_bool
1097
1188
 
1189
+ - :opt_name: play_bin_batch
1190
+ :env_var: MDE_PLAY_BIN_BATCH
1191
+ :default: play
1192
+ :procname: val_as_str
1193
+
1194
+ - :opt_name: play_bin_interactive
1195
+ :env_var: MDE_PLAY_BIN_INTERACTIVE
1196
+ :default: play_interactive
1197
+ :procname: val_as_str
1198
+
1098
1199
  - :opt_name: probe
1099
1200
  :long_name: probe
1100
1201
  :env_var: MDE_PROBE
@@ -1469,6 +1570,12 @@
1469
1570
  :description: Color for table border
1470
1571
  :default: fg_bg_rgbh_00_00_df_14_18_1c
1471
1572
 
1573
+ - :opt_name: table_center
1574
+ :env_var: MDE_TABLE_CENTER
1575
+ :arg_name: BOOL
1576
+ :default: true
1577
+ :procname: val_as_bool
1578
+
1472
1579
  - :opt_name: table_header_row_color
1473
1580
  :env_var: MDE_TABLE_HEADER_ROW_COLOR
1474
1581
  :description: Color for table header row