1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

The delete-char-or-list shows completed list when called at end of line

It doesn't behave the same as the delete-char.
This commit is contained in:
aycabta 2019-12-24 18:32:50 +09:00
parent b03aea62ab
commit 42e2a322f1
3 changed files with 67 additions and 9 deletions

View file

@ -9,7 +9,7 @@ class Reline::KeyActor::Emacs < Reline::KeyActor::Base
# 3 ^C # 3 ^C
:ed_ignore, :ed_ignore,
# 4 ^D # 4 ^D
:em_delete_or_list, :em_delete,
# 5 ^E # 5 ^E
:ed_move_to_end, :ed_move_to_end,
# 6 ^F # 6 ^F

View file

@ -595,14 +595,22 @@ class Reline::LineEditor
[target, preposing, completed, postposing] [target, preposing, completed, postposing]
end end
private def complete(list) private def complete(list, just_show_list = false)
case @completion_state case @completion_state
when CompletionState::NORMAL, CompletionState::JOURNEY when CompletionState::NORMAL, CompletionState::JOURNEY
@completion_state = CompletionState::COMPLETION @completion_state = CompletionState::COMPLETION
when CompletionState::PERFECT_MATCH when CompletionState::PERFECT_MATCH
@dig_perfect_match_proc&.(@perfect_matched) @dig_perfect_match_proc&.(@perfect_matched)
end end
is_menu = (@completion_state == CompletionState::MENU or @completion_state == CompletionState::MENU_WITH_PERFECT_MATCH) if just_show_list
is_menu = true
elsif @completion_state == CompletionState::MENU
is_menu = true
elsif @completion_state == CompletionState::MENU_WITH_PERFECT_MATCH
is_menu = true
else
is_menu = false
end
result = complete_internal_proc(list, is_menu) result = complete_internal_proc(list, is_menu)
if @completion_state == CompletionState::MENU_WITH_PERFECT_MATCH if @completion_state == CompletionState::MENU_WITH_PERFECT_MATCH
@completion_state = CompletionState::PERFECT_MATCH @completion_state = CompletionState::PERFECT_MATCH
@ -621,7 +629,7 @@ class Reline::LineEditor
else else
@completion_state = CompletionState::MENU @completion_state = CompletionState::MENU
end end
if target < completed if not just_show_list and target < completed
@line = preposing + completed + completion_append_character.to_s + postposing @line = preposing + completed + completion_append_character.to_s + postposing
line_to_pointer = preposing + completed + completion_append_character.to_s line_to_pointer = preposing + completed + completion_append_character.to_s
@cursor_max = calculate_width(@line) @cursor_max = calculate_width(@line)
@ -1567,7 +1575,7 @@ class Reline::LineEditor
end end
end end
private def em_delete_or_list(key) private def em_delete(key)
if (not @is_multiline and @line.empty?) or (@is_multiline and @line.empty? and @buffer_of_lines.size == 1) if (not @is_multiline and @line.empty?) or (@is_multiline and @line.empty? and @buffer_of_lines.size == 1)
@line = nil @line = nil
if @buffer_of_lines.size > 1 if @buffer_of_lines.size > 1
@ -1592,7 +1600,20 @@ class Reline::LineEditor
@rest_height += 1 @rest_height += 1
end end
end end
alias_method :delete_char, :em_delete_or_list alias_method :delete_char, :em_delete
private def em_delete_or_list(key)
if @line.empty? or @byte_pointer < @line.bytesize
em_delete(key)
else # show completed list
result = call_completion_proc
if result.is_a?(Array)
completion_occurs = true
complete(result, true)
end
end
end
alias_method :delete_char_or_list, :em_delete_or_list
private def em_yank(key) private def em_yank(key)
yanked = @kill_ring.yank yanked = @kill_ring.yank

View file

@ -372,7 +372,7 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase
assert_line('abcd012ABCa') assert_line('abcd012ABCa')
end end
def test_em_delete_or_list def test_em_delete
input_keys('ab') input_keys('ab')
assert_byte_pointer_size('ab') assert_byte_pointer_size('ab')
assert_cursor(2) assert_cursor(2)
@ -388,7 +388,7 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase
assert_line('b') assert_line('b')
end end
def test_em_delete_or_list_for_mbchar def test_em_delete_for_mbchar
input_keys('かき') input_keys('かき')
assert_byte_pointer_size('かき') assert_byte_pointer_size('かき')
assert_cursor(4) assert_cursor(4)
@ -407,7 +407,7 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase
assert_line('き') assert_line('き')
end end
def test_em_delete_or_list_for_mbchar_by_plural_code_points def test_em_delete_for_mbchar_by_plural_code_points
input_keys("\u3099き\u3099") input_keys("\u3099き\u3099")
assert_byte_pointer_size("\u3099き\u3099") assert_byte_pointer_size("\u3099き\u3099")
assert_cursor(4) assert_cursor(4)
@ -1244,6 +1244,43 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase
assert_line('{}#* AAA!!!CCC ') assert_line('{}#* AAA!!!CCC ')
end end
def test_em_delete_or_list
@line_editor.completion_proc = proc { |word|
%w{
foo_foo
foo_bar
foo_baz
qux
}.map { |i|
i.encode(@encoding)
}
}
input_keys('fooo')
assert_byte_pointer_size('fooo')
assert_cursor(4)
assert_cursor_max(4)
assert_line('fooo')
assert_equal(nil, @line_editor.instance_variable_get(:@menu_info))
input_keys("\C-b", false)
assert_byte_pointer_size('foo')
assert_cursor(3)
assert_cursor_max(4)
assert_line('fooo')
assert_equal(nil, @line_editor.instance_variable_get(:@menu_info))
@line_editor.input_key(Reline::Key.new(:em_delete_or_list, :em_delete_or_list, false))
assert_byte_pointer_size('foo')
assert_cursor(3)
assert_cursor_max(3)
assert_line('foo')
assert_equal(nil, @line_editor.instance_variable_get(:@menu_info))
@line_editor.input_key(Reline::Key.new(:em_delete_or_list, :em_delete_or_list, false))
assert_byte_pointer_size('foo')
assert_cursor(3)
assert_cursor_max(3)
assert_line('foo')
assert_equal(%w{foo_foo foo_bar foo_baz}, @line_editor.instance_variable_get(:@menu_info).list)
end
def test_completion def test_completion
@line_editor.completion_proc = proc { |word| @line_editor.completion_proc = proc { |word|
%w{ %w{