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:
Étienne Barrié 2023-03-24 15:29:46 +01:00 committed by Hiroshi SHIBATA
parent bb927acd3b
commit 52ff2ce9da
No known key found for this signature in database
GPG Key ID: F9CF13417264FAC2
2 changed files with 30 additions and 3 deletions

View File

@ -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)

View File

@ -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)