persist cursor column
parent
6b1167a0ac
commit
705606e92a
|
@ -47,6 +47,7 @@ FileBuffer :: struct {
|
||||||
extension: string,
|
extension: string,
|
||||||
|
|
||||||
flags: BufferFlagSet,
|
flags: BufferFlagSet,
|
||||||
|
last_col: int,
|
||||||
top_line: int,
|
top_line: int,
|
||||||
selection: Maybe(Selection),
|
selection: Maybe(Selection),
|
||||||
|
|
||||||
|
@ -423,6 +424,8 @@ move_cursor_start_of_line :: proc(buffer: ^FileBuffer, cursor: Maybe(^Cursor) =
|
||||||
|
|
||||||
cursor.?^ = it.cursor;
|
cursor.?^ = it.cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buffer.last_col = cursor.?.col
|
||||||
}
|
}
|
||||||
|
|
||||||
move_cursor_end_of_line :: proc(buffer: ^FileBuffer, stop_at_end: bool = true, cursor: Maybe(^Cursor) = nil) {
|
move_cursor_end_of_line :: proc(buffer: ^FileBuffer, stop_at_end: bool = true, cursor: Maybe(^Cursor) = nil) {
|
||||||
|
@ -432,6 +435,8 @@ move_cursor_end_of_line :: proc(buffer: ^FileBuffer, stop_at_end: bool = true, c
|
||||||
cursor = &buffer.history.cursor;
|
cursor = &buffer.history.cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buffer.last_col = cursor.?.col
|
||||||
|
|
||||||
it := new_file_buffer_iter_with_cursor(buffer, cursor.?^);
|
it := new_file_buffer_iter_with_cursor(buffer, cursor.?^);
|
||||||
line_length := file_buffer_line_length(buffer, it.cursor.index);
|
line_length := file_buffer_line_length(buffer, it.cursor.index);
|
||||||
if stop_at_end {
|
if stop_at_end {
|
||||||
|
@ -447,6 +452,8 @@ move_cursor_end_of_line :: proc(buffer: ^FileBuffer, stop_at_end: bool = true, c
|
||||||
|
|
||||||
cursor.?^ = it.cursor;
|
cursor.?^ = it.cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buffer.last_col = cursor.?.col
|
||||||
}
|
}
|
||||||
|
|
||||||
move_cursor_up :: proc(buffer: ^FileBuffer, amount: int = 1, cursor: Maybe(^Cursor) = nil) {
|
move_cursor_up :: proc(buffer: ^FileBuffer, amount: int = 1, cursor: Maybe(^Cursor) = nil) {
|
||||||
|
@ -480,6 +487,12 @@ move_cursor_up :: proc(buffer: ^FileBuffer, amount: int = 1, cursor: Maybe(^Curs
|
||||||
cursor.?^ = it.cursor;
|
cursor.?^ = it.cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cursor.?.col < buffer.last_col && file_buffer_line_length(buffer, cursor.?.index)-1 >= cursor.?.col {
|
||||||
|
last_col := buffer.last_col
|
||||||
|
move_cursor_right(buffer, amt = buffer.last_col - cursor.?.col, cursor = cursor)
|
||||||
|
buffer.last_col = last_col
|
||||||
|
}
|
||||||
|
|
||||||
update_file_buffer_scroll(buffer, cursor);
|
update_file_buffer_scroll(buffer, cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -513,6 +526,13 @@ move_cursor_down :: proc(buffer: ^FileBuffer, amount: int = 1, cursor: Maybe(^Cu
|
||||||
}
|
}
|
||||||
|
|
||||||
cursor.?^ = it.cursor;
|
cursor.?^ = it.cursor;
|
||||||
|
|
||||||
|
if cursor.?.col < buffer.last_col && file_buffer_line_length(buffer, cursor.?.index)-1 >= cursor.?.col {
|
||||||
|
last_col := buffer.last_col
|
||||||
|
move_cursor_right(buffer, amt = buffer.last_col - cursor.?.col, cursor = cursor)
|
||||||
|
buffer.last_col = last_col
|
||||||
|
}
|
||||||
|
|
||||||
update_file_buffer_scroll(buffer, cursor);
|
update_file_buffer_scroll(buffer, cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -523,6 +543,8 @@ move_cursor_left :: proc(buffer: ^FileBuffer, cursor: Maybe(^Cursor) = nil) {
|
||||||
cursor = &buffer.history.cursor;
|
cursor = &buffer.history.cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buffer.last_col = cursor.?.col
|
||||||
|
|
||||||
if cursor.?.col > 0 {
|
if cursor.?.col > 0 {
|
||||||
it := new_file_buffer_iter_with_cursor(buffer, cursor.?^);
|
it := new_file_buffer_iter_with_cursor(buffer, cursor.?^);
|
||||||
iterate_file_buffer_reverse(&it);
|
iterate_file_buffer_reverse(&it);
|
||||||
|
@ -537,6 +559,8 @@ move_cursor_right :: proc(buffer: ^FileBuffer, stop_at_end: bool = true, amt: in
|
||||||
cursor = &buffer.history.cursor;
|
cursor = &buffer.history.cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buffer.last_col = cursor.?.col
|
||||||
|
|
||||||
it := new_file_buffer_iter_with_cursor(buffer, cursor.?^);
|
it := new_file_buffer_iter_with_cursor(buffer, cursor.?^);
|
||||||
line_length := file_buffer_line_length(buffer, it.cursor.index);
|
line_length := file_buffer_line_length(buffer, it.cursor.index);
|
||||||
|
|
||||||
|
@ -559,6 +583,8 @@ move_cursor_forward_start_of_word :: proc(buffer: ^FileBuffer, cursor: Maybe(^Cu
|
||||||
iterate_file_buffer_until(&it, until_start_of_word);
|
iterate_file_buffer_until(&it, until_start_of_word);
|
||||||
cursor.?^ = it.cursor;
|
cursor.?^ = it.cursor;
|
||||||
|
|
||||||
|
buffer.last_col = cursor.?.col
|
||||||
|
|
||||||
update_file_buffer_scroll(buffer, cursor);
|
update_file_buffer_scroll(buffer, cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -573,6 +599,8 @@ move_cursor_forward_end_of_word :: proc(buffer: ^FileBuffer, cursor: Maybe(^Curs
|
||||||
iterate_file_buffer_until(&it, until_end_of_word);
|
iterate_file_buffer_until(&it, until_end_of_word);
|
||||||
cursor.?^ = it.cursor;
|
cursor.?^ = it.cursor;
|
||||||
|
|
||||||
|
buffer.last_col = cursor.?.col
|
||||||
|
|
||||||
update_file_buffer_scroll(buffer, cursor);
|
update_file_buffer_scroll(buffer, cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -588,6 +616,8 @@ move_cursor_backward_start_of_word :: proc(buffer: ^FileBuffer, cursor: Maybe(^C
|
||||||
//iterate_file_buffer_until(&it, until_non_whitespace);
|
//iterate_file_buffer_until(&it, until_non_whitespace);
|
||||||
cursor.?^ = it.cursor;
|
cursor.?^ = it.cursor;
|
||||||
|
|
||||||
|
buffer.last_col = cursor.?.col
|
||||||
|
|
||||||
update_file_buffer_scroll(buffer, cursor);
|
update_file_buffer_scroll(buffer, cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -602,6 +632,8 @@ move_cursor_backward_end_of_word :: proc(buffer: ^FileBuffer, cursor: Maybe(^Cur
|
||||||
iterate_file_buffer_until_reverse(&it, until_start_of_word);
|
iterate_file_buffer_until_reverse(&it, until_start_of_word);
|
||||||
cursor.?^ = it.cursor;
|
cursor.?^ = it.cursor;
|
||||||
|
|
||||||
|
buffer.last_col = cursor.?.col
|
||||||
|
|
||||||
update_file_buffer_scroll(buffer, cursor);
|
update_file_buffer_scroll(buffer, cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,24 @@ draw :: proc(state: ^State) {
|
||||||
for i in 0..<len(state.panels.data) {
|
for i in 0..<len(state.panels.data) {
|
||||||
if panel, ok := util.get(&state.panels, i).?; ok {
|
if panel, ok := util.get(&state.panels, i).?; ok {
|
||||||
if panel.render != nil {
|
if panel.render != nil {
|
||||||
panel->render(state)
|
|
||||||
|
background_color: theme.PaletteColor = .Background1 if panel.id == state.current_panel else .Background2
|
||||||
|
|
||||||
|
ui.open_element(new_ui, nil,
|
||||||
|
{
|
||||||
|
dir = .LeftToRight,
|
||||||
|
kind = {ui.Grow{}, ui.Grow{}},
|
||||||
|
},
|
||||||
|
style = {
|
||||||
|
border = {.Left, .Right, .Top, .Bottom },
|
||||||
|
border_color = .Green,
|
||||||
|
background_color = background_color,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
{
|
||||||
|
panel->render(state)
|
||||||
|
}
|
||||||
|
ui.close_element(new_ui)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ make_file_buffer_panel :: proc(file_path: string, line: int = 0, col: int = 0) -
|
||||||
|
|
||||||
leader_actions := core.new_input_actions()
|
leader_actions := core.new_input_actions()
|
||||||
register_default_leader_actions(&leader_actions);
|
register_default_leader_actions(&leader_actions);
|
||||||
|
file_buffer_leader_actions(&leader_actions);
|
||||||
core.register_key_action(&panel.input_map.mode[.Normal], .SPACE, leader_actions, "leader commands");
|
core.register_key_action(&panel.input_map.mode[.Normal], .SPACE, leader_actions, "leader commands");
|
||||||
|
|
||||||
core.register_ctrl_key_action(&panel.input_map.mode[.Normal], .W, core.new_input_actions(), "Panel Navigation")
|
core.register_ctrl_key_action(&panel.input_map.mode[.Normal], .W, core.new_input_actions(), "Panel Navigation")
|
||||||
|
@ -88,11 +89,6 @@ render_file_buffer :: proc(state: ^core.State, s: ^ui.State, buffer: ^core.FileB
|
||||||
dir = .TopToBottom,
|
dir = .TopToBottom,
|
||||||
kind = {ui.Grow{}, ui.Grow{}},
|
kind = {ui.Grow{}, ui.Grow{}},
|
||||||
},
|
},
|
||||||
style = {
|
|
||||||
border = {.Left, .Right, .Top, .Bottom},
|
|
||||||
border_color = .Background4,
|
|
||||||
background_color = .Background1,
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ui.open_element(s,
|
ui.open_element(s,
|
||||||
|
@ -100,11 +96,6 @@ render_file_buffer :: proc(state: ^core.State, s: ^ui.State, buffer: ^core.FileB
|
||||||
{
|
{
|
||||||
kind = {ui.Grow{}, ui.Grow{}}
|
kind = {ui.Grow{}, ui.Grow{}}
|
||||||
},
|
},
|
||||||
style = {
|
|
||||||
border = {.Left, .Right, .Top, .Bottom},
|
|
||||||
border_color = .Background4,
|
|
||||||
background_color = .Background1,
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
ui.close_element(s)
|
ui.close_element(s)
|
||||||
|
|
||||||
|
@ -114,6 +105,7 @@ render_file_buffer :: proc(state: ^core.State, s: ^ui.State, buffer: ^core.FileB
|
||||||
style = {
|
style = {
|
||||||
border = {.Left, .Right, .Top, .Bottom},
|
border = {.Left, .Right, .Top, .Bottom},
|
||||||
border_color = .Background4,
|
border_color = .Background4,
|
||||||
|
background_color = .Background1,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -132,12 +124,13 @@ render_file_buffer :: proc(state: ^core.State, s: ^ui.State, buffer: ^core.FileB
|
||||||
ui.open_element(
|
ui.open_element(
|
||||||
s,
|
s,
|
||||||
fmt.tprintf(
|
fmt.tprintf(
|
||||||
"%v:%v - Slice %v:%v - Char: %v",
|
"%v:%v - Slice %v:%v - Char: %v - Last Col: %v",
|
||||||
buffer.history.cursor.line + 1,
|
buffer.history.cursor.line + 1,
|
||||||
buffer.history.cursor.col + 1,
|
buffer.history.cursor.col + 1,
|
||||||
buffer.history.cursor.index.chunk_index,
|
buffer.history.cursor.index.chunk_index,
|
||||||
buffer.history.cursor.index.char_index,
|
buffer.history.cursor.index.char_index,
|
||||||
core.get_character_at_iter(it)
|
core.get_character_at_iter(it),
|
||||||
|
buffer.last_col,
|
||||||
),
|
),
|
||||||
{}
|
{}
|
||||||
)
|
)
|
||||||
|
@ -148,6 +141,17 @@ render_file_buffer :: proc(state: ^core.State, s: ^ui.State, buffer: ^core.FileB
|
||||||
ui.close_element(s)
|
ui.close_element(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file_buffer_leader_actions :: proc(input_map: ^core.InputActions) {
|
||||||
|
core.register_key_action(input_map, .K, proc(state: ^core.State, user_data: rawptr) {
|
||||||
|
buffer := &(&(transmute(^core.Panel)user_data).type.(core.FileBufferPanel)).buffer
|
||||||
|
|
||||||
|
ts.update_cursor(&buffer.tree, buffer.history.cursor.line, buffer.history.cursor.col)
|
||||||
|
ts.print_node_type(&buffer.tree)
|
||||||
|
|
||||||
|
core.reset_input_map(state)
|
||||||
|
}, "View Symbol")
|
||||||
|
}
|
||||||
|
|
||||||
file_buffer_go_actions :: proc(input_map: ^core.InputActions) {
|
file_buffer_go_actions :: proc(input_map: ^core.InputActions) {
|
||||||
core.register_key_action(input_map, .H, proc(state: ^core.State, user_data: rawptr) {
|
core.register_key_action(input_map, .H, proc(state: ^core.State, user_data: rawptr) {
|
||||||
buffer := &(&(transmute(^core.Panel)user_data).type.(core.FileBufferPanel)).buffer
|
buffer := &(&(transmute(^core.Panel)user_data).type.(core.FileBufferPanel)).buffer
|
||||||
|
|
|
@ -69,6 +69,9 @@ make_grep_panel :: proc() -> core.Panel {
|
||||||
panel_state.glyphs = core.make_glyph_buffer(256,256)
|
panel_state.glyphs = core.make_glyph_buffer(256,256)
|
||||||
panel_state.buffer = core.new_virtual_file_buffer()
|
panel_state.buffer = core.new_virtual_file_buffer()
|
||||||
|
|
||||||
|
core.register_ctrl_key_action(&panel.input_map.mode[.Normal], .W, core.new_input_actions(), "Panel Navigation")
|
||||||
|
register_default_panel_actions(&(&panel.input_map.mode[.Normal].ctrl_key_actions[.W]).action.(core.InputActions))
|
||||||
|
|
||||||
core.register_key_action(&panel.input_map.mode[.Normal], .ENTER, proc(state: ^core.State, user_data: rawptr) {
|
core.register_key_action(&panel.input_map.mode[.Normal], .ENTER, proc(state: ^core.State, user_data: rawptr) {
|
||||||
this_panel := transmute(^core.Panel)user_data
|
this_panel := transmute(^core.Panel)user_data
|
||||||
|
|
||||||
|
@ -163,7 +166,7 @@ make_grep_panel :: proc() -> core.Panel {
|
||||||
kind = {ui.Grow{}, ui.Grow{}}
|
kind = {ui.Grow{}, ui.Grow{}}
|
||||||
},
|
},
|
||||||
style = {
|
style = {
|
||||||
border = {.Left, .Right, .Top, .Bottom},
|
border = {.Right},
|
||||||
border_color = .Background4
|
border_color = .Background4
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -13,7 +13,6 @@ import "../core"
|
||||||
import "../util"
|
import "../util"
|
||||||
import "../ui"
|
import "../ui"
|
||||||
|
|
||||||
// NOTE: odd that this is here, but I don't feel like thinking of a better dep-tree to fix it
|
|
||||||
register_default_leader_actions :: proc(input_map: ^core.InputActions) {
|
register_default_leader_actions :: proc(input_map: ^core.InputActions) {
|
||||||
core.register_key_action(input_map, .Q, proc(state: ^core.State, user_data: rawptr) {
|
core.register_key_action(input_map, .Q, proc(state: ^core.State, user_data: rawptr) {
|
||||||
core.reset_input_map(state)
|
core.reset_input_map(state)
|
||||||
|
@ -22,15 +21,6 @@ register_default_leader_actions :: proc(input_map: ^core.InputActions) {
|
||||||
core.register_key_action(input_map, .R, proc(state: ^core.State, user_data: rawptr) {
|
core.register_key_action(input_map, .R, proc(state: ^core.State, user_data: rawptr) {
|
||||||
open_grep_panel(state)
|
open_grep_panel(state)
|
||||||
}, "Grep Workspace")
|
}, "Grep Workspace")
|
||||||
|
|
||||||
core.register_key_action(input_map, .K, proc(state: ^core.State, user_data: rawptr) {
|
|
||||||
buffer := transmute(^core.FileBuffer)user_data
|
|
||||||
|
|
||||||
ts.update_cursor(&buffer.tree, buffer.history.cursor.line, buffer.history.cursor.col)
|
|
||||||
ts.print_node_type(&buffer.tree)
|
|
||||||
|
|
||||||
core.reset_input_map(state)
|
|
||||||
}, "View Symbol")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
register_default_panel_actions :: proc(input_map: ^core.InputActions) {
|
register_default_panel_actions :: proc(input_map: ^core.InputActions) {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package theme
|
package theme
|
||||||
|
|
||||||
PaletteColor :: enum {
|
PaletteColor :: enum {
|
||||||
|
None,
|
||||||
Background,
|
Background,
|
||||||
Foreground,
|
Foreground,
|
||||||
|
|
||||||
|
@ -33,6 +34,7 @@ PaletteColor :: enum {
|
||||||
|
|
||||||
// Its the gruvbox dark theme <https://github.com/morhetz/gruvbox>
|
// Its the gruvbox dark theme <https://github.com/morhetz/gruvbox>
|
||||||
palette := []u32 {
|
palette := []u32 {
|
||||||
|
0x00000000,
|
||||||
0x282828ff,
|
0x282828ff,
|
||||||
0xebdbb2ff,
|
0xebdbb2ff,
|
||||||
|
|
||||||
|
@ -65,6 +67,7 @@ palette := []u32 {
|
||||||
|
|
||||||
|
|
||||||
light_palette := []u32 {
|
light_palette := []u32 {
|
||||||
|
0x00000000,
|
||||||
0xfbf1c7ff,
|
0xfbf1c7ff,
|
||||||
0x3c3836ff,
|
0x3c3836ff,
|
||||||
|
|
||||||
|
|
|
@ -251,7 +251,9 @@ parse_buffer :: proc(state: ^State, input: Input) {
|
||||||
}
|
}
|
||||||
|
|
||||||
update_cursor :: proc(state: ^State, line: int, col: int) {
|
update_cursor :: proc(state: ^State, line: int, col: int) {
|
||||||
assert(state.tree != nil)
|
if state.tree == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
root_node := tree_root_node(state.tree)
|
root_node := tree_root_node(state.tree)
|
||||||
tree_cursor_reset(&state.cursor, root_node)
|
tree_cursor_reset(&state.cursor, root_node)
|
||||||
|
@ -274,6 +276,7 @@ load_highlights :: proc(state: ^State) {
|
||||||
capture_to_color := make(map[string]theme.PaletteColor, allocator = context.temp_allocator)
|
capture_to_color := make(map[string]theme.PaletteColor, allocator = context.temp_allocator)
|
||||||
capture_to_color["include"] = .Red
|
capture_to_color["include"] = .Red
|
||||||
capture_to_color["keyword.function"] = .Red
|
capture_to_color["keyword.function"] = .Red
|
||||||
|
capture_to_color["keyword.return"] = .Red
|
||||||
capture_to_color["storageclass"] = .Red
|
capture_to_color["storageclass"] = .Red
|
||||||
|
|
||||||
capture_to_color["keyword.operator"] = .Purple
|
capture_to_color["keyword.operator"] = .Purple
|
||||||
|
@ -347,6 +350,10 @@ load_highlights :: proc(state: ^State) {
|
||||||
}
|
}
|
||||||
|
|
||||||
print_node_type :: proc(state: ^State) {
|
print_node_type :: proc(state: ^State) {
|
||||||
|
if state.tree == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
current_node := tree_cursor_current_node(&state.cursor)
|
current_node := tree_cursor_current_node(&state.cursor)
|
||||||
if node_is_null(current_node) {
|
if node_is_null(current_node) {
|
||||||
log.error("Current node is null after goto_first_child")
|
log.error("Current node is null after goto_first_child")
|
||||||
|
|
Loading…
Reference in New Issue