bring back a level of wrapping
[?]
Aug 15, 2022, 5:31 PM
MUJTM6REGQAK3LZTIFWGJRXE2UPCM4HSLXQYSF5ITLXLS6JCVPMQCDependencies
- [2]
MD3W5IRAnew fork: rip out drawing support - [3]
VJ77YABHmore efficient undo/redo - [4]
SPSW74Y5add state arg to Text.keychord_pressed - [5]
FZBXBUFFbugfix: search - [6]
NDHQN23Gdone passing left/right margins everywhere - [7]
LXTTOB33extract a couple of files - [8]
5L7K4GBDclicking to the right of a wrapped line - [9]
5FW7YOFThighlight selection while dragging - [10]
2LC3BM2Nsupport other whitespace chars in word movements - [11]
MDXGMZU2disable all debug prints - [12]
MXA3RZYKdeduce left/right from state where possible - [13]
LAW2O3NWextract variable Margin_left - [14]
ZPUQSPQPextract a few methods - [15]
YT5P6TO6bugfix: save previous file when dropping a new one on - [16]
V3EABA35skip multiple consecutive whitespace - [17]
GJLOKCYKbugfix: clicking past end of screen line - [18]
APYPFFS3call edit rather than App callbacks in tests - [19]
UHB4GARJleft/right margin -> left/right coordinates - [20]
PX3736DXbetter error message - [21]
XNFTJHC4split keyboard handling between Text and Drawing - [22]
IWYLK45Kclicking to the right of a line within line width - [23]
MYC7XR5Qbugfix: lines that aren't drawn from the start - [24]
WPUHAZUCsuperfluous line - [25]
CPZGQT72go through and fix similar issues - [26]
VG75U7IMbugfix: typing should delete highlighted text - [27]
MP2TBKU6bugfix: crash in Text.up() after return - [28]
FYS7TCDWbugfix - [29]
62PZGSUCoptimization: moving cursor to next word - [30]
5ZA3BRNYadd state arg to a few functions - [31]
7EQLPB3Obugfix: don't delete selection when moving cursor - [32]
DHI6IJCNselecting text and deleting selections - [33]
AMOPICKVbugfix: check after cursor on same line when searching upwards - [34]
LSYLEVBDdrop some redundant args when clearing the cache - [35]
BPWFKBXTnew test: dragging and dropping a file on lines.love - [36]
WZFMGVDTswitch to line index in a function - [37]
FHSZYAZ2more precise search highlighting - [38]
4J2L6JMRbugfix: deleting a selection spanning pages - [39]
SPNMXTYRhave file API operate on state object - [40]
F65ADDGLadd state arg to a few functions - [41]
CUIV2LE5some typos - [42]
LNUHQOGHstart passing in Editor_state explicitly - [43]
CIQN2MDEbugfix: typing a capital letter deletes selection - [44]
2ZYV7D3Whandle tab characters - [45]
PFT5Y2ZYmove - [46]
SVJZZDC3snapshot - no, that's all wrong - [47]
S2YQBEYCsnapshot: test for a new regression - [48]
CNCYMM6Amake test initializations a little more obvious - [49]
HGC5RGJPswitch to line index in a function - [50]
HALS7E5Umore clearly skip prints before screen top - [51]
S2MISTTMadd state arg to a few functions - [52]
GN3IF4WFbugfix: pasting newlines - [53]
2RXZ3PGObeginning of a new approach to scroll+wrap - [54]
ZHLO7K3Madd args to some functions - [55]
YTSPVDZHfirst successful pagedown test, first bug found by test - [56]
Z5HLXU4Padd state arg to a few functions - [57]
HTWAM4NZbugfix: scrolling in left/right movements - [58]
EETIR4GXbugfix: skip over drawings when searching - [59]
BOFNXP5Gclicking now moves the cursor even on long, wrapped lines - [60]
O7QH4N4Wspeeding up copy, attempt 1 - [61]
HOSPP2ANcrisp font rendering - [62]
LF7BWEG4group all editor globals - [63]
4WAFGF4Zselection bugfix - [64]
QYIFOHW3first test! - [65]
4VKEE43Zbugfix - [66]
LLAOOMULbugfix: search upwards - [67]
7PZ4CQFVsearch: transparently handle drawings everywhere - [68]
VHQCNMARseveral more modules - [69]
2L5MEZV3experiment: new edit namespace - [70]
QCPXQ2E3add state arg to a few functions - [71]
ILOA5BYFseparate data structure for each line's cache data - [72]
TGHAJBESuse line cache for drawings as well - [73]
MTJEVRJRadd state arg to a few functions - [74]
73OCE2MCafter much struggle, a brute-force undo - [75]
MSOQI3A5bugfix: check before cursor on same line - [76]
HIKLULFQextract a function - [77]
KMRJOSLYbugfix: delete selection before pasting - [78]
V5MJRFOZbugfix: down arrow doesn't scroll up unnecessarily - [79]
DSLD74DKlots more tests - [*]
BULPIBEGbeginnings of a module for the text editor - [*]
CE4LZV4Tdrop last couple of manual tests
Change contents
- replacement in undo.lua at line 60
table.insert(event.lines, State.lines[i])local line = State.lines[i]table.insert(event.lines, {data=line.data}) - replacement in text_tests.lua at line 604
check_eq(Editor_state.lines[1], 'abc', 'F - test_cursor_movement_without_shift_resets_selection/data')check_eq(Editor_state.lines[1].data, 'abc', 'F - test_cursor_movement_without_shift_resets_selection/data') - replacement in text_tests.lua at line 622
check_eq(Editor_state.lines[1], 'xbc', 'F - test_edit_deletes_selection')check_eq(Editor_state.lines[1].data, 'xbc', 'F - test_edit_deletes_selection') - replacement in text_tests.lua at line 645
check_eq(Editor_state.lines[1], 'Dbc', 'F - test_edit_with_shift_key_deletes_selection/data')check_eq(Editor_state.lines[1].data, 'Dbc', 'F - test_edit_with_shift_key_deletes_selection/data') - replacement in text_tests.lua at line 683
check_eq(Editor_state.lines[1], 'bc', 'F - test_cut/data')check_eq(Editor_state.lines[1].data, 'bc', 'F - test_cut/data') - replacement in text_tests.lua at line 704
check_eq(Editor_state.lines[1], 'xyzdef', 'F - test_paste_replaces_selection')check_eq(Editor_state.lines[1].data, 'xyzdef', 'F - test_paste_replaces_selection') - replacement in text_tests.lua at line 730
check_eq(Editor_state.lines[1], 'ahi', 'F - test_deleting_selection_may_scroll/data')check_eq(Editor_state.lines[1].data, 'ahi', 'F - test_deleting_selection_may_scroll/data') - replacement in text_tests.lua at line 796
check_eq(Editor_state.lines[1], '', 'F - test_insert_newline_at_start_of_line/data:1')check_eq(Editor_state.lines[2], 'abc', 'F - test_insert_newline_at_start_of_line/data:2')check_eq(Editor_state.lines[1].data, '', 'F - test_insert_newline_at_start_of_line/data:1')check_eq(Editor_state.lines[2].data, 'abc', 'F - test_insert_newline_at_start_of_line/data:2') - replacement in text_tests.lua at line 1761
check_eq(Editor_state.lines[1], 'abcdef', "F - test_backspace_past_line_boundary")check_eq(Editor_state.lines[1].data, 'abcdef', "F - test_backspace_past_line_boundary") - replacement in text_tests.lua at line 1778
check_eq(Editor_state.lines[1], 'bc', "F - test_backspace_over_selection/data")check_eq(Editor_state.lines[1].data, 'bc', "F - test_backspace_over_selection/data") - replacement in text_tests.lua at line 1797
check_eq(Editor_state.lines[1], 'bc', "F - test_backspace_over_selection_reverse/data")check_eq(Editor_state.lines[1].data, 'bc', "F - test_backspace_over_selection_reverse/data") - replacement in text_tests.lua at line 1816
check_eq(Editor_state.lines[1], 'akl', "F - test_backspace_over_multiple_lines/data:1")check_eq(Editor_state.lines[2], 'mno', "F - test_backspace_over_multiple_lines/data:2")check_eq(Editor_state.lines[1].data, 'akl', "F - test_backspace_over_multiple_lines/data:1")check_eq(Editor_state.lines[2].data, 'mno', "F - test_backspace_over_multiple_lines/data:2") - replacement in text_tests.lua at line 1836
check_eq(Editor_state.lines[1], 'a', "F - test_backspace_to_start_of_line/data:1")check_eq(Editor_state.lines[2], 'def', "F - test_backspace_to_start_of_line/data:2")check_eq(Editor_state.lines[1].data, 'a', "F - test_backspace_to_start_of_line/data:1")check_eq(Editor_state.lines[2].data, 'def', "F - test_backspace_to_start_of_line/data:2") - replacement in text_tests.lua at line 1856
check_eq(Editor_state.lines[1], 'abc', "F - test_backspace_to_start_of_line/data:1")check_eq(Editor_state.lines[2], 'f', "F - test_backspace_to_start_of_line/data:2")check_eq(Editor_state.lines[1].data, 'abc', "F - test_backspace_to_start_of_line/data:1")check_eq(Editor_state.lines[2].data, 'f', "F - test_backspace_to_start_of_line/data:2") - replacement in text_tests.lua at line 1953
check_eq(Editor_state.lines[1], 'xbc', 'F - test_undo_restores_selection/baseline')check_eq(Editor_state.lines[1].data, 'xbc', 'F - test_undo_restores_selection/baseline') - replacement in text.lua at line 53
if State.lines[State.cursor1.line]:sub(State.cursor1.pos, State.cursor1.pos+utf8.len(State.search_term)-1) == State.search_term thenif State.lines[State.cursor1.line].data:sub(State.cursor1.pos, State.cursor1.pos+utf8.len(State.search_term)-1) == State.search_term then - replacement in text.lua at line 95
for frag in line:gmatch('%S*%s*') dofor frag in line.data:gmatch('%S*%s*') do - replacement in text.lua at line 145
local byte_offset = Text.offset(State.lines[State.cursor1.line], State.cursor1.pos)State.lines[State.cursor1.line] = string.sub(State.lines[State.cursor1.line], 1, byte_offset-1)..t..string.sub(State.lines[State.cursor1.line], byte_offset)local byte_offset = Text.offset(State.lines[State.cursor1.line].data, State.cursor1.pos)State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_offset-1)..t..string.sub(State.lines[State.cursor1.line].data, byte_offset) - replacement in text.lua at line 185
local byte_start = utf8.offset(State.lines[State.cursor1.line], State.cursor1.pos-1)local byte_end = utf8.offset(State.lines[State.cursor1.line], State.cursor1.pos)local byte_start = utf8.offset(State.lines[State.cursor1.line].data, State.cursor1.pos-1)local byte_end = utf8.offset(State.lines[State.cursor1.line].data, State.cursor1.pos) - replacement in text.lua at line 189
State.lines[State.cursor1.line] = string.sub(State.lines[State.cursor1.line], 1, byte_start-1)..string.sub(State.lines[State.cursor1.line], byte_end)State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_start-1)..string.sub(State.lines[State.cursor1.line].data, byte_end) - replacement in text.lua at line 191
State.lines[State.cursor1.line] = string.sub(State.lines[State.cursor1.line], 1, byte_start-1)State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_start-1) - replacement in text.lua at line 198
State.cursor1.pos = utf8.len(State.lines[State.cursor1.line-1])+1State.lines[State.cursor1.line-1] = State.lines[State.cursor1.line-1]..State.lines[State.cursor1.line]State.cursor1.pos = utf8.len(State.lines[State.cursor1.line-1].data)+1State.lines[State.cursor1.line-1].data = State.lines[State.cursor1.line-1].data..State.lines[State.cursor1.line].data - replacement in text.lua at line 225
if State.cursor1.pos <= utf8.len(State.lines[State.cursor1.line]) thenif State.cursor1.pos <= utf8.len(State.lines[State.cursor1.line].data) then - replacement in text.lua at line 230
if State.cursor1.pos <= utf8.len(State.lines[State.cursor1.line]) thenlocal byte_start = utf8.offset(State.lines[State.cursor1.line], State.cursor1.pos)local byte_end = utf8.offset(State.lines[State.cursor1.line], State.cursor1.pos+1)if State.cursor1.pos <= utf8.len(State.lines[State.cursor1.line].data) thenlocal byte_start = utf8.offset(State.lines[State.cursor1.line].data, State.cursor1.pos)local byte_end = utf8.offset(State.lines[State.cursor1.line].data, State.cursor1.pos+1) - replacement in text.lua at line 235
State.lines[State.cursor1.line] = string.sub(State.lines[State.cursor1.line], 1, byte_start-1)..string.sub(State.lines[State.cursor1.line], byte_end)State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_start-1)..string.sub(State.lines[State.cursor1.line].data, byte_end) - replacement in text.lua at line 237
State.lines[State.cursor1.line] = string.sub(State.lines[State.cursor1.line], 1, byte_start-1)State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_start-1) - replacement in text.lua at line 243
State.lines[State.cursor1.line] = State.lines[State.cursor1.line]..State.lines[State.cursor1.line+1]State.lines[State.cursor1.line].data = State.lines[State.cursor1.line].data..State.lines[State.cursor1.line+1].data - replacement in text.lua at line 336
local byte_offset = Text.offset(State.lines[State.cursor1.line], State.cursor1.pos)table.insert(State.lines, State.cursor1.line+1, string.sub(State.lines[State.cursor1.line], byte_offset))local byte_offset = Text.offset(State.lines[State.cursor1.line].data, State.cursor1.pos)table.insert(State.lines, State.cursor1.line+1, {data=string.sub(State.lines[State.cursor1.line].data, byte_offset)}) - replacement in text.lua at line 339
State.lines[State.cursor1.line] = string.sub(State.lines[State.cursor1.line], 1, byte_offset-1)State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_offset-1) - replacement in text.lua at line 412
local screen_line_starting_byte_offset = Text.offset(State.lines[State.cursor1.line], screen_line_starting_pos)local s = string.sub(State.lines[State.cursor1.line], screen_line_starting_byte_offset)local screen_line_starting_byte_offset = Text.offset(State.lines[State.cursor1.line].data, screen_line_starting_pos)local s = string.sub(State.lines[State.cursor1.line].data, screen_line_starting_byte_offset) - replacement in text.lua at line 429
local new_screen_line_starting_byte_offset = Text.offset(State.lines[State.cursor1.line], new_screen_line_starting_pos)local s = string.sub(State.lines[State.cursor1.line], new_screen_line_starting_byte_offset)local new_screen_line_starting_byte_offset = Text.offset(State.lines[State.cursor1.line].data, new_screen_line_starting_pos)local s = string.sub(State.lines[State.cursor1.line].data, new_screen_line_starting_byte_offset) - replacement in text.lua at line 444
State.cursor1.pos = Text.nearest_cursor_pos(State.lines[State.cursor1.line], State.cursor_x, State.left)State.cursor1.pos = Text.nearest_cursor_pos(State.lines[State.cursor1.line].data, State.cursor_x, State.left) - replacement in text.lua at line 463
local new_screen_line_starting_byte_offset = Text.offset(State.lines[State.cursor1.line], new_screen_line_starting_pos)local s = string.sub(State.lines[State.cursor1.line], new_screen_line_starting_byte_offset)local new_screen_line_starting_byte_offset = Text.offset(State.lines[State.cursor1.line].data, new_screen_line_starting_pos)local s = string.sub(State.lines[State.cursor1.line].data, new_screen_line_starting_byte_offset) - replacement in text.lua at line 484
State.cursor1.pos = utf8.len(State.lines[State.cursor1.line]) + 1State.cursor1.pos = utf8.len(State.lines[State.cursor1.line].data) + 1 - replacement in text.lua at line 498
if Text.match(State.lines[State.cursor1.line], State.cursor1.pos-1, '%S') thenif Text.match(State.lines[State.cursor1.line].data, State.cursor1.pos-1, '%S') then - replacement in text.lua at line 510
if Text.match(State.lines[State.cursor1.line], State.cursor1.pos-1, '%s') thenif Text.match(State.lines[State.cursor1.line].data, State.cursor1.pos-1, '%s') then - replacement in text.lua at line 519
if State.cursor1.pos > utf8.len(State.lines[State.cursor1.line]) thenif State.cursor1.pos > utf8.len(State.lines[State.cursor1.line].data) then - replacement in text.lua at line 522
if Text.match(State.lines[State.cursor1.line], State.cursor1.pos, '%S') thenif Text.match(State.lines[State.cursor1.line].data, State.cursor1.pos, '%S') then - replacement in text.lua at line 529
if State.cursor1.pos > utf8.len(State.lines[State.cursor1.line]) thenif State.cursor1.pos > utf8.len(State.lines[State.cursor1.line].data) then - replacement in text.lua at line 532
if Text.match(State.lines[State.cursor1.line], State.cursor1.pos, '%s') thenif Text.match(State.lines[State.cursor1.line].data, State.cursor1.pos, '%s') then - replacement in text.lua at line 555
State.cursor1.pos = utf8.len(State.lines[State.cursor1.line]) + 1State.cursor1.pos = utf8.len(State.lines[State.cursor1.line].data) + 1 - replacement in text.lua at line 572
if State.cursor1.pos <= utf8.len(State.lines[State.cursor1.line]) thenif State.cursor1.pos <= utf8.len(State.lines[State.cursor1.line].data) then - replacement in text.lua at line 650
local screen_line_starting_byte_offset = Text.offset(line, screen_line_starting_pos)--? print('iter', y, screen_line_index, screen_line_starting_pos, string.sub(line, screen_line_starting_byte_offset))local screen_line_starting_byte_offset = Text.offset(line.data, screen_line_starting_pos)--? print('iter', y, screen_line_index, screen_line_starting_pos, string.sub(line.data, screen_line_starting_byte_offset)) - replacement in text.lua at line 661
local s = string.sub(line, screen_line_starting_byte_offset)local s = string.sub(line.data, screen_line_starting_byte_offset) - replacement in text.lua at line 674
local start_offset = Text.offset(line, start_pos)local start_offset = Text.offset(line.data, start_pos) - replacement in text.lua at line 678
local past_end_offset = Text.offset(line, past_end_pos)screen_line = string.sub(line, start_offset, past_end_offset-1)local past_end_offset = Text.offset(line.data, past_end_pos)screen_line = string.sub(line.data, start_offset, past_end_offset-1) - replacement in text.lua at line 681
screen_line = string.sub(line, start_pos)screen_line = string.sub(line.data, start_pos) - replacement in select.lua at line 56
local lo_offset = Text.offset(line, lo)local hi_offset = Text.offset(line, hi)local pos_offset = Text.offset(line, pos)local lo_offset = Text.offset(line.data, lo)local hi_offset = Text.offset(line.data, hi)local pos_offset = Text.offset(line.data, pos) - replacement in select.lua at line 63
local before = line:sub(pos_offset, lo_offset-1)local before = line.data:sub(pos_offset, lo_offset-1) - replacement in select.lua at line 68
local s = line:sub(lo_offset, hi_offset-1)local s = line.data:sub(lo_offset, hi_offset-1) - replacement in select.lua at line 139
local min_offset = Text.offset(State.lines[minl], minp)local max_offset = Text.offset(State.lines[maxl], maxp)local min_offset = Text.offset(State.lines[minl].data, minp)local max_offset = Text.offset(State.lines[maxl].data, maxp) - replacement in select.lua at line 143
State.lines[minl] = State.lines[minl]:sub(1, min_offset-1)..State.lines[minl]:sub(max_offset)State.lines[minl].data = State.lines[minl].data:sub(1, min_offset-1)..State.lines[minl].data:sub(max_offset) - replacement in select.lua at line 147
local rhs = State.lines[maxl]:sub(max_offset)local rhs = State.lines[maxl].data:sub(max_offset) - replacement in select.lua at line 152
State.lines[minl] = State.lines[minl]:sub(1, min_offset-1)..rhsState.lines[minl].data = State.lines[minl].data:sub(1, min_offset-1)..rhs - replacement in select.lua at line 168
local min_offset = Text.offset(State.lines[minl], minp)local max_offset = Text.offset(State.lines[maxl], maxp)local min_offset = Text.offset(State.lines[minl].data, minp)local max_offset = Text.offset(State.lines[maxl].data, maxp) - replacement in select.lua at line 171
return State.lines[minl]:sub(min_offset, max_offset-1)return State.lines[minl].data:sub(min_offset, max_offset-1) - replacement in select.lua at line 174
local result = {State.lines[minl]:sub(min_offset)}local result = {State.lines[minl].data:sub(min_offset)} - replacement in select.lua at line 176
table.insert(result, State.lines[i])table.insert(result, State.lines[i].data) - replacement in select.lua at line 178
table.insert(result, State.lines[maxl]:sub(1, max_offset-1))table.insert(result, State.lines[maxl].data:sub(1, max_offset-1)) - replacement in search.lua at line 24
local pos = find(State.lines[State.cursor1.line], State.search_term, State.cursor1.pos)local pos = find(State.lines[State.cursor1.line].data, State.search_term, State.cursor1.pos) - replacement in search.lua at line 31
pos = find(State.lines[i], State.search_term)pos = find(State.lines[i].data, State.search_term) - replacement in search.lua at line 42
pos = find(State.lines[i], State.search_term)pos = find(State.lines[i].data, State.search_term) - replacement in search.lua at line 52
pos = find(State.lines[State.cursor1.line], State.search_term)pos = find(State.lines[State.cursor1.line].data, State.search_term) - replacement in search.lua at line 72
local pos = rfind(State.lines[State.cursor1.line], State.search_term, State.cursor1.pos-1)local pos = rfind(State.lines[State.cursor1.line].data, State.search_term, State.cursor1.pos-1) - replacement in search.lua at line 79
pos = rfind(State.lines[i], State.search_term)pos = rfind(State.lines[i].data, State.search_term) - replacement in search.lua at line 90
pos = rfind(State.lines[i], State.search_term)pos = rfind(State.lines[i].data, State.search_term) - replacement in search.lua at line 100
pos = rfind(State.lines[State.cursor1.line], State.search_term)pos = rfind(State.lines[State.cursor1.line].data, State.search_term) - replacement in main_tests.lua at line 41
check_eq(Editor_state.lines[1], 'abc', 'F - test_drop_file/lines:1')check_eq(Editor_state.lines[2], 'def', 'F - test_drop_file/lines:2')check_eq(Editor_state.lines[3], 'ghi', 'F - test_drop_file/lines:3')check_eq(Editor_state.lines[1].data, 'abc', 'F - test_drop_file/lines:1')check_eq(Editor_state.lines[2].data, 'def', 'F - test_drop_file/lines:2')check_eq(Editor_state.lines[3].data, 'ghi', 'F - test_drop_file/lines:3') - replacement in file.lua at line 15
table.insert(result, line)table.insert(result, {data=line}) - replacement in file.lua at line 19
table.insert(result, '')table.insert(result, {data=''}) - replacement in file.lua at line 30
outfile:write(line, '\n')outfile:write(line.data, '\n') - replacement in file.lua at line 43
table.insert(result, line)table.insert(result, {data=line}) - replacement in file.lua at line 46
table.insert(result, '')table.insert(result, {data=''}) - replacement in edit.lua at line 21
lines = {''}, -- array of stringslines = {{data=''}}, -- array of strings - replacement in edit.lua at line 109
--? print('screen bottom: '..tostring(State.screen_bottom1.pos)..' in '..tostring(State.lines[State.screen_bottom1.line]))--? print('screen bottom: '..tostring(State.screen_bottom1.pos)..' in '..tostring(State.lines[State.screen_bottom1.line].data))