summaryrefslogtreecommitdiff
path: root/lib/reline
diff options
context:
space:
mode:
authoraycabta <aycabta@gmail.com>2020-11-26 19:13:34 +0900
committeraycabta <aycabta@gmail.com>2020-12-05 02:58:59 +0900
commitc2bd5b84d06f5e74afce72e4e4af06d7176453b2 (patch)
tree1dd5c60a940e3132410b2e01e4f2a4b78d458c11 /lib/reline
parent7624f5275713c3dd2d551058355d9a4544c2ef53 (diff)
[ruby/reline] Support bracketed paste mode
https://github.com/ruby/reline/commit/d1a6869322
Diffstat (limited to 'lib/reline')
-rw-r--r--lib/reline/ansi.rb45
-rw-r--r--lib/reline/config.rb1
2 files changed, 44 insertions, 2 deletions
diff --git a/lib/reline/ansi.rb b/lib/reline/ansi.rb
index f11dbb80f4..0b1a7e1745 100644
--- a/lib/reline/ansi.rb
+++ b/lib/reline/ansi.rb
@@ -1,4 +1,5 @@
require 'io/console'
+require 'timeout'
class Reline::ANSI
def self.encoding
@@ -67,7 +68,7 @@ class Reline::ANSI
end
@@buf = []
- def self.getc
+ def self.inner_getc
unless @@buf.empty?
return @@buf.shift
end
@@ -80,8 +81,48 @@ class Reline::ANSI
nil
end
+ @@in_bracketed_paste_mode = false
+ START_BRACKETED_PASTE = String.new("\e[200~,", encoding: Encoding::ASCII_8BIT)
+ END_BRACKETED_PASTE = String.new("\e[200~.", encoding: Encoding::ASCII_8BIT)
+ def self.getc_with_bracketed_paste
+ buffer = String.new(encoding: Encoding::ASCII_8BIT)
+ buffer << inner_getc
+ while START_BRACKETED_PASTE.start_with?(buffer) or END_BRACKETED_PASTE.start_with?(buffer) do
+ if START_BRACKETED_PASTE == buffer
+ @@in_bracketed_paste_mode = true
+ return inner_getc
+ elsif END_BRACKETED_PASTE == buffer
+ @@in_bracketed_paste_mode = false
+ ungetc(-1)
+ return inner_getc
+ end
+ begin
+ succ_c = nil
+ Timeout.timeout(Reline.core.config.keyseq_timeout * 100) {
+ succ_c = inner_getc
+ }
+ rescue Timeout::Error
+ break
+ else
+ buffer << succ_c
+ end
+ end
+ buffer.bytes.reverse_each do |ch|
+ ungetc ch
+ end
+ inner_getc
+ end
+
+ def self.getc
+ if Reline.core.config.enable_bracketed_paste
+ getc_with_bracketed_paste
+ else
+ inner_getc
+ end
+ end
+
def self.in_pasting?
- not Reline::IOGate.empty_buffer?
+ @@in_bracketed_paste_mode or (not Reline::IOGate.empty_buffer?)
end
def self.empty_buffer?
diff --git a/lib/reline/config.rb b/lib/reline/config.rb
index 370d100414..c66810d30e 100644
--- a/lib/reline/config.rb
+++ b/lib/reline/config.rb
@@ -37,6 +37,7 @@ class Reline::Config
vi-cmd-mode-icon
vi-ins-mode-icon
emacs-mode-string
+ enable-bracketed-paste
}
VARIABLE_NAME_SYMBOLS = VARIABLE_NAMES.map { |v| :"#{v.tr(?-, ?_)}" }
VARIABLE_NAME_SYMBOLS.each do |v|