@@ -45,6 +45,7 @@ def self.win?
4545 end
4646
4747 def self . set_default_key_bindings ( config , allow_terminfo : true )
48+ set_bracketed_paste_key_bindings ( config )
4849 set_default_key_bindings_ansi_cursor ( config )
4950 if allow_terminfo && Reline ::Terminfo . enabled?
5051 set_default_key_bindings_terminfo ( config )
@@ -66,6 +67,12 @@ def self.set_default_key_bindings(config, allow_terminfo: true)
6667 end
6768 end
6869
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+
6976 def self . set_default_key_bindings_ansi_cursor ( config )
7077 ANSI_CURSOR_KEY_BINDINGS . each do |char , ( default_func , modifiers ) |
7178 bindings = [ [ "\e [#{ char } " , default_func ] ] # CSI + char
@@ -178,46 +185,26 @@ def self.inner_getc(timeout_second)
178185 nil
179186 end
180187
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
185191 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
203196 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 : ''
208199 end
209200
210201 # if the usage expects to wait indefinitely, use Float::INFINITY for timeout_second
211202 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 )
217204 end
218205
219206 def self . in_pasting?
220- @@in_bracketed_paste_mode or ( not empty_buffer? )
207+ not empty_buffer?
221208 end
222209
223210 def self . empty_buffer?
@@ -361,11 +348,15 @@ def self.set_winch_handler(&handler)
361348 end
362349
363350 def self . prep
351+ # Enable bracketed paste
352+ @@output . write "\e [?2004h" if Reline . core . config . enable_bracketed_paste
364353 retrieve_keybuffer
365354 nil
366355 end
367356
368357 def self . deprep ( otio )
358+ # Disable bracketed paste
359+ @@output . write "\e [?2004l" if Reline . core . config . enable_bracketed_paste
369360 Signal . trap ( 'WINCH' , @@old_winch_handler ) if @@old_winch_handler
370361 end
371362end
0 commit comments