summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authoraycabta <aycabta@gmail.com>2019-05-13 03:26:10 +0900
committeraycabta <aycabta@gmail.com>2019-05-13 03:26:10 +0900
commitcaef2ddaaf4a121272ad5c11d046ff4511c0f560 (patch)
treea3ac7e4263d2eb24b00eedb8d4c18789dfe77c15 /lib
parentc48778d64294c7871e2be09b0138d74e4d9d8551 (diff)
Implement Reline::HISTORY as an expanded Array
Diffstat (limited to 'lib')
-rw-r--r--lib/reline.rb37
-rw-r--r--lib/reline/config.rb2
2 files changed, 38 insertions, 1 deletions
diff --git a/lib/reline.rb b/lib/reline.rb
index 9773f5cb3b..2639021863 100644
--- a/lib/reline.rb
+++ b/lib/reline.rb
@@ -9,7 +9,6 @@ module Reline
extend self
FILENAME_COMPLETION_PROC = nil
USERNAME_COMPLETION_PROC = nil
- HISTORY = Array.new
if RUBY_PLATFORM =~ /mswin|mingw/
IS_WINDOWS = true
@@ -33,6 +32,42 @@ module Reline
@@line_editor = Reline::LineEditor.new(@@config)
@@ambiguous_width = nil
+ HISTORY = Class.new(Array) {
+ def to_s
+ 'HISTORY'
+ end
+
+ def delete_at(index)
+ index = check_index(index)
+ super(index)
+ end
+
+ def [](index)
+ index = check_index(index)
+ super(index)
+ end
+
+ def []=(index, val)
+ index = check_index(index)
+ super(index, String.new(val, encoding: Encoding::default_external))
+ end
+
+ def push(*val)
+ super(*(val.map{ |v| String.new(v, encoding: Encoding::default_external) }))
+ end
+
+ def <<(val)
+ super(String.new(val, encoding: Encoding::default_external))
+ end
+
+ private def check_index(index)
+ index += size if index < 0
+ raise RangeError.new("index=<#{index}>") if index < -@@config.history_size or @@config.history_size < index
+ raise IndexError.new("index=<#{index}>") if index < 0 or size <= index
+ index
+ end
+ }.new
+
@basic_quote_characters = '"\''
# TODO implement below
#@completer_quote_characters
diff --git a/lib/reline/config.rb b/lib/reline/config.rb
index 0a6a92fee2..a140959ca9 100644
--- a/lib/reline/config.rb
+++ b/lib/reline/config.rb
@@ -13,6 +13,7 @@ class Reline::Config
enable-keypad
expand-tilde
history-preserve-point
+ history-size
horizontal-scroll-mode
input-meta
mark-directories
@@ -42,6 +43,7 @@ class Reline::Config
@key_actors[:emacs] = Reline::KeyActor::Emacs.new
@key_actors[:vi_insert] = Reline::KeyActor::ViInsert.new
@key_actors[:vi_command] = Reline::KeyActor::ViCommand.new
+ @history_size = 500
end
def reset