diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2022-07-11 18:56:19 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2022-07-11 18:56:19 -0700 |
commit | bc2c14c89921d255e99778e6c6b2c4f2e755d08f (patch) | |
tree | 01962ffb1dc9c75c21e7a08843f2bc9b168fff43 | |
parent | 92e572fc8966d6f60f90c5c8311b082b84d67ed0 (diff) | |
download | view.love-bc2c14c89921d255e99778e6c6b2c4f2e755d08f.tar.gz |
support other whitespace chars in word movements
-rw-r--r-- | text.lua | 16 | ||||
-rw-r--r-- | text_tests.lua | 22 |
2 files changed, 33 insertions, 5 deletions
diff --git a/text.lua b/text.lua index 561df01..098129d 100644 --- a/text.lua +++ b/text.lua @@ -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 diff --git a/text_tests.lua b/text_tests.lua index a135aa8..1d508bc 100644 --- a/text_tests.lua +++ b/text_tests.lua @@ -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} |