yap-rawline 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rawline/completer.rb +92 -49
- data/lib/rawline/editor.rb +4 -2
- data/lib/rawline/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce2b5e0011a3641eea68691491f1e0b5e81344ea
|
4
|
+
data.tar.gz: aba178fb5a2528664eb9447e3138b51b85fa392c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c323b27b18f30f62f19124d58a8b9005f003c70c732298d5bdafb999e7ce1ec24954a077e0205b48f0eda181d40f0ff74cbc24eb03d14ee9a22c7816d783e38b
|
7
|
+
data.tar.gz: ee29e835913c429fcf8399fd00fae9d65cc566df6b6d5805e782db0cc271875d7e051cbc76bde2914b7b6d0bc7191e3baf68335f9124cff16c29527fb51a2822
|
data/lib/rawline/completer.rb
CHANGED
@@ -28,64 +28,107 @@ module RawLine
|
|
28
28
|
# E.g. holding down the tab key or arrow keys
|
29
29
|
bytes = bytes.uniq
|
30
30
|
|
31
|
-
if
|
32
|
-
|
33
|
-
|
34
|
-
@completion_found_proc.call(completion: match, possible_completions: @completion_matches.reverse)
|
35
|
-
elsif bytes.map(&:ord) == @keys[:right_arrow]
|
36
|
-
@completion_matches.back
|
37
|
-
match = @completion_matches.get
|
38
|
-
@completion_found_proc.call(completion: match, possible_completions: @completion_matches.reverse)
|
39
|
-
elsif bytes.map(&:ord) != @completion_char
|
40
|
-
@done_proc.call(bytes)
|
41
|
-
elsif @first_time
|
42
|
-
unless !@completion_proc || @completion_proc == []
|
43
|
-
word = @line.text[@line.word[:start]..@line.position-1] || ""
|
44
|
-
words = @line.text
|
45
|
-
.split(/\s+/)
|
46
|
-
.delete_if(&:empty?)
|
47
|
-
word_index = words.index(word)
|
48
|
-
Treefell['editor'].puts "completer, looking for completions word=#{word.inspect} words=#{words.inspect} word_index=#{word_index}"
|
49
|
-
matches = @completion_proc.call(
|
50
|
-
word,
|
51
|
-
words,
|
52
|
-
word_index
|
53
|
-
)
|
54
|
-
end
|
55
|
-
matches = matches.to_a.compact.sort.reverse
|
56
|
-
|
57
|
-
if matches.any?
|
58
|
-
@completion_matches.resize(matches.length)
|
59
|
-
matches.each { |w| @completion_matches << w }
|
60
|
-
end
|
31
|
+
if @first_time
|
32
|
+
matches = fetch_completions
|
33
|
+
resize(matches)
|
61
34
|
|
62
35
|
if matches.length == 1
|
63
|
-
|
64
|
-
@completion_selected_proc.call(@completion_matches.first)
|
65
|
-
@done_proc.call
|
36
|
+
handle_one_match
|
66
37
|
elsif matches.length > 1
|
67
|
-
|
68
|
-
|
69
|
-
# Get first match
|
70
|
-
@completion_matches.back
|
71
|
-
match = @completion_matches.get
|
72
|
-
|
73
|
-
# completion matches is a history implementation and its in reverse order from what
|
74
|
-
# a user would expect
|
75
|
-
@completion_found_proc.call(completion: match, possible_completions: @completion_matches.reverse)
|
38
|
+
handle_more_than_one_match
|
76
39
|
else
|
77
|
-
|
78
|
-
@completion_not_found_proc.call
|
79
|
-
@done_proc.call
|
40
|
+
handle_no_completions
|
80
41
|
end
|
42
|
+
|
81
43
|
@first_time = false
|
44
|
+
elsif bytes.map(&:ord) == @keys[:left_arrow]
|
45
|
+
select_previous
|
46
|
+
elsif bytes.map(&:ord) == @keys[:right_arrow]
|
47
|
+
select_next
|
48
|
+
elsif bytes.map(&:ord) == @completion_char
|
49
|
+
select_next
|
82
50
|
else
|
83
|
-
|
84
|
-
|
51
|
+
Treefell['editor'].puts "completer, done with leftover bytes: #{bytes.inspect}"
|
52
|
+
@done_proc.call(bytes)
|
53
|
+
end
|
54
|
+
end
|
85
55
|
|
86
|
-
|
56
|
+
private
|
57
|
+
|
58
|
+
def fetch_completions
|
59
|
+
if @completion_proc && @completion_proc.respond_to?(:call)
|
60
|
+
word = @line.text[@line.word[:start]..@line.position-1] || ""
|
61
|
+
words = @line.text
|
62
|
+
.split(/\s+/)
|
63
|
+
.delete_if(&:empty?)
|
64
|
+
word_index = words.index(word)
|
65
|
+
Treefell['editor'].puts "completer, looking for completions word=#{word.inspect} words=#{words.inspect} word_index=#{word_index}"
|
66
|
+
matches = @completion_proc.call(
|
67
|
+
word,
|
68
|
+
words,
|
69
|
+
word_index
|
70
|
+
)
|
87
71
|
end
|
72
|
+
|
73
|
+
# Always return an array so the caller doesn't have
|
74
|
+
# to worry about nil
|
75
|
+
matches.to_a.compact
|
76
|
+
end
|
77
|
+
|
78
|
+
def handle_one_match
|
79
|
+
Treefell['editor'].puts "completer, exactly one possible completion found: #{matches.inspect}"
|
80
|
+
@completion_selected_proc.call(@completion_matches.first)
|
81
|
+
|
82
|
+
Treefell['editor'].puts "completer, done"
|
83
|
+
@done_proc.call
|
88
84
|
end
|
89
|
-
end
|
90
85
|
|
86
|
+
def handle_more_than_one_match
|
87
|
+
Treefell['editor'].puts "completer, more than one possible completion"
|
88
|
+
|
89
|
+
# Get first match
|
90
|
+
@completion_matches.back
|
91
|
+
match = @completion_matches.get
|
92
|
+
|
93
|
+
Treefell['editor'].puts "completer: first completion: #{match} possible: #{possible_completions.inspect}"
|
94
|
+
@completion_found_proc.call(completion: match, possible_completions: possible_completions)
|
95
|
+
end
|
96
|
+
|
97
|
+
def handle_no_completions
|
98
|
+
Treefell['editor'].puts "completer, no possible completions found"
|
99
|
+
@completion_not_found_proc.call
|
100
|
+
|
101
|
+
Treefell['editor'].puts "completer, done"
|
102
|
+
@done_proc.call
|
103
|
+
end
|
104
|
+
|
105
|
+
def possible_completions
|
106
|
+
# completion matches is a history implementation and its in reverse order from what
|
107
|
+
# a user would expect
|
108
|
+
@completion_matches.reverse
|
109
|
+
end
|
110
|
+
|
111
|
+
def resize(matches)
|
112
|
+
if matches.any?
|
113
|
+
@completion_matches.resize(matches.length)
|
114
|
+
matches.each { |w| @completion_matches << w }
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def select_next
|
119
|
+
@completion_matches.back
|
120
|
+
match = @completion_matches.get
|
121
|
+
|
122
|
+
Treefell['editor'].puts "completer, selecting next match=#{match.inspect} possible_completions=#{possible_completions.inspect}"
|
123
|
+
@completion_found_proc.call(completion: match, possible_completions: possible_completions)
|
124
|
+
end
|
125
|
+
|
126
|
+
def select_previous
|
127
|
+
@completion_matches.forward
|
128
|
+
match = @completion_matches.get
|
129
|
+
|
130
|
+
Treefell['editor'].puts "completer, selecting previous match=#{match.inspect} possible_completions=#{possible_completions.inspect}"
|
131
|
+
@completion_found_proc.call(completion: match, possible_completions: possible_completions)
|
132
|
+
end
|
133
|
+
end
|
91
134
|
end
|
data/lib/rawline/editor.rb
CHANGED
@@ -684,13 +684,13 @@ module RawLine
|
|
684
684
|
end
|
685
685
|
|
686
686
|
def completion_selected(completion)
|
687
|
-
Treefell['editor'].puts "word-completion-selected #{completion}"
|
687
|
+
Treefell['editor'].puts "word-completion-selected #{completion.inspect}"
|
688
688
|
move_to_position @line.word[:end]
|
689
689
|
delete_n_characters(@line.word[:end] - @line.word[:start], true)
|
690
690
|
write completion.to_s
|
691
691
|
|
692
692
|
if @on_word_completion_selected
|
693
|
-
Treefell['editor'].puts "word-completion-selected callback called with #{
|
693
|
+
Treefell['editor'].puts "word-completion-selected callback called with #{completioni}"
|
694
694
|
@on_word_completion_selected.call(name: "word-completion-selected", payload: { completion: completion })
|
695
695
|
end
|
696
696
|
end
|
@@ -871,10 +871,12 @@ module RawLine
|
|
871
871
|
@event_loop = Rawline::EventLoop.new(registry: @event_registry)
|
872
872
|
|
873
873
|
@dom.on(:child_changed) do |*args|
|
874
|
+
Treefell['editor'].puts 'DOM child changed, re-rendering'
|
874
875
|
@event_loop.add_event name: "render", source: @dom#, target: event[:target]
|
875
876
|
end
|
876
877
|
|
877
878
|
@dom.on :position_changed do |*args|
|
879
|
+
Treefell['editor'].puts 'DOM position changed, rendering cursor'
|
878
880
|
@renderer.render_cursor(@dom.input_box)
|
879
881
|
end
|
880
882
|
|
data/lib/rawline/version.rb
CHANGED