summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/reline/line_editor.rb14
-rw-r--r--test/reline/test_macro.rb34
2 files changed, 46 insertions, 2 deletions
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
index 3fb4480990..e4acdb967d 100644
--- a/lib/reline/line_editor.rb
+++ b/lib/reline/line_editor.rb
@@ -641,6 +641,10 @@ class Reline::LineEditor
end
end
+ private def argumentable?(method_obj)
+ method_obj and method_obj.parameters.length != 1
+ end
+
private def process_key(key, method_symbol)
if method_symbol and respond_to?(method_symbol, true)
method_obj = method(method_symbol)
@@ -648,14 +652,20 @@ class Reline::LineEditor
method_obj = nil
end
if method_symbol and key.is_a?(Symbol)
- method_obj&.(key, arg: @vi_arg)
+ if @vi_arg and argumentable?(method_obj)
+ run_for_operators(key, method_symbol) do
+ method_obj.(key, arg: @vi_arg)
+ end
+ else
+ method_obj&.(key)
+ end
@kill_ring.process
@vi_arg = nil
elsif @vi_arg
if key.chr =~ /[0-9]/
ed_argument_digit(key)
else
- if ARGUMENTABLE.include?(method_symbol) and method_obj
+ if argumentable?(method_obj)
run_for_operators(key, method_symbol) do
method_obj.(key, arg: @vi_arg)
end
diff --git a/test/reline/test_macro.rb b/test/reline/test_macro.rb
new file mode 100644
index 0000000000..7d92b32cba
--- /dev/null
+++ b/test/reline/test_macro.rb
@@ -0,0 +1,34 @@
+require_relative 'helper'
+
+class Reline::MacroTest < Reline::TestCase
+ def setup
+ @config = Reline::Config.new
+ @line_editor = Reline::LineEditor.new(@config)
+ @line_editor.instance_variable_set(:@screen_size, [24, 80])
+ @line_editor.output = File.open(IO::NULL, "w")
+ end
+
+ def input_key(char, combined_char = char, with_meta = false)
+ @line_editor.input_key(Reline::Key.new(char, combined_char, with_meta))
+ end
+
+ def input(str)
+ str.each_byte {|c| input_key(c)}
+ end
+
+ def test_simple_input
+ input('abc')
+ assert_equal 'abc', @line_editor.line
+ end
+
+ def test_alias
+ class << @line_editor
+ alias delete_char ed_delete_prev_char
+ end
+ input('abc')
+ assert_nothing_raised(ArgumentError) {
+ input_key(:delete_char)
+ }
+ assert_equal 'ab', @line_editor.line
+ end
+end