fix cursor bug + fix crash

memory-refactor
Patrick Cleaveliln 2025-07-12 03:49:06 +00:00
parent d28a707a8f
commit cf21773e6f
3 changed files with 39 additions and 13 deletions

View File

@ -88,15 +88,17 @@ file_buffer_end :: proc(buffer: ^FileBuffer) -> Cursor {
iterate_file_buffer :: proc(it: ^FileBufferIter) -> (character: u8, idx: PieceTableIndex, cond: bool) {
character, idx, cond = iterate_piece_table_iter(&it.piter)
it.cursor.index = it.piter.index
it.hit_end = it.piter.hit_end
if cond && !it.hit_end {
if character == '\n' {
it.cursor.col = 0
it.cursor.line += 1
} else {
it.cursor.col += 1
}
it.cursor.index = it.piter.index
it.hit_end = it.piter.hit_end
}
return
}
@ -108,7 +110,7 @@ iterate_file_buffer_reverse :: proc(it: ^FileBufferIter) -> (character: u8, idx:
it.cursor.index = it.piter.index
it.hit_end = it.piter.hit_end
if cond {
if cond && !it.hit_end {
if it.cursor.col > 0 {
it.cursor.col -= 1
} else if it.cursor.line > 0 {

View File

@ -301,12 +301,14 @@ make_grep_panel :: proc(state: ^core.State) -> core.Panel {
free_grep_results(rs_results)
panel_state.selected_result = 0
if len(panel_state.query_results) > 0 {
core.update_glyph_buffer_from_bytes(
&panel_state.glyphs,
transmute([]u8)panel_state.query_results[panel_state.selected_result].file_context,
panel_state.query_results[panel_state.selected_result].line,
)
}
}
core.register_key_action(&input_map.mode[.Normal], .ENTER, proc(state: ^core.State) {
if current_panel, ok := util.get(&state.panels, state.current_panel.? or_else -1).?; ok {

View File

@ -536,6 +536,28 @@ move_to_beginning_of_line_from_start :: proc(t: ^testing.T) {
expect_cursor_index(t, buffer.cursor, 0, 0)
}
@(test)
append_end_of_line :: proc(t: ^testing.T) {
e := new_test_editor()
setup_empty_buffer(&e)
buffer := &e.buffers[0]
run_text_insertion(&e, "hello")
run_input_multiple(&e, press_key(.A), 1)
run_input_multiple(&e, press_key(.ESCAPE), 1)
expect_line_col(t, buffer.cursor, 0, 5)
expect_cursor_index(t, buffer.cursor, 1, 0)
run_input_multiple(&e, press_key(.A), 1)
run_input_multiple(&e, press_key(.ESCAPE), 1)
expect_line_col(t, buffer.cursor, 0, 5)
expect_cursor_index(t, buffer.cursor, 1, 0)
}
@(test)
insert_line_under_current :: proc(t: ^testing.T) {
e := new_test_editor()