Search lister jumps

This commit is contained in:
Peter Slattery 2025-07-07 14:08:40 -07:00
parent 01a06a59c7
commit ea389639b3
1 changed files with 52 additions and 51 deletions

View File

@ -14,11 +14,11 @@ print_string_match_list_to_buffer(Application_Links *app, Buffer_ID out_buffer_i
Buffer_Insertion out = begin_buffer_insertion_at_buffered(app, out_buffer_id, 0, scratch, KB(64)); Buffer_Insertion out = begin_buffer_insertion_at_buffered(app, out_buffer_id, 0, scratch, KB(64));
buffer_set_setting(app, out_buffer_id, BufferSetting_ReadOnly, true); buffer_set_setting(app, out_buffer_id, BufferSetting_ReadOnly, true);
buffer_set_setting(app, out_buffer_id, BufferSetting_RecordsHistory, false); buffer_set_setting(app, out_buffer_id, BufferSetting_RecordsHistory, false);
Temp_Memory buffer_name_restore_point = begin_temp(scratch); Temp_Memory buffer_name_restore_point = begin_temp(scratch);
String_Const_u8 current_file_name = {}; String_Const_u8 current_file_name = {};
Buffer_ID current_buffer = 0; Buffer_ID current_buffer = 0;
if (matches.first != 0){ if (matches.first != 0){
for (String_Match *node = matches.first; for (String_Match *node = matches.first;
node != 0; node != 0;
@ -35,7 +35,7 @@ print_string_match_list_to_buffer(Application_Links *app, Buffer_ID out_buffer_i
current_file_name = push_buffer_unique_name(app, scratch, current_buffer); current_file_name = push_buffer_unique_name(app, scratch, current_buffer);
} }
} }
Buffer_Cursor cursor = buffer_compute_cursor(app, current_buffer, seek_pos(node->range.first)); Buffer_Cursor cursor = buffer_compute_cursor(app, current_buffer, seek_pos(node->range.first));
Temp_Memory line_temp = begin_temp(scratch); Temp_Memory line_temp = begin_temp(scratch);
String_Const_u8 full_line_str = push_buffer_line(app, scratch, current_buffer, cursor.line); String_Const_u8 full_line_str = push_buffer_line(app, scratch, current_buffer, cursor.line);
@ -50,8 +50,9 @@ print_string_match_list_to_buffer(Application_Links *app, Buffer_ID out_buffer_i
else{ else{
insertf(&out, "no matches"); insertf(&out, "no matches");
} }
end_buffer_insertion(&out); end_buffer_insertion(&out);
lock_jump_buffer(app, out_buffer_id);
} }
internal void internal void
@ -261,7 +262,7 @@ get_complete_list_raw(Application_Links *app, Arena *arena, Buffer_ID buffer,
Range_i64 needle_range, String_Const_u8 needle){ Range_i64 needle_range, String_Const_u8 needle){
local_persist Character_Predicate *pred = local_persist Character_Predicate *pred =
&character_predicate_alpha_numeric_underscore_utf8; &character_predicate_alpha_numeric_underscore_utf8;
String_Match_List result = {}; String_Match_List result = {};
i64 size = buffer_get_size(app, buffer); i64 size = buffer_get_size(app, buffer);
if (range_size(needle_range) > 0){ if (range_size(needle_range) > 0){
@ -280,7 +281,7 @@ get_complete_list_raw(Application_Links *app, Arena *arena, Buffer_ID buffer,
Ii64(0, size), needle, pred, Scan_Forward); Ii64(0, size), needle, pred, Scan_Forward);
string_match_list_filter_flags(&result, complete_must, complete_must_not); string_match_list_filter_flags(&result, complete_must, complete_must_not);
} }
string_match_list_enclose_all(app, result, string_match_list_enclose_all(app, result,
right_enclose_alpha_numeric_underscore_utf8); right_enclose_alpha_numeric_underscore_utf8);
return(result); return(result);
@ -307,28 +308,28 @@ function void
word_complete_iter_init__inner(Buffer_ID buffer, String_Const_u8 needle, Range_i64 range, Word_Complete_Iterator *iter){ word_complete_iter_init__inner(Buffer_ID buffer, String_Const_u8 needle, Range_i64 range, Word_Complete_Iterator *iter){
Application_Links *app = iter->app; Application_Links *app = iter->app;
Arena *arena = iter->arena; Arena *arena = iter->arena;
Base_Allocator *allocator = get_base_allocator_system(); Base_Allocator *allocator = get_base_allocator_system();
if (iter->already_used_table.allocator != 0){ if (iter->already_used_table.allocator != 0){
end_temp(iter->arena_restore); end_temp(iter->arena_restore);
table_clear(&iter->already_used_table); table_clear(&iter->already_used_table);
} }
block_zero_struct(iter); block_zero_struct(iter);
iter->app = app; iter->app = app;
iter->arena = arena; iter->arena = arena;
iter->arena_restore = begin_temp(arena); iter->arena_restore = begin_temp(arena);
iter->needle = push_string_copy(arena, needle); iter->needle = push_string_copy(arena, needle);
iter->first_buffer = buffer; iter->first_buffer = buffer;
iter->current_buffer = buffer; iter->current_buffer = buffer;
Scratch_Block scratch(app, arena); Scratch_Block scratch(app, arena);
String_Match_List list = get_complete_list_raw(app, scratch, buffer, range, needle); String_Match_List list = get_complete_list_raw(app, scratch, buffer, range, needle);
iter->already_used_table = make_table_Data_u64(allocator, 100); iter->already_used_table = make_table_Data_u64(allocator, 100);
word_complete_list_extend_from_raw(app, arena, &list, &iter->list, &iter->already_used_table); word_complete_list_extend_from_raw(app, arena, &list, &iter->list, &iter->already_used_table);
iter->scan_all_buffers = true; iter->scan_all_buffers = true;
} }
@ -339,7 +340,7 @@ word_complete_iter_init(Buffer_ID buffer, Range_i64 range, Word_Complete_Iterato
Arena *arena = iter->arena; Arena *arena = iter->arena;
Scratch_Block scratch(app, arena); Scratch_Block scratch(app, arena);
String_Const_u8 needle = push_buffer_range(app, scratch, buffer, range); String_Const_u8 needle = push_buffer_range(app, scratch, buffer, range);
word_complete_iter_init__inner(buffer, needle, range, iter); word_complete_iter_init__inner(buffer, needle, range, iter);
} }
} }
@ -373,21 +374,21 @@ word_complete_iter_next(Word_Complete_Iterator *it){
else{ else{
it->node = it->node->next; it->node = it->node->next;
} }
if (it->node != 0){ if (it->node != 0){
break; break;
} }
if (!it->scan_all_buffers){ if (!it->scan_all_buffers){
break; break;
} }
Application_Links *app = it->app; Application_Links *app = it->app;
Buffer_ID next = get_buffer_next_looped(app, it->current_buffer, Access_Read); Buffer_ID next = get_buffer_next_looped(app, it->current_buffer, Access_Read);
if (next == it->first_buffer){ if (next == it->first_buffer){
break; break;
} }
it->node = it->list.last; it->node = it->list.last;
it->current_buffer = next; it->current_buffer = next;
Scratch_Block scratch(app); Scratch_Block scratch(app);
@ -434,24 +435,24 @@ CUSTOM_COMMAND_SIG(word_complete)
CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.") CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.")
{ {
ProfileScope(app, "word complete"); ProfileScope(app, "word complete");
View_ID view = get_active_view(app, Access_ReadWriteVisible); View_ID view = get_active_view(app, Access_ReadWriteVisible);
Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible); Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible);
if (buffer != 0){ if (buffer != 0){
Managed_Scope scope = view_get_managed_scope(app, view); Managed_Scope scope = view_get_managed_scope(app, view);
b32 first_completion = false; b32 first_completion = false;
Rewrite_Type *rewrite = scope_attachment(app, scope, view_rewrite_loc, Rewrite_Type); Rewrite_Type *rewrite = scope_attachment(app, scope, view_rewrite_loc, Rewrite_Type);
if (*rewrite != Rewrite_WordComplete){ if (*rewrite != Rewrite_WordComplete){
first_completion = true; first_completion = true;
} }
set_next_rewrite(app, view, Rewrite_WordComplete); set_next_rewrite(app, view, Rewrite_WordComplete);
Word_Complete_Iterator *it = word_complete_get_shared_iter(app); Word_Complete_Iterator *it = word_complete_get_shared_iter(app);
local_persist b32 initialized = false; local_persist b32 initialized = false;
local_persist Range_i64 range = {}; local_persist Range_i64 range = {};
if (first_completion || !initialized){ if (first_completion || !initialized){
ProfileBlock(app, "word complete state init"); ProfileBlock(app, "word complete state init");
initialized = false; initialized = false;
@ -463,15 +464,15 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with
word_complete_iter_init(buffer, needle_range, it); word_complete_iter_init(buffer, needle_range, it);
} }
} }
if (initialized){ if (initialized){
ProfileBlock(app, "word complete apply"); ProfileBlock(app, "word complete apply");
word_complete_iter_next(it); word_complete_iter_next(it);
String_Const_u8 str = word_complete_iter_read(it); String_Const_u8 str = word_complete_iter_read(it);
buffer_replace_range(app, buffer, range, str); buffer_replace_range(app, buffer, range, str);
range.max = range.min + str.size; range.max = range.min + str.size;
view_set_cursor_and_preferred_x(app, view, seek_pos(range.max)); view_set_cursor_and_preferred_x(app, view, seek_pos(range.max));
} }
@ -507,15 +508,15 @@ word_complete_menu_render(Application_Links *app, Frame_Info frame_info, View_ID
Managed_Scope scope = view_get_managed_scope(app, view); Managed_Scope scope = view_get_managed_scope(app, view);
Word_Complete_Menu **menu_ptr = scope_attachment(app, scope, view_word_complete_menu, Word_Complete_Menu*); Word_Complete_Menu **menu_ptr = scope_attachment(app, scope, view_word_complete_menu, Word_Complete_Menu*);
Word_Complete_Menu *menu = *menu_ptr; Word_Complete_Menu *menu = *menu_ptr;
if (menu != 0){ if (menu != 0){
menu->prev_render_caller(app, frame_info, view); menu->prev_render_caller(app, frame_info, view);
Buffer_ID buffer = view_get_buffer(app, view, Access_Always); Buffer_ID buffer = view_get_buffer(app, view, Access_Always);
Face_ID face = get_face_id(app, buffer); Face_ID face = get_face_id(app, buffer);
Scratch_Block scratch(app); Scratch_Block scratch(app);
Fancy_Block block = {}; Fancy_Block block = {};
for (i32 i = 0; i < menu->count; i += 1){ for (i32 i = 0; i < menu->count; i += 1){
if (menu->options[i].size > 0){ if (menu->options[i].size > 0){
@ -524,20 +525,20 @@ word_complete_menu_render(Application_Links *app, Frame_Info frame_info, View_ID
push_fancy_string(scratch, line, fcolor_id(defcolor_text_default), menu->options[i]); push_fancy_string(scratch, line, fcolor_id(defcolor_text_default), menu->options[i]);
} }
} }
Rect_f32 region = view_get_buffer_region(app, view); Rect_f32 region = view_get_buffer_region(app, view);
Buffer_Scroll scroll = view_get_buffer_scroll(app, view); Buffer_Scroll scroll = view_get_buffer_scroll(app, view);
Buffer_Point buffer_point = scroll.position; Buffer_Point buffer_point = scroll.position;
i64 pos = view_get_cursor_pos(app, view); i64 pos = view_get_cursor_pos(app, view);
Vec2_f32 cursor_p = view_relative_xy_of_pos(app, view, buffer_point.line_number, pos); Vec2_f32 cursor_p = view_relative_xy_of_pos(app, view, buffer_point.line_number, pos);
cursor_p -= buffer_point.pixel_shift; cursor_p -= buffer_point.pixel_shift;
cursor_p += region.p0; cursor_p += region.p0;
Face_Metrics metrics = get_face_metrics(app, face); Face_Metrics metrics = get_face_metrics(app, face);
f32 x_padding = metrics.normal_advance; f32 x_padding = metrics.normal_advance;
f32 x_half_padding = x_padding*0.5f; f32 x_half_padding = x_padding*0.5f;
draw_drop_down(app, face, &block, cursor_p, region, x_padding, x_half_padding, draw_drop_down(app, face, &block, cursor_p, region, x_padding, x_half_padding,
fcolor_id(defcolor_margin_hover), fcolor_id(defcolor_back)); fcolor_id(defcolor_margin_hover), fcolor_id(defcolor_back));
} }
@ -548,11 +549,11 @@ get_word_complete_from_user_drop_down(Application_Links *app){
View_ID view = get_this_ctx_view(app, Access_Always); View_ID view = get_this_ctx_view(app, Access_Always);
View_Context ctx = view_current_context(app, view); View_Context ctx = view_current_context(app, view);
Render_Caller_Function *prev_render_caller = ctx.render_caller; Render_Caller_Function *prev_render_caller = ctx.render_caller;
Edit result = {}; Edit result = {};
Word_Complete_Iterator *it = word_complete_get_shared_iter(app); Word_Complete_Iterator *it = word_complete_get_shared_iter(app);
i64 pos = view_get_cursor_pos(app, view); i64 pos = view_get_cursor_pos(app, view);
Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible); Buffer_ID buffer = view_get_buffer(app, view, Access_ReadWriteVisible);
Range_i64 range = get_word_complete_needle_range(app, buffer, pos); Range_i64 range = get_word_complete_needle_range(app, buffer, pos);
@ -560,14 +561,14 @@ get_word_complete_from_user_drop_down(Application_Links *app){
word_complete_iter_init(buffer, range, it); word_complete_iter_init(buffer, range, it);
Word_Complete_Menu menu = make_word_complete_menu(prev_render_caller, it); Word_Complete_Menu menu = make_word_complete_menu(prev_render_caller, it);
word_complete_menu_next(&menu); word_complete_menu_next(&menu);
ctx.render_caller = word_complete_menu_render; ctx.render_caller = word_complete_menu_render;
View_Context_Block ctx_block(app, view, &ctx); View_Context_Block ctx_block(app, view, &ctx);
Managed_Scope scope = view_get_managed_scope(app, view); Managed_Scope scope = view_get_managed_scope(app, view);
Word_Complete_Menu **menu_ptr = scope_attachment(app, scope, view_word_complete_menu, Word_Complete_Menu*); Word_Complete_Menu **menu_ptr = scope_attachment(app, scope, view_word_complete_menu, Word_Complete_Menu*);
*menu_ptr = &menu; *menu_ptr = &menu;
b32 keep_looping_menu = true; b32 keep_looping_menu = true;
for (;keep_looping_menu;){ for (;keep_looping_menu;){
User_Input in = get_next_input(app, EventPropertyGroup_Any, User_Input in = get_next_input(app, EventPropertyGroup_Any,
@ -575,7 +576,7 @@ get_word_complete_from_user_drop_down(Application_Links *app){
if (in.abort){ if (in.abort){
break; break;
} }
b32 handled = true; b32 handled = true;
switch (in.event.kind){ switch (in.event.kind){
case InputEventKind_TextInsert: case InputEventKind_TextInsert:
@ -595,7 +596,7 @@ get_word_complete_from_user_drop_down(Application_Links *app){
} }
} }
}break; }break;
case InputEventKind_KeyStroke: case InputEventKind_KeyStroke:
{ {
switch (in.event.key.code){ switch (in.event.key.code){
@ -605,12 +606,12 @@ get_word_complete_from_user_drop_down(Application_Links *app){
result.range = range; result.range = range;
keep_looping_menu = false; keep_looping_menu = false;
}break; }break;
case KeyCode_Tab: case KeyCode_Tab:
{ {
word_complete_menu_next(&menu); word_complete_menu_next(&menu);
}break; }break;
case KeyCode_F1: case KeyCode_F1:
case KeyCode_F2: case KeyCode_F2:
case KeyCode_F3: case KeyCode_F3:
@ -625,7 +626,7 @@ get_word_complete_from_user_drop_down(Application_Links *app){
result.range = range; result.range = range;
keep_looping_menu = false; keep_looping_menu = false;
}break; }break;
case KeyCode_Backspace: case KeyCode_Backspace:
{ {
backspace_char(app); backspace_char(app);
@ -643,36 +644,36 @@ get_word_complete_from_user_drop_down(Application_Links *app){
} }
} }
}break; }break;
default: default:
{ {
leave_current_input_unhandled(app); leave_current_input_unhandled(app);
}break; }break;
} }
}break; }break;
case InputEventKind_MouseButton: case InputEventKind_MouseButton:
{ {
leave_current_input_unhandled(app); leave_current_input_unhandled(app);
keep_looping_menu = false; keep_looping_menu = false;
}break; }break;
default: default:
{ {
handled = false; handled = false;
}break; }break;
} }
if (!handled){ if (!handled){
leave_current_input_unhandled(app); leave_current_input_unhandled(app);
} }
} }
scope = view_get_managed_scope(app, view); scope = view_get_managed_scope(app, view);
menu_ptr = scope_attachment(app, scope, view_word_complete_menu, Word_Complete_Menu*); menu_ptr = scope_attachment(app, scope, view_word_complete_menu, Word_Complete_Menu*);
*menu_ptr = 0; *menu_ptr = 0;
} }
return(result); return(result);
} }