Skip to content

Commit

Permalink
Use em_delete in key_delete (#504)
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
etiennebarrie authored Mar 24, 2023
1 parent 3aeea2a commit d67cc3d
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 3 deletions.
6 changes: 4 additions & 2 deletions lib/reline/line_editor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1944,8 +1944,10 @@ def finish
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

Expand Down Expand Up @@ -2651,7 +2653,7 @@ def finish
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)
Expand Down
27 changes: 26 additions & 1 deletion test/reline/test_key_actor_emacs.rb
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,12 @@ def test_em_delete_for_mbchar_by_plural_code_points
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)
Expand All @@ -449,7 +455,7 @@ def test_ed_clear_screen_with_inputed
assert_line('abc')
end

def test_ed_delete_next_char
def test_key_delete
input_keys('abc')
assert_cursor(3)
assert_cursor_max(3)
Expand All @@ -459,6 +465,25 @@ def test_ed_delete_next_char
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)
Expand Down

0 comments on commit d67cc3d

Please sign in to comment.