hyperlist 1.9.1 → 1.9.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/README.md +14 -1
- data/hyperlist +118 -108
- data/hyperlist.gemspec +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 56e8ead48066f1f09b28d2e014b5c8f1bc6576dffda4b45a5975cde75721399a
|
|
4
|
+
data.tar.gz: 8fe7e8ed277872310b4d0230e45e80c7ac886cbb458244ae6016f48858c661d8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 11d7b1fce3b5179c2cdf1278deb4e2e0fafb74aa36f77ea8a7dd4ab494b53bc2af79942769390cb82a8d9a392b830947ec5bdd2b991462d27f53a148ff42809c
|
|
7
|
+
data.tar.gz: 36f631cbc904a3fb4fd28b9e3c17cbd83f55054d04e5add1a2d58ba86a092315a42976ed1eddfedd264fe90f5b54a4069f26e2e9bce3faa1959c0bf2082a28c2
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to the HyperList Ruby TUI will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.9.3] - 2025-12-02
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **Help/documentation viewer navigation**
|
|
9
|
+
- Fixed invisible cursor on blank separator lines in help (?) and documentation (??) viewers
|
|
10
|
+
- Blank lines now contain a space so cursor highlighting is visible when navigating
|
|
11
|
+
- **Presentation mode state preservation**
|
|
12
|
+
- Help, documentation, and recent files viewers now properly save/restore presentation mode state
|
|
13
|
+
- Prevents presentation mode logic from interfering with viewer navigation
|
|
14
|
+
|
|
15
|
+
## [1.9.2] - 2025-12-02
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
- **Presentation mode completely rewritten**
|
|
19
|
+
- Now dynamically folds/unfolds as you navigate (like hyperlist.vim)
|
|
20
|
+
- Entering presentation mode (C-P) now stays on the current item instead of jumping to the first line
|
|
21
|
+
- Moving up/down properly reveals the path to the current item while folding everything else
|
|
22
|
+
- Uses proper item tracking via real indices to handle fold state changes correctly
|
|
23
|
+
|
|
5
24
|
## [1.9.1] - 2025-12-02
|
|
6
25
|
|
|
7
26
|
### Added
|
data/README.md
CHANGED
|
@@ -29,7 +29,20 @@ For historical context and the original VIM implementation, see: [hyperlist.vim]
|
|
|
29
29
|
### Help Screen
|
|
30
30
|

|
|
31
31
|
|
|
32
|
-
## What's New in v1.9.
|
|
32
|
+
## What's New in v1.9.3
|
|
33
|
+
|
|
34
|
+
### Help Viewer Navigation Fixed
|
|
35
|
+
- Fixed invisible cursor on blank separator lines in help (?) and documentation (??) viewers
|
|
36
|
+
- Presentation mode state now properly preserved when entering/exiting viewers
|
|
37
|
+
|
|
38
|
+
## Previous Release: v1.9.2
|
|
39
|
+
|
|
40
|
+
### Presentation Mode Fixed
|
|
41
|
+
- **Dynamic folding**: Presentation mode now works like hyperlist.vim - folds/unfolds dynamically as you navigate
|
|
42
|
+
- **Cursor preservation**: Entering presentation mode (C-P) stays on the current item instead of jumping to the first line
|
|
43
|
+
- **Proper navigation**: Moving up/down reveals the path to the current item while folding everything else
|
|
44
|
+
|
|
45
|
+
## Previous Release: v1.9.1
|
|
33
46
|
|
|
34
47
|
### External File Change Detection
|
|
35
48
|
- **Auto-detect external changes**: HyperList now monitors when the file is modified by other processes (vim, another Claude Code session, etc.)
|
data/hyperlist
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# Check for help/version BEFORE loading any libraries
|
|
8
8
|
if ARGV[0] == '-h' || ARGV[0] == '--help'
|
|
9
9
|
puts <<~HELP
|
|
10
|
-
HyperList v1.9.
|
|
10
|
+
HyperList v1.9.3 - Terminal User Interface for HyperList files
|
|
11
11
|
|
|
12
12
|
USAGE
|
|
13
13
|
hyperlist [OPTIONS] [FILE]
|
|
@@ -52,7 +52,7 @@ if ARGV[0] == '-h' || ARGV[0] == '--help'
|
|
|
52
52
|
HELP
|
|
53
53
|
exit 0
|
|
54
54
|
elsif ARGV[0] == '-v' || ARGV[0] == '--version'
|
|
55
|
-
puts "HyperList v1.9.
|
|
55
|
+
puts "HyperList v1.9.3"
|
|
56
56
|
exit 0
|
|
57
57
|
end
|
|
58
58
|
|
|
@@ -73,7 +73,7 @@ class HyperListApp
|
|
|
73
73
|
include Rcurses::Input
|
|
74
74
|
include Rcurses::Cursor
|
|
75
75
|
|
|
76
|
-
VERSION = "1.9.
|
|
76
|
+
VERSION = "1.9.3"
|
|
77
77
|
|
|
78
78
|
def initialize(filename = nil)
|
|
79
79
|
@filename = filename ? File.expand_path(filename) : nil
|
|
@@ -596,7 +596,11 @@ class HyperListApp
|
|
|
596
596
|
saved_offset = @offset
|
|
597
597
|
saved_filename = @filename
|
|
598
598
|
saved_modified = @modified
|
|
599
|
-
|
|
599
|
+
saved_presentation_mode = @presentation_mode
|
|
600
|
+
|
|
601
|
+
# Disable presentation mode for recent files viewer
|
|
602
|
+
@presentation_mode = false
|
|
603
|
+
|
|
600
604
|
# Create items for recent files display
|
|
601
605
|
@items = []
|
|
602
606
|
@items << {"text" => "RECENT FILES (press Enter to open, q to cancel)", "level" => 0, "fold" => false, "raw" => true}
|
|
@@ -627,6 +631,7 @@ class HyperListApp
|
|
|
627
631
|
@offset = saved_offset
|
|
628
632
|
@filename = saved_filename
|
|
629
633
|
@modified = saved_modified
|
|
634
|
+
@presentation_mode = saved_presentation_mode
|
|
630
635
|
break
|
|
631
636
|
when "j", "DOWN"
|
|
632
637
|
move_down if @current < @items.length - 1
|
|
@@ -641,9 +646,11 @@ class HyperListApp
|
|
|
641
646
|
@offset = saved_offset
|
|
642
647
|
@filename = saved_filename
|
|
643
648
|
@modified = saved_modified
|
|
649
|
+
@presentation_mode = saved_presentation_mode
|
|
644
650
|
@message = "Unsaved changes! Save first before opening another file"
|
|
645
651
|
break
|
|
646
652
|
else
|
|
653
|
+
@presentation_mode = saved_presentation_mode
|
|
647
654
|
@filename = File.expand_path(selected_file)
|
|
648
655
|
load_file(@filename)
|
|
649
656
|
@current = 0
|
|
@@ -663,9 +670,11 @@ class HyperListApp
|
|
|
663
670
|
@offset = saved_offset
|
|
664
671
|
@filename = saved_filename
|
|
665
672
|
@modified = saved_modified
|
|
673
|
+
@presentation_mode = saved_presentation_mode
|
|
666
674
|
@message = "Unsaved changes! Save first before opening another file"
|
|
667
675
|
break
|
|
668
676
|
else
|
|
677
|
+
@presentation_mode = saved_presentation_mode
|
|
669
678
|
@filename = File.expand_path(selected_file)
|
|
670
679
|
load_file(@filename)
|
|
671
680
|
@current = 0
|
|
@@ -677,7 +686,7 @@ class HyperListApp
|
|
|
677
686
|
end
|
|
678
687
|
end
|
|
679
688
|
end
|
|
680
|
-
|
|
689
|
+
|
|
681
690
|
def save_file
|
|
682
691
|
return unless @filename
|
|
683
692
|
|
|
@@ -2043,28 +2052,28 @@ class HyperListApp
|
|
|
2043
2052
|
|
|
2044
2053
|
def move_up
|
|
2045
2054
|
if @presentation_mode
|
|
2046
|
-
# In presentation mode
|
|
2047
|
-
|
|
2048
|
-
|
|
2055
|
+
# In presentation mode: move to target, then update folds
|
|
2056
|
+
visible = get_visible_items
|
|
2057
|
+
return if visible.empty?
|
|
2058
|
+
|
|
2059
|
+
# Calculate target position
|
|
2049
2060
|
if @current == 0
|
|
2050
|
-
|
|
2051
|
-
target_index = visible_before.length - 1
|
|
2061
|
+
target_index = visible.length - 1
|
|
2052
2062
|
else
|
|
2053
2063
|
target_index = @current - 1
|
|
2054
2064
|
end
|
|
2055
|
-
|
|
2056
|
-
# Get the
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
# Update presentation focus for the target item
|
|
2065
|
+
|
|
2066
|
+
# Get the real index of the target item
|
|
2067
|
+
target_real_idx = get_real_index(visible[target_index])
|
|
2068
|
+
|
|
2069
|
+
# Temporarily set current to target so update_presentation_focus works on it
|
|
2061
2070
|
@current = target_index
|
|
2062
2071
|
update_presentation_focus
|
|
2063
|
-
|
|
2064
|
-
#
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
if
|
|
2072
|
+
|
|
2073
|
+
# After fold changes, find where the target item is now
|
|
2074
|
+
new_visible = get_visible_items
|
|
2075
|
+
new_visible.each_with_index do |item, idx|
|
|
2076
|
+
if item["_real_index"] == target_real_idx
|
|
2068
2077
|
@current = idx
|
|
2069
2078
|
break
|
|
2070
2079
|
end
|
|
@@ -2072,9 +2081,8 @@ class HyperListApp
|
|
|
2072
2081
|
else
|
|
2073
2082
|
# Normal mode navigation
|
|
2074
2083
|
max_items = get_visible_items.length - 1
|
|
2075
|
-
|
|
2084
|
+
|
|
2076
2085
|
if @current == 0
|
|
2077
|
-
# Wrap around to last item
|
|
2078
2086
|
@current = max_items
|
|
2079
2087
|
else
|
|
2080
2088
|
@current = [@current - 1, 0].max
|
|
@@ -2084,29 +2092,29 @@ class HyperListApp
|
|
|
2084
2092
|
|
|
2085
2093
|
def move_down
|
|
2086
2094
|
if @presentation_mode
|
|
2087
|
-
# In presentation mode
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2095
|
+
# In presentation mode: move to target, then update folds
|
|
2096
|
+
visible = get_visible_items
|
|
2097
|
+
return if visible.empty?
|
|
2098
|
+
max = visible.length - 1
|
|
2099
|
+
|
|
2100
|
+
# Calculate target position
|
|
2101
|
+
if @current >= max
|
|
2093
2102
|
target_index = 0
|
|
2094
2103
|
else
|
|
2095
2104
|
target_index = @current + 1
|
|
2096
2105
|
end
|
|
2097
|
-
|
|
2098
|
-
# Get the
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
# Update presentation focus for the target item
|
|
2106
|
+
|
|
2107
|
+
# Get the real index of the target item
|
|
2108
|
+
target_real_idx = get_real_index(visible[target_index])
|
|
2109
|
+
|
|
2110
|
+
# Temporarily set current to target so update_presentation_focus works on it
|
|
2103
2111
|
@current = target_index
|
|
2104
2112
|
update_presentation_focus
|
|
2105
|
-
|
|
2106
|
-
#
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
if
|
|
2113
|
+
|
|
2114
|
+
# After fold changes, find where the target item is now
|
|
2115
|
+
new_visible = get_visible_items
|
|
2116
|
+
new_visible.each_with_index do |item, idx|
|
|
2117
|
+
if item["_real_index"] == target_real_idx
|
|
2110
2118
|
@current = idx
|
|
2111
2119
|
break
|
|
2112
2120
|
end
|
|
@@ -2114,9 +2122,8 @@ class HyperListApp
|
|
|
2114
2122
|
else
|
|
2115
2123
|
# Normal mode navigation
|
|
2116
2124
|
max = get_visible_items.length - 1
|
|
2117
|
-
|
|
2118
|
-
if @current
|
|
2119
|
-
# Wrap around to first item
|
|
2125
|
+
|
|
2126
|
+
if @current >= max
|
|
2120
2127
|
@current = 0
|
|
2121
2128
|
else
|
|
2122
2129
|
@current = [@current + 1, max].min
|
|
@@ -2345,84 +2352,80 @@ class HyperListApp
|
|
|
2345
2352
|
# Enter presentation mode
|
|
2346
2353
|
# Remember which item we're on before any folding changes
|
|
2347
2354
|
visible_items = get_visible_items
|
|
2348
|
-
if @current
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2355
|
+
return if visible_items.empty? || @current >= visible_items.length
|
|
2356
|
+
|
|
2357
|
+
# Get the real index of the current item
|
|
2358
|
+
target_real_idx = visible_items[@current]["_real_index"]
|
|
2359
|
+
|
|
2352
2360
|
@presentation_mode = true
|
|
2353
|
-
# Clear cache to force re-rendering
|
|
2361
|
+
# Clear cache to force re-rendering
|
|
2354
2362
|
@processed_cache.clear
|
|
2355
2363
|
update_presentation_focus
|
|
2356
|
-
|
|
2357
|
-
#
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
|
|
2364
|
+
|
|
2365
|
+
# Find where the target item is after fold changes
|
|
2366
|
+
new_visible = get_visible_items
|
|
2367
|
+
new_visible.each_with_index do |item, idx|
|
|
2368
|
+
if item["_real_index"] == target_real_idx
|
|
2369
|
+
@current = idx
|
|
2370
|
+
break
|
|
2371
|
+
end
|
|
2362
2372
|
end
|
|
2363
|
-
|
|
2364
|
-
@message = "Presentation mode enabled
|
|
2373
|
+
|
|
2374
|
+
@message = "Presentation mode enabled"
|
|
2365
2375
|
end
|
|
2366
2376
|
end
|
|
2367
2377
|
|
|
2368
2378
|
def update_presentation_focus
|
|
2369
|
-
#
|
|
2370
|
-
#
|
|
2379
|
+
# Presentation mode: fold everything, then reveal path to current item
|
|
2380
|
+
# Like vim's: fold to level 0, then zv (reveal current line)
|
|
2371
2381
|
return unless @presentation_mode
|
|
2372
|
-
|
|
2382
|
+
|
|
2373
2383
|
visible_items = get_visible_items
|
|
2374
2384
|
return if visible_items.empty? || @current >= visible_items.length
|
|
2375
|
-
|
|
2376
|
-
#
|
|
2385
|
+
|
|
2386
|
+
# Get the current item before we change anything
|
|
2377
2387
|
current_item = visible_items[@current]
|
|
2378
|
-
current_level = current_item["level"]
|
|
2379
2388
|
current_real_idx = get_real_index(current_item)
|
|
2380
|
-
|
|
2381
|
-
|
|
2389
|
+
return unless current_real_idx
|
|
2390
|
+
|
|
2391
|
+
current_level = current_item["level"]
|
|
2392
|
+
|
|
2393
|
+
# Step 1: Fold everything that has children
|
|
2382
2394
|
@items.each_with_index do |item, idx|
|
|
2383
2395
|
item["fold"] = has_children?(idx, @items)
|
|
2384
2396
|
item["presentation_focus"] = false
|
|
2385
2397
|
end
|
|
2386
|
-
|
|
2387
|
-
#
|
|
2388
|
-
if current_real_idx && current_real_idx < @items.length
|
|
2389
|
-
@items[current_real_idx]["presentation_focus"] = true
|
|
2390
|
-
@items[current_real_idx]["fold"] = false
|
|
2391
|
-
end
|
|
2392
|
-
|
|
2393
|
-
# Unfold all ancestors of current item
|
|
2394
|
-
ancestor_indices = []
|
|
2398
|
+
|
|
2399
|
+
# Step 2: Unfold all ancestors (path from root to current item)
|
|
2395
2400
|
search_level = current_level - 1
|
|
2396
2401
|
idx = current_real_idx - 1
|
|
2397
|
-
|
|
2398
2402
|
while idx >= 0 && search_level >= 0
|
|
2399
2403
|
if @items[idx]["level"] == search_level
|
|
2400
|
-
@items[idx]["fold"] = false
|
|
2401
|
-
@items[idx]["presentation_focus"] = false # Ancestors visible but not focused
|
|
2402
|
-
ancestor_indices << idx
|
|
2404
|
+
@items[idx]["fold"] = false # Unfold this ancestor
|
|
2403
2405
|
search_level -= 1
|
|
2404
2406
|
end
|
|
2405
2407
|
idx -= 1
|
|
2406
2408
|
end
|
|
2407
|
-
|
|
2408
|
-
#
|
|
2409
|
+
|
|
2410
|
+
# Step 3: Unfold the current item to show its direct children
|
|
2411
|
+
@items[current_real_idx]["fold"] = false
|
|
2412
|
+
@items[current_real_idx]["presentation_focus"] = true
|
|
2413
|
+
|
|
2414
|
+
# Step 4: Mark direct children as in focus (for visual highlighting)
|
|
2409
2415
|
idx = current_real_idx + 1
|
|
2410
2416
|
while idx < @items.length && @items[idx]["level"] > current_level
|
|
2411
2417
|
if @items[idx]["level"] == current_level + 1
|
|
2412
2418
|
@items[idx]["presentation_focus"] = true
|
|
2413
|
-
# Don't unfold children - let them stay folded unless user explicitly unfolds
|
|
2414
2419
|
end
|
|
2415
2420
|
idx += 1
|
|
2416
2421
|
end
|
|
2417
|
-
|
|
2418
|
-
#
|
|
2422
|
+
|
|
2423
|
+
# Step 5: Recalculate cursor position after fold changes
|
|
2419
2424
|
new_visible_items = get_visible_items
|
|
2420
2425
|
new_position = new_visible_items.index(current_item)
|
|
2421
|
-
if new_position
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
# Clear cache to force re-rendering with new focus
|
|
2426
|
+
@current = new_position if new_position
|
|
2427
|
+
|
|
2428
|
+
# Clear cache to force re-rendering
|
|
2426
2429
|
@processed_cache.clear
|
|
2427
2430
|
end
|
|
2428
2431
|
|
|
@@ -3744,9 +3747,9 @@ class HyperListApp
|
|
|
3744
3747
|
# Build help text using consistent formatting
|
|
3745
3748
|
help_lines = []
|
|
3746
3749
|
help_lines << " Press #{"?".fg("10")} for full documentation, #{"UP/DOWN".fg("10")} to scroll, or any other key to return"
|
|
3747
|
-
help_lines << ""
|
|
3750
|
+
help_lines << " "
|
|
3748
3751
|
help_lines << "#{"HYPERLIST KEY BINDINGS".b}"
|
|
3749
|
-
help_lines << ""
|
|
3752
|
+
help_lines << " "
|
|
3750
3753
|
help_lines << "#{"NAVIGATION".fg("14")}"
|
|
3751
3754
|
help_lines << help_line("#{"j/↓".fg("10")}", "Move down", "#{"k/↑".fg("10")}", "Move up")
|
|
3752
3755
|
help_lines << help_line("#{"h".fg("10")}", "Go to parent", "#{"l".fg("10")}", "Go to first child")
|
|
@@ -3755,10 +3758,10 @@ class HyperListApp
|
|
|
3755
3758
|
help_lines << help_line("#{"R".fg("10")}", "Jump to reference", "#{"F".fg("10")}", "Open file/URL")
|
|
3756
3759
|
help_lines << help_line("#{"ma".fg("10")}", "Set mark 'a'", "#{"'a".fg("10")}", "Jump to mark 'a'")
|
|
3757
3760
|
help_lines << help_line("#{"''".fg("10")}", "Jump to prev position", "#{"N".fg("10")}", "Next = template marker")
|
|
3758
|
-
help_lines << ""
|
|
3761
|
+
help_lines << " "
|
|
3759
3762
|
help_lines << "#{"SEARCH".fg("14")}"
|
|
3760
3763
|
help_lines << help_line("#{"/".fg("10")}", "Search forward", "#{"n".fg("10")}", "Next match")
|
|
3761
|
-
help_lines << ""
|
|
3764
|
+
help_lines << " "
|
|
3762
3765
|
help_lines << "#{"FOLDING".fg("14")}"
|
|
3763
3766
|
help_lines << help_line("#{"Space".fg("10")}", "Toggle fold", "#{"za".fg("10")}", "Toggle all folds")
|
|
3764
3767
|
help_lines << help_line("#{"zo".fg("10")}", "Open fold", "#{"zc".fg("10")}", "Close fold")
|
|
@@ -3766,7 +3769,7 @@ class HyperListApp
|
|
|
3766
3769
|
help_lines << help_line("#{"1-9".fg("10")}", "Expand to level", "#{"0".fg("10")}", "Multi-digit fold level")
|
|
3767
3770
|
help_lines << help_line("#{"▶".fg("245")}", "Collapsed (hidden)")
|
|
3768
3771
|
help_lines << help_line("#{"▷".fg("245")}", "Expanded (visible)")
|
|
3769
|
-
help_lines << ""
|
|
3772
|
+
help_lines << " "
|
|
3770
3773
|
help_lines << "#{"EDITING".fg("14")}"
|
|
3771
3774
|
help_lines << help_line("#{"i/Enter".fg("10")}", "Edit line", "#{"o".fg("10")}", "Insert line below")
|
|
3772
3775
|
help_lines << help_line("#{"O".fg("10")}", "Insert line above", "#{"a".fg("10")}", "Insert child")
|
|
@@ -3782,7 +3785,7 @@ class HyperListApp
|
|
|
3782
3785
|
help_lines << help_line("#{"C-UP".fg("10")}", "Move up in visible list", "#{"C-DOWN".fg("10")}", "Move down in visible list")
|
|
3783
3786
|
help_lines << help_line("#{"→".fg("10")}", "Uncollapse item", "#{"←".fg("10")}", "Collapse item")
|
|
3784
3787
|
help_lines << help_line("#{"Tab".fg("10")}", "Indent item+kids", "#{"S-Tab".fg("10")}", "Unindent item+kids")
|
|
3785
|
-
help_lines << ""
|
|
3788
|
+
help_lines << " "
|
|
3786
3789
|
help_lines << "#{"SPECIAL FEATURES".fg("14")}"
|
|
3787
3790
|
help_lines << help_line("#{"v".fg("10")}", "Toggle checkbox", "#{"V".fg("10")}", "Checkbox with date")
|
|
3788
3791
|
help_lines << help_line("#{"C-X".fg("10")}", "Remove checkbox", "", "")
|
|
@@ -3790,7 +3793,7 @@ class HyperListApp
|
|
|
3790
3793
|
help_lines << help_line("#{"C-P".fg("10")}", "Presentation mode", "#{"Tab/S-Tab".fg("10")}", "Next/prev sibling (in P)")
|
|
3791
3794
|
help_lines << help_line("#{"Ma".fg("10")}", "Record macro 'a'", "#{"@a".fg("10")}", "Play macro 'a'")
|
|
3792
3795
|
help_lines << help_line("#{"w".fg("10")}", "Switch panes (split view)")
|
|
3793
|
-
help_lines << ""
|
|
3796
|
+
help_lines << " "
|
|
3794
3797
|
help_lines << "#{"FILE OPERATIONS".fg("14")}"
|
|
3795
3798
|
help_lines << help_line("#{":w".fg("10")}", "Save", "#{":q".fg("10")}", "Quit")
|
|
3796
3799
|
help_lines << help_line("#{":wq".fg("10")}", "Save and quit", "#{":e file".fg("10")}", "Open file")
|
|
@@ -3798,27 +3801,24 @@ class HyperListApp
|
|
|
3798
3801
|
help_lines << help_line("#{":graph :g".fg("10")}", "Export to PNG graph", "#{":vsplit :vs".fg("10")}", "Split view")
|
|
3799
3802
|
help_lines << help_line("#{":as on".fg("10")}", "Enable autosave", "#{":as off".fg("10")}", "Disable autosave")
|
|
3800
3803
|
help_lines << help_line("#{":as N".fg("10")}", "Set interval (secs)", "#{":as".fg("10")}", "Show autosave status")
|
|
3801
|
-
help_lines << ""
|
|
3804
|
+
help_lines << " "
|
|
3802
3805
|
help_lines << "#{"TAGGING & BATCH OPS".fg("14")}"
|
|
3803
3806
|
help_lines << help_line("#{"t".fg("10")}", "Tag/untag item", "#{"u".fg("10")}", "Clear all tags")
|
|
3804
3807
|
help_lines << help_line("#{"C-T".fg("10")}", "Tag by regex pattern", "", "")
|
|
3805
3808
|
help_lines << help_line("#{"[T:N]".fg("245")}", "Status shows N tagged", "#{"Blue bg".fg("245")}", "Tagged items")
|
|
3806
3809
|
help_lines << help_line("#{"D/y/Tab".fg("245")}", "Ops work on tagged items")
|
|
3807
|
-
help_lines << ""
|
|
3808
|
-
|
|
3810
|
+
help_lines << " "
|
|
3809
3811
|
help_lines << "#{"TEMPLATES".fg("14")}"
|
|
3810
3812
|
help_lines << help_line("#{"T".fg("10")}", "Insert template", "#{":st".fg("10")}", "Save as template")
|
|
3811
3813
|
help_lines << help_line("#{":dt".fg("10")}", "Delete template", "#{":lt".fg("10")}", "List user templates")
|
|
3812
|
-
help_lines << ""
|
|
3813
|
-
|
|
3814
|
+
help_lines << " "
|
|
3814
3815
|
help_lines << "#{"CONFIGURATION".fg("14")}"
|
|
3815
3816
|
help_lines << help_line("#{":set".fg("10")}", "Show all settings")
|
|
3816
|
-
help_lines << help_line("#{":set o".fg("10")}", "Show option value")
|
|
3817
|
+
help_lines << help_line("#{":set o".fg("10")}", "Show option value")
|
|
3817
3818
|
help_lines << help_line("#{":set o=val".fg("10")}", "Set option value")
|
|
3818
3819
|
help_lines << help_line("#{"Options:".fg("245")}", "theme, wrap, fold_level")
|
|
3819
3820
|
help_lines << help_line("#{"".fg("245")}", "show_numbers, tab_width")
|
|
3820
|
-
help_lines << ""
|
|
3821
|
-
|
|
3821
|
+
help_lines << " "
|
|
3822
3822
|
help_lines << "#{"HELP & QUIT".fg("14")}"
|
|
3823
3823
|
help_lines << help_line("#{"?".fg("10")}", "This help", "#{"??".fg("10")}", "Full documentation")
|
|
3824
3824
|
help_lines << help_line("#{"q".fg("10")}", "Quit (asks to save)", "#{"Q".fg("10")}", "Force quit")
|
|
@@ -3838,13 +3838,17 @@ class HyperListApp
|
|
|
3838
3838
|
saved_current = @current
|
|
3839
3839
|
saved_offset = @offset
|
|
3840
3840
|
saved_modified = @modified
|
|
3841
|
-
|
|
3841
|
+
saved_presentation_mode = @presentation_mode
|
|
3842
|
+
|
|
3843
|
+
# Disable presentation mode for help viewer
|
|
3844
|
+
@presentation_mode = false
|
|
3845
|
+
|
|
3842
3846
|
# Create temporary help items for scrolling
|
|
3843
3847
|
@items = help.split("\n").map { |line| {"text" => line, "level" => 0, "fold" => false, "raw" => true} }
|
|
3844
3848
|
@current = 0
|
|
3845
3849
|
@offset = 0
|
|
3846
3850
|
@modified = false
|
|
3847
|
-
|
|
3851
|
+
|
|
3848
3852
|
# Help viewer loop
|
|
3849
3853
|
loop do
|
|
3850
3854
|
render_main
|
|
@@ -3886,8 +3890,9 @@ class HyperListApp
|
|
|
3886
3890
|
@current = saved_current
|
|
3887
3891
|
@offset = saved_offset
|
|
3888
3892
|
@modified = saved_modified
|
|
3893
|
+
@presentation_mode = saved_presentation_mode
|
|
3889
3894
|
end
|
|
3890
|
-
|
|
3895
|
+
|
|
3891
3896
|
def show_documentation
|
|
3892
3897
|
doc = <<~DOC
|
|
3893
3898
|
|
|
@@ -4366,13 +4371,17 @@ class HyperListApp
|
|
|
4366
4371
|
saved_offset = @offset
|
|
4367
4372
|
saved_filename = @filename
|
|
4368
4373
|
saved_modified = @modified
|
|
4369
|
-
|
|
4374
|
+
saved_presentation_mode = @presentation_mode
|
|
4375
|
+
|
|
4376
|
+
# Disable presentation mode for documentation viewer
|
|
4377
|
+
@presentation_mode = false
|
|
4378
|
+
|
|
4370
4379
|
# Create temporary documentation items
|
|
4371
4380
|
@items = doc.split("\n").map { |line| {"text" => line, "level" => 0, "fold" => false, "raw" => true} }
|
|
4372
4381
|
@current = 0
|
|
4373
4382
|
@offset = 0
|
|
4374
4383
|
@modified = false
|
|
4375
|
-
|
|
4384
|
+
|
|
4376
4385
|
# Documentation viewer loop
|
|
4377
4386
|
loop do
|
|
4378
4387
|
render_main
|
|
@@ -4419,8 +4428,9 @@ class HyperListApp
|
|
|
4419
4428
|
@offset = saved_offset
|
|
4420
4429
|
@filename = saved_filename
|
|
4421
4430
|
@modified = saved_modified
|
|
4431
|
+
@presentation_mode = saved_presentation_mode
|
|
4422
4432
|
end
|
|
4423
|
-
|
|
4433
|
+
|
|
4424
4434
|
def handle_command
|
|
4425
4435
|
@mode = :command
|
|
4426
4436
|
# Set command history (reversed for proper UP arrow navigation)
|
data/hyperlist.gemspec
CHANGED