reline 0.1.10 → 0.2.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.
- checksums.yaml +4 -4
- data/lib/reline.rb +6 -2
- data/lib/reline/config.rb +2 -1
- data/lib/reline/line_editor.rb +44 -29
- data/lib/reline/unicode.rb +5 -4
- data/lib/reline/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a20f90b83534916dd8575a842ef2cbe968879cc4b2d1826b5374137f554249a
|
4
|
+
data.tar.gz: add41e0e8f89fa39b8064c9d45bc0f17ac1b374578ae25872e24c50cb2e0e761
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebd4286538633a6bb87dd2007bdd6bf389ef87aa5dd7406288ae8f52cacc1e0d7f87c4d3ae4bbac3fa125004d5f65b5740c6b8d2ec014e130160d7bd22c6ec1e
|
7
|
+
data.tar.gz: 3a418c2aa202ac4710bb7d90d0017870c066e17ece72c644f90e4d37b9faadb02636150d332c00845c5ca60a421abd1394255f77e95be7626cfce046705b7ed0
|
data/lib/reline.rb
CHANGED
@@ -36,7 +36,6 @@ module Reline
|
|
36
36
|
attr_accessor :config
|
37
37
|
attr_accessor :key_stroke
|
38
38
|
attr_accessor :line_editor
|
39
|
-
attr_accessor :ambiguous_width
|
40
39
|
attr_accessor :last_incremental_search
|
41
40
|
attr_reader :output
|
42
41
|
|
@@ -356,9 +355,14 @@ module Reline
|
|
356
355
|
end
|
357
356
|
end
|
358
357
|
|
358
|
+
def ambiguous_width
|
359
|
+
may_req_ambiguous_char_width unless defined? @ambiguous_width
|
360
|
+
@ambiguous_width
|
361
|
+
end
|
362
|
+
|
359
363
|
private def may_req_ambiguous_char_width
|
360
364
|
@ambiguous_width = 2 if Reline::IOGate == Reline::GeneralIO or STDOUT.is_a?(File)
|
361
|
-
return if ambiguous_width
|
365
|
+
return if @ambiguous_width
|
362
366
|
Reline::IOGate.move_cursor_column(0)
|
363
367
|
begin
|
364
368
|
output.write "\u{25bd}"
|
data/lib/reline/config.rb
CHANGED
@@ -38,6 +38,7 @@ class Reline::Config
|
|
38
38
|
vi-ins-mode-icon
|
39
39
|
emacs-mode-string
|
40
40
|
enable-bracketed-paste
|
41
|
+
isearch-terminators
|
41
42
|
}
|
42
43
|
VARIABLE_NAME_SYMBOLS = VARIABLE_NAMES.map { |v| :"#{v.tr(?-, ?_)}" }
|
43
44
|
VARIABLE_NAME_SYMBOLS.each do |v|
|
@@ -238,7 +239,7 @@ class Reline::Config
|
|
238
239
|
when 'completion-query-items'
|
239
240
|
@completion_query_items = value.to_i
|
240
241
|
when 'isearch-terminators'
|
241
|
-
@isearch_terminators =
|
242
|
+
@isearch_terminators = retrieve_string(value)
|
242
243
|
when 'editing-mode'
|
243
244
|
case value
|
244
245
|
when 'emacs'
|
data/lib/reline/line_editor.rb
CHANGED
@@ -68,6 +68,26 @@ class Reline::LineEditor
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
+
private def check_mode_icon
|
72
|
+
mode_icon = nil
|
73
|
+
if @config.show_mode_in_prompt
|
74
|
+
if @config.editing_mode_is?(:vi_command)
|
75
|
+
mode_icon = @config.vi_cmd_mode_icon
|
76
|
+
elsif @config.editing_mode_is?(:vi_insert)
|
77
|
+
mode_icon = @config.vi_ins_mode_icon
|
78
|
+
elsif @config.editing_mode_is?(:emacs)
|
79
|
+
mode_icon = @config.emacs_mode_string
|
80
|
+
else
|
81
|
+
mode_icon = '?'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
if mode_icon != @prev_mode_icon
|
85
|
+
@rerender_all = true
|
86
|
+
end
|
87
|
+
@prev_mode_icon = mode_icon
|
88
|
+
mode_icon
|
89
|
+
end
|
90
|
+
|
71
91
|
private def check_multiline_prompt(buffer, prompt)
|
72
92
|
if @vi_arg
|
73
93
|
prompt = "(arg: #{@vi_arg}) "
|
@@ -78,7 +98,11 @@ class Reline::LineEditor
|
|
78
98
|
else
|
79
99
|
prompt = @prompt
|
80
100
|
end
|
81
|
-
|
101
|
+
if simplified_rendering?
|
102
|
+
mode_icon = check_mode_icon
|
103
|
+
prompt = mode_icon + prompt if mode_icon
|
104
|
+
return [prompt, calculate_width(prompt, true), [prompt] * buffer.size]
|
105
|
+
end
|
82
106
|
if @prompt_proc
|
83
107
|
use_cached_prompt_list = false
|
84
108
|
if @cached_prompt_list
|
@@ -95,35 +119,16 @@ class Reline::LineEditor
|
|
95
119
|
@prompt_cache_time = Time.now.to_f
|
96
120
|
end
|
97
121
|
prompt_list.map!{ prompt } if @vi_arg or @searching_prompt
|
98
|
-
|
99
|
-
|
100
|
-
mode_icon = @config.vi_cmd_mode_icon
|
101
|
-
elsif @config.editing_mode_is?(:vi_insert)
|
102
|
-
mode_icon = @config.vi_ins_mode_icon
|
103
|
-
elsif @config.editing_mode_is?(:emacs)
|
104
|
-
mode_icon = @config.emacs_mode_string
|
105
|
-
else
|
106
|
-
mode_icon = '?'
|
107
|
-
end
|
108
|
-
prompt_list.map!{ |pr| mode_icon + pr }
|
109
|
-
end
|
122
|
+
mode_icon = check_mode_icon
|
123
|
+
prompt_list = prompt_list.map{ |pr| mode_icon + pr } if mode_icon
|
110
124
|
prompt = prompt_list[@line_index]
|
125
|
+
prompt = prompt_list[0] if prompt.nil?
|
111
126
|
prompt_width = calculate_width(prompt, true)
|
112
127
|
[prompt, prompt_width, prompt_list]
|
113
128
|
else
|
129
|
+
mode_icon = check_mode_icon
|
130
|
+
prompt = mode_icon + prompt if mode_icon
|
114
131
|
prompt_width = calculate_width(prompt, true)
|
115
|
-
if @config.show_mode_in_prompt
|
116
|
-
if @config.editing_mode_is?(:vi_command)
|
117
|
-
mode_icon = @config.vi_cmd_mode_icon
|
118
|
-
elsif @config.editing_mode_is?(:vi_insert)
|
119
|
-
mode_icon = @config.vi_ins_mode_icon
|
120
|
-
elsif @config.editing_mode_is?(:emacs)
|
121
|
-
mode_icon = @config.emacs_mode_string
|
122
|
-
else
|
123
|
-
mode_icon = '?'
|
124
|
-
end
|
125
|
-
prompt = mode_icon + prompt
|
126
|
-
end
|
127
132
|
[prompt, prompt_width, nil]
|
128
133
|
end
|
129
134
|
end
|
@@ -213,6 +218,8 @@ class Reline::LineEditor
|
|
213
218
|
@eof = false
|
214
219
|
@continuous_insertion_buffer = String.new(encoding: @encoding)
|
215
220
|
@scroll_partial_screen = nil
|
221
|
+
@prev_mode_icon = nil
|
222
|
+
@drop_terminate_spaces = false
|
216
223
|
reset_line
|
217
224
|
end
|
218
225
|
|
@@ -1593,9 +1600,11 @@ class Reline::LineEditor
|
|
1593
1600
|
searcher = generate_searcher
|
1594
1601
|
searcher.resume(key)
|
1595
1602
|
@searching_prompt = "(reverse-i-search)`': "
|
1603
|
+
termination_keys = ["\C-j".ord]
|
1604
|
+
termination_keys.concat(@config.isearch_terminators&.chars&.map(&:ord)) if @config.isearch_terminators
|
1596
1605
|
@waiting_proc = ->(k) {
|
1597
1606
|
case k
|
1598
|
-
when
|
1607
|
+
when *termination_keys
|
1599
1608
|
if @history_pointer
|
1600
1609
|
buffer = Reline::HISTORY[@history_pointer]
|
1601
1610
|
else
|
@@ -1614,6 +1623,8 @@ class Reline::LineEditor
|
|
1614
1623
|
@waiting_proc = nil
|
1615
1624
|
@cursor_max = calculate_width(@line)
|
1616
1625
|
@cursor = @byte_pointer = 0
|
1626
|
+
@rerender_all = true
|
1627
|
+
@cached_prompt_list = nil
|
1617
1628
|
searcher.resume(-1)
|
1618
1629
|
when "\C-g".ord
|
1619
1630
|
if @is_multiline
|
@@ -1657,6 +1668,8 @@ class Reline::LineEditor
|
|
1657
1668
|
@waiting_proc = nil
|
1658
1669
|
@cursor_max = calculate_width(@line)
|
1659
1670
|
@cursor = @byte_pointer = 0
|
1671
|
+
@rerender_all = true
|
1672
|
+
@cached_prompt_list = nil
|
1660
1673
|
searcher.resume(-1)
|
1661
1674
|
end
|
1662
1675
|
end
|
@@ -2176,7 +2189,7 @@ class Reline::LineEditor
|
|
2176
2189
|
|
2177
2190
|
private def vi_next_word(key, arg: 1)
|
2178
2191
|
if @line.bytesize > @byte_pointer
|
2179
|
-
byte_size, width = Reline::Unicode.vi_forward_word(@line, @byte_pointer)
|
2192
|
+
byte_size, width = Reline::Unicode.vi_forward_word(@line, @byte_pointer, @drop_terminate_spaces)
|
2180
2193
|
@byte_pointer += byte_size
|
2181
2194
|
@cursor += width
|
2182
2195
|
end
|
@@ -2304,6 +2317,7 @@ class Reline::LineEditor
|
|
2304
2317
|
end
|
2305
2318
|
|
2306
2319
|
private def vi_change_meta(key, arg: 1)
|
2320
|
+
@drop_terminate_spaces = true
|
2307
2321
|
@waiting_operator_proc = proc { |cursor_diff, byte_pointer_diff|
|
2308
2322
|
if byte_pointer_diff > 0
|
2309
2323
|
@line, cut = byteslice!(@line, @byte_pointer, byte_pointer_diff)
|
@@ -2315,6 +2329,7 @@ class Reline::LineEditor
|
|
2315
2329
|
@cursor_max -= cursor_diff.abs
|
2316
2330
|
@byte_pointer += byte_pointer_diff if byte_pointer_diff < 0
|
2317
2331
|
@config.editing_mode = :vi_insert
|
2332
|
+
@drop_terminate_spaces = false
|
2318
2333
|
}
|
2319
2334
|
@waiting_operator_vi_arg = arg
|
2320
2335
|
end
|
@@ -2466,7 +2481,7 @@ class Reline::LineEditor
|
|
2466
2481
|
byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer)
|
2467
2482
|
before = @line.byteslice(0, @byte_pointer)
|
2468
2483
|
remaining_point = @byte_pointer + byte_size
|
2469
|
-
after = @line.byteslice(remaining_point, @line.
|
2484
|
+
after = @line.byteslice(remaining_point, @line.bytesize - remaining_point)
|
2470
2485
|
@line = before + k.chr + after
|
2471
2486
|
@cursor_max = calculate_width(@line)
|
2472
2487
|
@waiting_proc = nil
|
@@ -2477,7 +2492,7 @@ class Reline::LineEditor
|
|
2477
2492
|
end
|
2478
2493
|
before = @line.byteslice(0, @byte_pointer)
|
2479
2494
|
remaining_point = @byte_pointer + byte_size
|
2480
|
-
after = @line.byteslice(remaining_point, @line.
|
2495
|
+
after = @line.byteslice(remaining_point, @line.bytesize - remaining_point)
|
2481
2496
|
replaced = k.chr * arg
|
2482
2497
|
@line = before + replaced + after
|
2483
2498
|
@byte_pointer += replaced.bytesize
|
data/lib/reline/unicode.rb
CHANGED
@@ -458,8 +458,8 @@ class Reline::Unicode
|
|
458
458
|
[byte_size, width]
|
459
459
|
end
|
460
460
|
|
461
|
-
def self.vi_forward_word(line, byte_pointer)
|
462
|
-
if
|
461
|
+
def self.vi_forward_word(line, byte_pointer, drop_terminate_spaces = false)
|
462
|
+
if line.bytesize > byte_pointer
|
463
463
|
size = get_next_mbchar_size(line, byte_pointer)
|
464
464
|
mbchar = line.byteslice(byte_pointer, size)
|
465
465
|
if mbchar =~ /\w/
|
@@ -474,7 +474,7 @@ class Reline::Unicode
|
|
474
474
|
else
|
475
475
|
return [0, 0]
|
476
476
|
end
|
477
|
-
while
|
477
|
+
while line.bytesize > (byte_pointer + byte_size)
|
478
478
|
size = get_next_mbchar_size(line, byte_pointer + byte_size)
|
479
479
|
mbchar = line.byteslice(byte_pointer + byte_size, size)
|
480
480
|
case started_by
|
@@ -488,7 +488,8 @@ class Reline::Unicode
|
|
488
488
|
width += get_mbchar_width(mbchar)
|
489
489
|
byte_size += size
|
490
490
|
end
|
491
|
-
|
491
|
+
return [byte_size, width] if drop_terminate_spaces
|
492
|
+
while line.bytesize > (byte_pointer + byte_size)
|
492
493
|
size = get_next_mbchar_size(line, byte_pointer + byte_size)
|
493
494
|
mbchar = line.byteslice(byte_pointer + byte_size, size)
|
494
495
|
break if mbchar =~ /\S/
|
data/lib/reline/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- aycabta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-12-
|
11
|
+
date: 2020-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: io-console
|