Use em_delete
in key_delete
(#504)
* Test existing behavior Typing Ctrl-D ends editing but typing <Del> does not. Also renamed a test that is not testing ed_delete_next_char but key_delete. * Check if line empty first in em_delete By distributivity of AND over OR, we can factor out this condition. This will make the next commit simpler. * Use em_delete in key_delete When the editing mode is emacs, use `em_delete` in `key_delete`. We need to add a condition though to `em_delete`, because it implements both `delete-char` and `end-of-file`. We only want the `end-of-file` behavior is the key is really Ctrl-D. This matches the behavior of the <Del> key with readline, i.e. deleting the next character if there is one, but not moving the cursor, while not finishing the editing if there are no characters.
This commit is contained in:
parent
bb927acd3b
commit
52ff2ce9da
@ -1940,8 +1940,10 @@ class Reline::LineEditor
|
||||
end
|
||||
|
||||
private def key_delete(key)
|
||||
if @config.editing_mode_is?(:vi_insert, :emacs)
|
||||
if @config.editing_mode_is?(:vi_insert)
|
||||
ed_delete_next_char(key)
|
||||
elsif @config.editing_mode_is?(:emacs)
|
||||
em_delete(key)
|
||||
end
|
||||
end
|
||||
|
||||
@ -2647,7 +2649,7 @@ class Reline::LineEditor
|
||||
alias_method :kill_whole_line, :em_kill_line
|
||||
|
||||
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 @line.empty? and (not @is_multiline or @buffer_of_lines.size == 1) and key == "\C-d".ord
|
||||
@line = nil
|
||||
if @buffer_of_lines.size > 1
|
||||
scroll_down(@highest_in_all - @first_line_started_from)
|
||||
|
@ -428,6 +428,12 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase
|
||||
assert_line("き\u3099")
|
||||
end
|
||||
|
||||
def test_em_delete_ends_editing
|
||||
input_keys("\C-d") # quit from inputing
|
||||
assert_line(nil)
|
||||
assert(@line_editor.finished?)
|
||||
end
|
||||
|
||||
def test_ed_clear_screen
|
||||
refute(@line_editor.instance_variable_get(:@cleared))
|
||||
input_keys("\C-l", false)
|
||||
@ -449,7 +455,7 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase
|
||||
assert_line('abc')
|
||||
end
|
||||
|
||||
def test_ed_delete_next_char
|
||||
def test_key_delete
|
||||
input_keys('abc')
|
||||
assert_cursor(3)
|
||||
assert_cursor_max(3)
|
||||
@ -459,6 +465,25 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase
|
||||
assert_line('abc')
|
||||
end
|
||||
|
||||
def test_key_delete_does_not_end_editing
|
||||
@line_editor.input_key(Reline::Key.new(:key_delete, :key_delete, false))
|
||||
assert_cursor(0)
|
||||
assert_cursor_max(0)
|
||||
assert_line('')
|
||||
refute(@line_editor.finished?)
|
||||
end
|
||||
|
||||
def test_key_delete_preserves_cursor
|
||||
input_keys('abc')
|
||||
input_keys("\C-b", false)
|
||||
assert_cursor(2)
|
||||
assert_cursor_max(3)
|
||||
@line_editor.input_key(Reline::Key.new(:key_delete, :key_delete, false))
|
||||
assert_cursor(2)
|
||||
assert_cursor_max(2)
|
||||
assert_line('ab')
|
||||
end
|
||||
|
||||
def test_em_next_word
|
||||
assert_byte_pointer_size('')
|
||||
assert_cursor(0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user