@@ -45,6 +45,7 @@ def self.win?
45
45
end
46
46
47
47
def self . set_default_key_bindings ( config , allow_terminfo : true )
48
+ set_bracketed_paste_key_bindings ( config )
48
49
set_default_key_bindings_ansi_cursor ( config )
49
50
if allow_terminfo && Reline ::Terminfo . enabled?
50
51
set_default_key_bindings_terminfo ( config )
@@ -66,6 +67,12 @@ def self.set_default_key_bindings(config, allow_terminfo: true)
66
67
end
67
68
end
68
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
+
69
76
def self . set_default_key_bindings_ansi_cursor ( config )
70
77
ANSI_CURSOR_KEY_BINDINGS . each do |char , ( default_func , modifiers ) |
71
78
bindings = [ [ "\e [#{ char } " , default_func ] ] # CSI + char
@@ -178,46 +185,26 @@ def self.inner_getc(timeout_second)
178
185
nil
179
186
end
180
187
181
- @@in_bracketed_paste_mode = false
182
- START_BRACKETED_PASTE = String . new ( "\e [200~," , encoding : Encoding ::ASCII_8BIT )
183
- END_BRACKETED_PASTE = String . new ( "\e [200~." , encoding : Encoding ::ASCII_8BIT )
184
- 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
185
191
buffer = String . new ( encoding : Encoding ::ASCII_8BIT )
186
- buffer << inner_getc ( timeout_second )
187
- while START_BRACKETED_PASTE . start_with? ( buffer ) or END_BRACKETED_PASTE . start_with? ( buffer ) do
188
- if START_BRACKETED_PASTE == buffer
189
- @@in_bracketed_paste_mode = true
190
- return inner_getc ( timeout_second )
191
- elsif END_BRACKETED_PASTE == buffer
192
- @@in_bracketed_paste_mode = false
193
- ungetc ( -1 )
194
- return inner_getc ( timeout_second )
195
- end
196
- succ_c = inner_getc ( Reline . core . config . keyseq_timeout )
197
-
198
- if succ_c
199
- buffer << succ_c
200
- else
201
- break
202
- end
192
+ until buffer . end_with? ( END_BRACKETED_PASTE )
193
+ c = inner_getc ( Float ::INFINITY )
194
+ break unless c
195
+ buffer << c
203
196
end
204
- buffer . bytes . reverse_each do |ch |
205
- ungetc ch
206
- end
207
- inner_getc ( timeout_second )
197
+ string = buffer . delete_suffix ( END_BRACKETED_PASTE ) . force_encoding ( encoding )
198
+ string . valid_encoding? ? string : ''
208
199
end
209
200
210
201
# if the usage expects to wait indefinitely, use Float::INFINITY for timeout_second
211
202
def self . getc ( timeout_second )
212
- if Reline . core . config . enable_bracketed_paste
213
- getc_with_bracketed_paste ( timeout_second )
214
- else
215
- inner_getc ( timeout_second )
216
- end
203
+ inner_getc ( timeout_second )
217
204
end
218
205
219
206
def self . in_pasting?
220
- @@in_bracketed_paste_mode or ( not empty_buffer? )
207
+ not empty_buffer?
221
208
end
222
209
223
210
def self . empty_buffer?
@@ -361,11 +348,15 @@ def self.set_winch_handler(&handler)
361
348
end
362
349
363
350
def self . prep
351
+ # Enable bracketed paste
352
+ @@output . write "\e [?2004h" if Reline . core . config . enable_bracketed_paste
364
353
retrieve_keybuffer
365
354
nil
366
355
end
367
356
368
357
def self . deprep ( otio )
358
+ # Disable bracketed paste
359
+ @@output . write "\e [?2004l" if Reline . core . config . enable_bracketed_paste
369
360
Signal . trap ( 'WINCH' , @@old_winch_handler ) if @@old_winch_handler
370
361
end
371
362
end
0 commit comments