support other whitespace chars in word movements

This commit is contained in:
Kartik K. Agaram 2022-07-11 18:56:19 -07:00
parent 92e572fc89
commit bc2c14c899
2 changed files with 33 additions and 5 deletions

View File

@ -519,9 +519,7 @@ function Text.word_left(left, right)
Text.left(left, right)
if Cursor1.pos == 1 then break end
assert(Cursor1.pos > 1)
local offset = Text.offset(Lines[Cursor1.line].data, Cursor1.pos)
assert(offset > 1)
if Lines[Cursor1.line].data:sub(offset-1,offset-1) == ' ' then
if Text.match(Lines[Cursor1.line].data, Cursor1.pos-1, '%s') then
break
end
end
@ -531,8 +529,7 @@ function Text.word_right(left, right)
while true do
Text.right_without_scroll()
if Cursor1.pos > utf8.len(Lines[Cursor1.line].data) then break end
local offset = Text.offset(Lines[Cursor1.line].data, Cursor1.pos)
if Lines[Cursor1.line].data:sub(offset,offset) == ' ' then -- TODO: other space characters
if Text.match(Lines[Cursor1.line].data, Cursor1.pos, '%s') then
break
end
end
@ -541,6 +538,15 @@ function Text.word_right(left, right)
end
end
function Text.match(s, pos, pat)
local start_offset = Text.offset(s, pos)
assert(start_offset)
local end_offset = Text.offset(s, pos+1)
assert(end_offset > start_offset)
local curr = s:sub(start_offset, end_offset-1)
return curr:match(pat)
end
function Text.left(left, right)
assert(Lines[Cursor1.line].mode == 'text')
if Cursor1.pos > 1 then

View File

@ -141,6 +141,17 @@ function test_skip_to_previous_word()
check_eq(Cursor1.pos, 1, 'F - test_skip_to_previous_word')
end
function test_skip_past_tab_to_previous_word()
io.write('\ntest_skip_past_tab_to_previous_word')
App.screen.init{width=120, height=60}
Lines = load_array{'abc def\tghi'}
Cursor1 = {line=1, pos=10} -- within third word
Margin_right = 0; Margin_width = Margin_left
App.draw()
App.run_after_keychord('M-left')
check_eq(Cursor1.pos, 9, 'F - test_skip_past_tab_to_previous_word')
end
function test_move_to_start_of_word_on_previous_line()
io.write('\ntest_move_to_start_of_word_on_previous_line')
App.screen.init{width=120, height=60}
@ -175,6 +186,17 @@ function test_skip_to_next_word()
check_eq(Cursor1.pos, 8, 'F - test_skip_to_next_word')
end
function test_skip_past_tab_to_next_word()
io.write('\ntest_skip_past_tab_to_next_word')
App.screen.init{width=120, height=60}
Lines = load_array{'abc\tdef'}
Cursor1 = {line=1, pos=1} -- at the space between words
Margin_right = 0; Margin_width = Margin_left
App.draw()
App.run_after_keychord('M-right')
check_eq(Cursor1.pos, 4, 'F - test_skip_past_tab_to_next_word')
end
function test_move_past_end_of_word_on_next_line()
io.write('\ntest_move_past_end_of_word_on_next_line')
App.screen.init{width=120, height=60}