Skip to content

Commit d1d4ac6

Browse files
committed
Implement em_set_mark and em_exchange_mark
1 parent f989288 commit d1d4ac6

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed

Diff for: lib/reline/ansi.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ class Reline::ANSI
66
[27, 91, 68] => :ed_prev_char, # ←
77
[27, 91, 51, 126] => :key_delete, # Del
88
[27, 91, 49, 126] => :ed_move_to_beg, # Home
9-
[27, 91, 52, 126] => :ed_move_to_end, # End
9+
[27, 91, 68] => :ed_prev_char, # ←
10+
[27, 32] => :em_set_mark, # M-<space>
11+
[24, 24] => :em_exchange_mark, # C-x C-x TODO also add Windows
1012
}
1113

1214
@@input = STDIN

Diff for: lib/reline/line_editor.rb

+17
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ def eof?
138138

139139
def reset_variables(prompt = '', encoding = Encoding.default_external)
140140
@prompt = prompt
141+
@mark_pointer = nil
141142
@encoding = encoding
142143
@is_multiline = false
143144
@finished = false
@@ -1941,4 +1942,20 @@ def finish
19411942
arg -= 1
19421943
vi_join_lines(key, arg: arg) if arg > 0
19431944
end
1945+
1946+
private def em_set_mark(key)
1947+
@mark_pointer = [@byte_pointer, @line_index]
1948+
end
1949+
alias_method :set_mark, :em_set_mark
1950+
1951+
private def em_exchange_mark(key)
1952+
new_pointer = [@byte_pointer, @line_index]
1953+
@previous_line_index = @line_index
1954+
@byte_pointer, @line_index = @mark_pointer
1955+
@byte_pointer, @line_index = @mark_pointer
1956+
@cursor = calculate_width(@line.byteslice(0, @byte_pointer))
1957+
@cursor_max = calculate_width(@line)
1958+
@mark_pointer = new_pointer
1959+
end
1960+
alias_method :exchange_point_and_mark, :em_exchange_mark
19441961
end

Diff for: test/reline/helper.rb

+4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ class Reline::TestCase < Test::Unit::TestCase
4444
retry
4545
end
4646

47+
def input_key_by_symbol(input)
48+
@line_editor.input_key(Reline::Key.new(input, input, false))
49+
end
50+
4751
def input_keys(input, convert = true)
4852
input = convert_str(input) if convert
4953
input.chars.each do |c|

Diff for: test/reline/test_key_actor_emacs.rb

+32
Original file line numberDiff line numberDiff line change
@@ -1403,6 +1403,38 @@ def test_larger_histories_than_history_size
14031403
@config.history_size = history_size
14041404
end
14051405

1406+
def test_em_set_mark_and_em_exchange_mark
1407+
input_keys('aaa bbb ccc ddd')
1408+
assert_byte_pointer_size('aaa bbb ccc ddd')
1409+
assert_cursor(15)
1410+
assert_cursor_max(15)
1411+
assert_line('aaa bbb ccc ddd')
1412+
input_keys("\C-a\M-F\M-F", false)
1413+
assert_byte_pointer_size('aaa bbb')
1414+
assert_cursor(7)
1415+
assert_cursor_max(15)
1416+
assert_line('aaa bbb ccc ddd')
1417+
assert_equal(nil, @line_editor.instance_variable_get(:@mark_pointer))
1418+
input_keys("\x00", false) # C-Space
1419+
assert_byte_pointer_size('aaa bbb')
1420+
assert_cursor(7)
1421+
assert_cursor_max(15)
1422+
assert_line('aaa bbb ccc ddd')
1423+
assert_equal([7, 0], @line_editor.instance_variable_get(:@mark_pointer))
1424+
input_keys("\C-a", false)
1425+
assert_byte_pointer_size('')
1426+
assert_cursor(0)
1427+
assert_cursor_max(15)
1428+
assert_line('aaa bbb ccc ddd')
1429+
assert_equal([7, 0], @line_editor.instance_variable_get(:@mark_pointer))
1430+
input_key_by_symbol(:em_exchange_mark)
1431+
assert_byte_pointer_size('aaa bbb')
1432+
assert_cursor(7)
1433+
assert_cursor_max(15)
1434+
assert_line('aaa bbb ccc ddd')
1435+
assert_equal([0, 0], @line_editor.instance_variable_get(:@mark_pointer))
1436+
end
1437+
14061438
=begin # TODO: move KeyStroke instance from Reline to LineEditor
14071439
def test_key_delete
14081440
input_keys('ab')

0 commit comments

Comments
 (0)