reline 0.3.9 → 0.5.8

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: 7f903d3b8f902335117d484007dcfbef5e8846061a8eb3c8820f9975c4c85ea5
4
- data.tar.gz: 2ccb2d104c5c52b4e4f8ab1dd8a48ceb738fa03826ab62a7b38483d0f4f1288a
3
+ metadata.gz: bcccc644594f9c2e4b9ae0eb743c2ae293ef084e96a8d9bd032b76825111c01b
4
+ data.tar.gz: b5ab239a3d20925d4fbd8fb827908fa3e4fa70298a172e32e9b2b4de59dc767e
5
5
  SHA512:
6
- metadata.gz: d8edd5b7d31464fbc150518f94d45d84466837fe78374dbc127f2226005eb73f2c238f274d685ed42c97db56e906fb90b5e6369dd03dbaeac4b6f2019f36cd68
7
- data.tar.gz: 317225a1374e59f3dbb654b67a732fd3daf669fd13cab0673d73e0b952cc8d6fad554c4318366479d162890d0c538ca09cc902a1ad2fad0e42e4684b54f81c3e
6
+ metadata.gz: 9bce894711da0253bf9b3f0eb192ff64947d591edd00f9094430431eb470fade4d02f3f8b529d364cdd7124d7f5a5203ea755be41dbfda890e37654aca430706
7
+ data.tar.gz: eed500ad148a1f83e3de03e6d7daaf5d250ba3ea25d47d24070e749dfd44a7d900b83474dd0b427faee74bad883dab97b7af1984a7fb7209e1819fd416d4381b
data/README.md CHANGED
@@ -15,7 +15,7 @@ Reline is compatible with the API of Ruby's stdlib 'readline', GNU Readline and
15
15
 
16
16
  It's compatible with the readline standard library.
17
17
 
18
- See [the document of readline stdlib](https://ruby-doc.org/stdlib/libdoc/readline/rdoc/Readline.html) or [bin/example](https://github.com/ruby/reline/blob/master/bin/example).
18
+ See [the document of readline stdlib](https://ruby-doc.org/stdlib/exts/readline/Readline.html) or [bin/example](https://github.com/ruby/reline/blob/master/bin/example).
19
19
 
20
20
  ### Multi-line editing mode
21
21
 
@@ -55,6 +55,13 @@ end
55
55
 
56
56
  See also: [test/reline/yamatanooroti/multiline_repl](https://github.com/ruby/reline/blob/master/test/reline/yamatanooroti/multiline_repl)
57
57
 
58
+ ## Documentation
59
+
60
+ ### Reline::Face
61
+
62
+ You can modify the text color and text decorations in your terminal emulator.
63
+ See [doc/reline/face.md](./doc/reline/face.md)
64
+
58
65
  ## Contributing
59
66
 
60
67
  Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/reline.
data/lib/reline/ansi.rb CHANGED
@@ -3,6 +3,8 @@ require 'io/wait'
3
3
  require_relative 'terminfo'
4
4
 
5
5
  class Reline::ANSI
6
+ RESET_COLOR = "\e[0m"
7
+
6
8
  CAPNAME_KEY_BINDINGS = {
7
9
  'khome' => :ed_move_to_beg,
8
10
  'kend' => :ed_move_to_end,
@@ -43,6 +45,7 @@ class Reline::ANSI
43
45
  end
44
46
 
45
47
  def self.set_default_key_bindings(config, allow_terminfo: true)
48
+ set_bracketed_paste_key_bindings(config)
46
49
  set_default_key_bindings_ansi_cursor(config)
47
50
  if allow_terminfo && Reline::Terminfo.enabled?
48
51
  set_default_key_bindings_terminfo(config)
@@ -64,6 +67,12 @@ class Reline::ANSI
64
67
  end
65
68
  end
66
69
 
70
+ def self.set_bracketed_paste_key_bindings(config)
71
+ [:emacs, :vi_insert, :vi_command].each do |keymap|
72
+ config.add_default_key_binding_by_keymap(keymap, START_BRACKETED_PASTE.bytes, :bracketed_paste_start)
73
+ end
74
+ end
75
+
67
76
  def self.set_default_key_bindings_ansi_cursor(config)
68
77
  ANSI_CURSOR_KEY_BINDINGS.each do |char, (default_func, modifiers)|
69
78
  bindings = [["\e[#{char}", default_func]] # CSI + char
@@ -149,7 +158,11 @@ class Reline::ANSI
149
158
  end
150
159
 
151
160
  def self.with_raw_input
152
- @@input.raw { yield }
161
+ if @@input.tty?
162
+ @@input.raw(intr: true) { yield }
163
+ else
164
+ yield
165
+ end
153
166
  end
154
167
 
155
168
  @@buf = []
@@ -157,11 +170,13 @@ class Reline::ANSI
157
170
  unless @@buf.empty?
158
171
  return @@buf.shift
159
172
  end
160
- until c = @@input.raw(intr: true) { @@input.wait_readable(0.1) && @@input.getbyte }
161
- timeout_second -= 0.1
173
+ until @@input.wait_readable(0.01)
174
+ timeout_second -= 0.01
162
175
  return nil if timeout_second <= 0
163
- Reline.core.line_editor.resize
176
+
177
+ Reline.core.line_editor.handle_signal
164
178
  end
179
+ c = @@input.getbyte
165
180
  (c == 0x16 && @@input.raw(min: 0, time: 0, &:getbyte)) || c
166
181
  rescue Errno::EIO
167
182
  # Maybe the I/O has been closed.
@@ -170,46 +185,26 @@ class Reline::ANSI
170
185
  nil
171
186
  end
172
187
 
173
- @@in_bracketed_paste_mode = false
174
- START_BRACKETED_PASTE = String.new("\e[200~,", encoding: Encoding::ASCII_8BIT)
175
- END_BRACKETED_PASTE = String.new("\e[200~.", encoding: Encoding::ASCII_8BIT)
176
- def self.getc_with_bracketed_paste(timeout_second)
188
+ START_BRACKETED_PASTE = String.new("\e[200~", encoding: Encoding::ASCII_8BIT)
189
+ END_BRACKETED_PASTE = String.new("\e[201~", encoding: Encoding::ASCII_8BIT)
190
+ def self.read_bracketed_paste
177
191
  buffer = String.new(encoding: Encoding::ASCII_8BIT)
178
- buffer << inner_getc(timeout_second)
179
- while START_BRACKETED_PASTE.start_with?(buffer) or END_BRACKETED_PASTE.start_with?(buffer) do
180
- if START_BRACKETED_PASTE == buffer
181
- @@in_bracketed_paste_mode = true
182
- return inner_getc(timeout_second)
183
- elsif END_BRACKETED_PASTE == buffer
184
- @@in_bracketed_paste_mode = false
185
- ungetc(-1)
186
- return inner_getc(timeout_second)
187
- end
188
- succ_c = inner_getc(Reline.core.config.keyseq_timeout)
189
-
190
- if succ_c
191
- buffer << succ_c
192
- else
193
- break
194
- end
192
+ until buffer.end_with?(END_BRACKETED_PASTE)
193
+ c = inner_getc(Float::INFINITY)
194
+ break unless c
195
+ buffer << c
195
196
  end
196
- buffer.bytes.reverse_each do |ch|
197
- ungetc ch
198
- end
199
- inner_getc(timeout_second)
197
+ string = buffer.delete_suffix(END_BRACKETED_PASTE).force_encoding(encoding)
198
+ string.valid_encoding? ? string : ''
200
199
  end
201
200
 
202
201
  # if the usage expects to wait indefinitely, use Float::INFINITY for timeout_second
203
202
  def self.getc(timeout_second)
204
- if Reline.core.config.enable_bracketed_paste
205
- getc_with_bracketed_paste(timeout_second)
206
- else
207
- inner_getc(timeout_second)
208
- end
203
+ inner_getc(timeout_second)
209
204
  end
210
205
 
211
206
  def self.in_pasting?
212
- @@in_bracketed_paste_mode or (not empty_buffer?)
207
+ not empty_buffer?
213
208
  end
214
209
 
215
210
  def self.empty_buffer?
@@ -240,7 +235,7 @@ class Reline::ANSI
240
235
  s = [ENV["LINES"].to_i, ENV["COLUMNS"].to_i]
241
236
  return s if s[0] > 0 && s[1] > 0
242
237
  [24, 80]
243
- rescue Errno::ENOTTY
238
+ rescue Errno::ENOTTY, Errno::ENODEV
244
239
  [24, 80]
245
240
  end
246
241
 
@@ -276,7 +271,7 @@ class Reline::ANSI
276
271
  buf = @@output.pread(@@output.pos, 0)
277
272
  row = buf.count("\n")
278
273
  column = buf.rindex("\n") ? (buf.size - buf.rindex("\n")) - 1 : 0
279
- rescue Errno::ESPIPE
274
+ rescue Errno::ESPIPE, IOError
280
275
  # Just returns column 1 for ambiguous width because this I/O is not
281
276
  # tty and can't seek.
282
277
  row = 0
@@ -307,7 +302,7 @@ class Reline::ANSI
307
302
  end
308
303
 
309
304
  def self.hide_cursor
310
- if Reline::Terminfo.enabled?
305
+ if Reline::Terminfo.enabled? && Reline::Terminfo.term_supported?
311
306
  begin
312
307
  @@output.write Reline::Terminfo.tigetstr('civis')
313
308
  rescue Reline::Terminfo::TerminfoError
@@ -319,7 +314,7 @@ class Reline::ANSI
319
314
  end
320
315
 
321
316
  def self.show_cursor
322
- if Reline::Terminfo.enabled?
317
+ if Reline::Terminfo.enabled? && Reline::Terminfo.term_supported?
323
318
  begin
324
319
  @@output.write Reline::Terminfo.tigetstr('cnorm')
325
320
  rescue Reline::Terminfo::TerminfoError
@@ -353,11 +348,15 @@ class Reline::ANSI
353
348
  end
354
349
 
355
350
  def self.prep
351
+ # Enable bracketed paste
352
+ @@output.write "\e[?2004h" if Reline.core.config.enable_bracketed_paste
356
353
  retrieve_keybuffer
357
354
  nil
358
355
  end
359
356
 
360
357
  def self.deprep(otio)
358
+ # Disable bracketed paste
359
+ @@output.write "\e[?2004l" if Reline.core.config.enable_bracketed_paste
361
360
  Signal.trap('WINCH', @@old_winch_handler) if @@old_winch_handler
362
361
  end
363
362
  end
data/lib/reline/config.rb CHANGED
@@ -8,31 +8,12 @@ class Reline::Config
8
8
  end
9
9
 
10
10
  VARIABLE_NAMES = %w{
11
- bind-tty-special-chars
12
- blink-matching-paren
13
- byte-oriented
14
11
  completion-ignore-case
15
12
  convert-meta
16
13
  disable-completion
17
- enable-keypad
18
- expand-tilde
19
- history-preserve-point
20
14
  history-size
21
- horizontal-scroll-mode
22
- input-meta
23
15
  keyseq-timeout
24
- mark-directories
25
- mark-modified-lines
26
- mark-symlinked-directories
27
- match-hidden-files
28
- meta-flag
29
- output-meta
30
- page-completions
31
- prefer-visible-bell
32
- print-completions-horizontally
33
16
  show-all-if-ambiguous
34
- show-all-if-unmodified
35
- visible-stats
36
17
  show-mode-in-prompt
37
18
  vi-cmd-mode-string
38
19
  vi-ins-mode-string
@@ -53,8 +34,6 @@ class Reline::Config
53
34
  @additional_key_bindings[:vi_insert] = {}
54
35
  @additional_key_bindings[:vi_command] = {}
55
36
  @oneshot_key_bindings = {}
56
- @skip_section = nil
57
- @if_stack = nil
58
37
  @editing_mode_label = :emacs
59
38
  @keymap_label = :emacs
60
39
  @keymap_prefix = []
@@ -71,17 +50,15 @@ class Reline::Config
71
50
  @test_mode = false
72
51
  @autocompletion = false
73
52
  @convert_meta = true if seven_bit_encoding?(Reline::IOGate.encoding)
53
+ @loaded = false
54
+ @enable_bracketed_paste = true
74
55
  end
75
56
 
76
57
  def reset
77
58
  if editing_mode_is?(:vi_command)
78
59
  @editing_mode_label = :vi_insert
79
60
  end
80
- @additional_key_bindings.keys.each do |key|
81
- @additional_key_bindings[key].clear
82
- end
83
61
  @oneshot_key_bindings.clear
84
- reset_default_key_bindings
85
62
  end
86
63
 
87
64
  def editing_mode
@@ -100,6 +77,10 @@ class Reline::Config
100
77
  @key_actors[@keymap_label]
101
78
  end
102
79
 
80
+ def loaded?
81
+ @loaded
82
+ end
83
+
103
84
  def inputrc_path
104
85
  case ENV['INPUTRC']
105
86
  when nil, ''
@@ -131,6 +112,7 @@ class Reline::Config
131
112
  end
132
113
 
133
114
  def read(file = nil)
115
+ @loaded = true
134
116
  file ||= default_inputrc_path
135
117
  begin
136
118
  if file.respond_to?(:readlines)
@@ -173,12 +155,6 @@ class Reline::Config
173
155
  @key_actors[@keymap_label].default_key_bindings[keystroke] = target
174
156
  end
175
157
 
176
- def reset_default_key_bindings
177
- @key_actors.values.each do |ka|
178
- ka.reset_default_key_bindings
179
- end
180
- end
181
-
182
158
  def read_lines(lines, file = nil)
183
159
  if not lines.empty? and lines.first.encoding != Reline.encoding_system_needs
184
160
  begin
@@ -190,9 +166,7 @@ class Reline::Config
190
166
  end
191
167
  end
192
168
  end
193
- conditions = [@skip_section, @if_stack]
194
- @skip_section = nil
195
- @if_stack = []
169
+ if_stack = []
196
170
 
197
171
  lines.each_with_index do |line, no|
198
172
  next if line.match(/\A\s*#/)
@@ -201,62 +175,67 @@ class Reline::Config
201
175
 
202
176
  line = line.chomp.lstrip
203
177
  if line.start_with?('$')
204
- handle_directive(line[1..-1], file, no)
178
+ handle_directive(line[1..-1], file, no, if_stack)
205
179
  next
206
180
  end
207
181
 
208
- next if @skip_section
182
+ next if if_stack.any? { |_no, skip| skip }
209
183
 
210
184
  case line
211
- when /^set +([^ ]+) +([^ ]+)/i
212
- var, value = $1.downcase, $2
213
- bind_variable(var, value)
185
+ when /^set +([^ ]+) +(.+)/i
186
+ # value ignores everything after a space, raw_value does not.
187
+ var, value, raw_value = $1.downcase, $2.partition(' ').first, $2
188
+ bind_variable(var, value, raw_value)
214
189
  next
215
190
  when /\s*("#{KEYSEQ_PATTERN}+")\s*:\s*(.*)\s*$/o
216
191
  key, func_name = $1, $2
192
+ func_name = func_name.split.first
217
193
  keystroke, func = bind_key(key, func_name)
218
194
  next unless keystroke
219
195
  @additional_key_bindings[@keymap_label][@keymap_prefix + keystroke] = func
220
196
  end
221
197
  end
222
- unless @if_stack.empty?
223
- raise InvalidInputrc, "#{file}:#{@if_stack.last[1]}: unclosed if"
198
+ unless if_stack.empty?
199
+ raise InvalidInputrc, "#{file}:#{if_stack.last[0]}: unclosed if"
224
200
  end
225
- ensure
226
- @skip_section, @if_stack = conditions
227
201
  end
228
202
 
229
- def handle_directive(directive, file, no)
203
+ def handle_directive(directive, file, no, if_stack)
230
204
  directive, args = directive.split(' ')
231
205
  case directive
232
206
  when 'if'
233
207
  condition = false
234
208
  case args
235
- when 'mode'
209
+ when /^mode=(vi|emacs)$/i
210
+ mode = $1.downcase
211
+ # NOTE: mode=vi means vi-insert mode
212
+ mode = 'vi_insert' if mode == 'vi'
213
+ if @editing_mode_label == mode.to_sym
214
+ condition = true
215
+ end
236
216
  when 'term'
237
217
  when 'version'
238
218
  else # application name
239
219
  condition = true if args == 'Ruby'
240
220
  condition = true if args == 'Reline'
241
221
  end
242
- @if_stack << [file, no, @skip_section]
243
- @skip_section = !condition
222
+ if_stack << [no, !condition]
244
223
  when 'else'
245
- if @if_stack.empty?
224
+ if if_stack.empty?
246
225
  raise InvalidInputrc, "#{file}:#{no}: unmatched else"
247
226
  end
248
- @skip_section = !@skip_section
227
+ if_stack.last[1] = !if_stack.last[1]
249
228
  when 'endif'
250
- if @if_stack.empty?
229
+ if if_stack.empty?
251
230
  raise InvalidInputrc, "#{file}:#{no}: unmatched endif"
252
231
  end
253
- @skip_section = @if_stack.pop
232
+ if_stack.pop
254
233
  when 'include'
255
234
  read(File.expand_path(args))
256
235
  end
257
236
  end
258
237
 
259
- def bind_variable(name, value)
238
+ def bind_variable(name, value, raw_value)
260
239
  case name
261
240
  when 'history-size'
262
241
  begin
@@ -281,7 +260,7 @@ class Reline::Config
281
260
  when 'completion-query-items'
282
261
  @completion_query_items = value.to_i
283
262
  when 'isearch-terminators'
284
- @isearch_terminators = retrieve_string(value)
263
+ @isearch_terminators = retrieve_string(raw_value)
285
264
  when 'editing-mode'
286
265
  case value
287
266
  when 'emacs'
@@ -323,11 +302,11 @@ class Reline::Config
323
302
  @show_mode_in_prompt = false
324
303
  end
325
304
  when 'vi-cmd-mode-string'
326
- @vi_cmd_mode_string = retrieve_string(value)
305
+ @vi_cmd_mode_string = retrieve_string(raw_value)
327
306
  when 'vi-ins-mode-string'
328
- @vi_ins_mode_string = retrieve_string(value)
307
+ @vi_ins_mode_string = retrieve_string(raw_value)
329
308
  when 'emacs-mode-string'
330
- @emacs_mode_string = retrieve_string(value)
309
+ @emacs_mode_string = retrieve_string(raw_value)
331
310
  when *VARIABLE_NAMES then
332
311
  variable_name = :"@#{name.tr(?-, ?_)}"
333
312
  instance_variable_set(variable_name, value.nil? || value == '1' || value == 'on')
@@ -0,0 +1,199 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Reline::Face
4
+ SGR_PARAMETERS = {
5
+ foreground: {
6
+ black: 30,
7
+ red: 31,
8
+ green: 32,
9
+ yellow: 33,
10
+ blue: 34,
11
+ magenta: 35,
12
+ cyan: 36,
13
+ white: 37,
14
+ bright_black: 90,
15
+ gray: 90,
16
+ bright_red: 91,
17
+ bright_green: 92,
18
+ bright_yellow: 93,
19
+ bright_blue: 94,
20
+ bright_magenta: 95,
21
+ bright_cyan: 96,
22
+ bright_white: 97
23
+ },
24
+ background: {
25
+ black: 40,
26
+ red: 41,
27
+ green: 42,
28
+ yellow: 43,
29
+ blue: 44,
30
+ magenta: 45,
31
+ cyan: 46,
32
+ white: 47,
33
+ bright_black: 100,
34
+ gray: 100,
35
+ bright_red: 101,
36
+ bright_green: 102,
37
+ bright_yellow: 103,
38
+ bright_blue: 104,
39
+ bright_magenta: 105,
40
+ bright_cyan: 106,
41
+ bright_white: 107,
42
+ },
43
+ style: {
44
+ reset: 0,
45
+ bold: 1,
46
+ faint: 2,
47
+ italicized: 3,
48
+ underlined: 4,
49
+ slowly_blinking: 5,
50
+ blinking: 5,
51
+ rapidly_blinking: 6,
52
+ negative: 7,
53
+ concealed: 8,
54
+ crossed_out: 9
55
+ }
56
+ }.freeze
57
+
58
+ class Config
59
+ ESSENTIAL_DEFINE_NAMES = %i(default enhanced scrollbar).freeze
60
+ RESET_SGR = "\e[0m".freeze
61
+
62
+ def initialize(name, &block)
63
+ @definition = {}
64
+ block.call(self)
65
+ ESSENTIAL_DEFINE_NAMES.each do |name|
66
+ @definition[name] ||= { style: :reset, escape_sequence: RESET_SGR }
67
+ end
68
+ end
69
+
70
+ attr_reader :definition
71
+
72
+ def define(name, **values)
73
+ values[:escape_sequence] = format_to_sgr(values.to_a).freeze
74
+ @definition[name] = values
75
+ end
76
+
77
+ def reconfigure
78
+ @definition.each_value do |values|
79
+ values.delete(:escape_sequence)
80
+ values[:escape_sequence] = format_to_sgr(values.to_a).freeze
81
+ end
82
+ end
83
+
84
+ def [](name)
85
+ @definition.dig(name, :escape_sequence) or raise ArgumentError, "unknown face: #{name}"
86
+ end
87
+
88
+ private
89
+
90
+ def sgr_rgb(key, value)
91
+ return nil unless rgb_expression?(value)
92
+ if Reline::Face.truecolor?
93
+ sgr_rgb_truecolor(key, value)
94
+ else
95
+ sgr_rgb_256color(key, value)
96
+ end
97
+ end
98
+
99
+ def sgr_rgb_truecolor(key, value)
100
+ case key
101
+ when :foreground
102
+ "38;2;"
103
+ when :background
104
+ "48;2;"
105
+ end + value[1, 6].scan(/../).map(&:hex).join(";")
106
+ end
107
+
108
+ def sgr_rgb_256color(key, value)
109
+ # 256 colors are
110
+ # 0..15: standard colors, hight intensity colors
111
+ # 16..232: 216 colors (R, G, B each 6 steps)
112
+ # 233..255: grayscale colors (24 steps)
113
+ # This methods converts rgb_expression to 216 colors
114
+ rgb = value[1, 6].scan(/../).map(&:hex)
115
+ # Color steps are [0, 95, 135, 175, 215, 255]
116
+ r, g, b = rgb.map { |v| v <= 95 ? v / 48 : (v - 35) / 40 }
117
+ color = (16 + 36 * r + 6 * g + b)
118
+ case key
119
+ when :foreground
120
+ "38;5;#{color}"
121
+ when :background
122
+ "48;5;#{color}"
123
+ end
124
+ end
125
+
126
+ def format_to_sgr(ordered_values)
127
+ sgr = "\e[" + ordered_values.map do |key_value|
128
+ key, value = key_value
129
+ case key
130
+ when :foreground, :background
131
+ case value
132
+ when Symbol
133
+ SGR_PARAMETERS[key][value]
134
+ when String
135
+ sgr_rgb(key, value)
136
+ end
137
+ when :style
138
+ [ value ].flatten.map do |style_name|
139
+ SGR_PARAMETERS[:style][style_name]
140
+ end.then do |sgr_parameters|
141
+ sgr_parameters.include?(nil) ? nil : sgr_parameters
142
+ end
143
+ end.then do |rendition_expression|
144
+ unless rendition_expression
145
+ raise ArgumentError, "invalid SGR parameter: #{value.inspect}"
146
+ end
147
+ rendition_expression
148
+ end
149
+ end.join(';') + "m"
150
+ sgr == RESET_SGR ? RESET_SGR : RESET_SGR + sgr
151
+ end
152
+
153
+ def rgb_expression?(color)
154
+ color.respond_to?(:match?) and color.match?(/\A#[0-9a-fA-F]{6}\z/)
155
+ end
156
+ end
157
+
158
+ private_constant :SGR_PARAMETERS, :Config
159
+
160
+ def self.truecolor?
161
+ @force_truecolor || %w[truecolor 24bit].include?(ENV['COLORTERM'])
162
+ end
163
+
164
+ def self.force_truecolor
165
+ @force_truecolor = true
166
+ @configs&.each_value(&:reconfigure)
167
+ end
168
+
169
+ def self.[](name)
170
+ @configs[name]
171
+ end
172
+
173
+ def self.config(name, &block)
174
+ @configs ||= {}
175
+ @configs[name] = Config.new(name, &block)
176
+ end
177
+
178
+ def self.configs
179
+ @configs.transform_values(&:definition)
180
+ end
181
+
182
+ def self.load_initial_configs
183
+ config(:default) do |conf|
184
+ conf.define :default, style: :reset
185
+ conf.define :enhanced, style: :reset
186
+ conf.define :scrollbar, style: :reset
187
+ end
188
+ config(:completion_dialog) do |conf|
189
+ conf.define :default, foreground: :bright_white, background: :gray
190
+ conf.define :enhanced, foreground: :black, background: :white
191
+ conf.define :scrollbar, foreground: :white, background: :gray
192
+ end
193
+ end
194
+
195
+ def self.reset_to_initial_configs
196
+ @configs = {}
197
+ load_initial_configs
198
+ end
199
+ end
@@ -1,6 +1,8 @@
1
1
  require 'io/wait'
2
2
 
3
3
  class Reline::GeneralIO
4
+ RESET_COLOR = '' # Do not send color reset sequence
5
+
4
6
  def self.reset(encoding: nil)
5
7
  @@pasting = false
6
8
  if encoding
@@ -44,6 +46,7 @@ class Reline::GeneralIO
44
46
  end
45
47
  c = nil
46
48
  loop do
49
+ Reline.core.line_editor.handle_signal
47
50
  result = @@input.wait_readable(0.1)
48
51
  next if result.nil?
49
52
  c = @@input.read(1)
@@ -57,7 +60,7 @@ class Reline::GeneralIO
57
60
  end
58
61
 
59
62
  def self.get_screen_size
60
- [1, 1]
63
+ [24, 80]
61
64
  end
62
65
 
63
66
  def self.cursor_pos
@@ -100,14 +103,6 @@ class Reline::GeneralIO
100
103
  @@pasting
101
104
  end
102
105
 
103
- def self.start_pasting
104
- @@pasting = true
105
- end
106
-
107
- def self.finish_pasting
108
- @@pasting = false
109
- end
110
-
111
106
  def self.prep
112
107
  end
113
108
 
@@ -62,7 +62,7 @@ class Reline::History < Array
62
62
  private def check_index(index)
63
63
  index += size if index < 0
64
64
  if index < -2147483648 or 2147483647 < index
65
- raise RangeError.new("integer #{index} too big to convert to `int'")
65
+ raise RangeError.new("integer #{index} too big to convert to 'int'")
66
66
  end
67
67
  # If history_size is negative, history size is unlimited.
68
68
  if @config.history_size.positive?
@@ -12,8 +12,4 @@ class Reline::KeyActor::Base
12
12
  def default_key_bindings
13
13
  @default_key_bindings
14
14
  end
15
-
16
- def reset_default_key_bindings
17
- @default_key_bindings.clear
18
- end
19
15
  end