diff --git a/custom/4coder_project_commands.cpp b/custom/4coder_project_commands.cpp index c076d0e2..4db0c821 100644 --- a/custom/4coder_project_commands.cpp +++ b/custom/4coder_project_commands.cpp @@ -11,18 +11,34 @@ global Arena current_project_arena = {}; /////////////////////////////// -function Project_File_Pattern_Array -get_pattern_array_from_string_array(Arena *arena, String_Const_u8_Array list){ - Project_File_Pattern_Array array = {}; - array.count = list.count; - array.patterns = push_array(arena, Project_File_Pattern, list.count); +function Match_Pattern_List +prj_pattern_list_from_extension_array(Arena *arena, String_Const_u8_Array list){ + Match_Pattern_List result = {}; for (i32 i = 0; i < list.count; ++i){ - String_Const_u8 str = push_u8_stringf(arena, "*.%.*s", string_expand(list.strings[i])); - array.patterns[i].absolutes = string_split_wildcards(arena, str); + Match_Pattern_Node *node = push_array(arena, Match_Pattern_Node, 1); + sll_queue_push(result.first, result.last, node); + result.count += 1; + + String_Const_u8 str = push_stringf(arena, "*.%.*s", string_expand(list.vals[i])); + node->pattern.absolutes = string_split_wildcards(arena, str); } - return(array); + return(result); +} + +function Match_Pattern_List +prj_pattern_list_from_var(Arena *arena, Variable_Handle var){ + Match_Pattern_List result = {}; + for (Vars_Children(child_var, var)){ + Match_Pattern_Node *node = push_array(arena, Match_Pattern_Node, 1); + sll_queue_push(result.first, result.last, node); + result.count += 1; + + String_Const_u8 str = vars_string_from_var(arena, child_var); + node->pattern.absolutes = string_split_wildcards(arena, str); + } + return(result); } /////////////////////////////// @@ -76,11 +92,12 @@ close_all_files_with_extension(Application_Links *app, String_Const_u8_Array ext } function b32 -match_in_pattern_array(String_Const_u8 string, Project_File_Pattern_Array array){ +match_in_pattern_list(String_Const_u8 string, Match_Pattern_List list){ b32 found_match = false; - Project_File_Pattern *pattern = array.patterns; - for (i32 i = 0; i < array.count; ++i, ++pattern){ - if (string_wildcard_match(pattern->absolutes, string, StringMatch_Exact)){ + for (Match_Pattern_Node *node = list.first; + node != 0; + node = node->next){ + if (string_wildcard_match(node->pattern.absolutes, string, StringMatch_Exact)){ found_match = true; break; } @@ -90,9 +107,7 @@ match_in_pattern_array(String_Const_u8 string, Project_File_Pattern_Array array) function void open_files_pattern_match__recursive(Application_Links *app, String_Const_u8 path, - Project_File_Pattern_Array whitelist, - Project_File_Pattern_Array blacklist, - u32 flags){ + Match_Pattern_List whitelist, Match_Pattern_List blacklist, u32 flags){ Scratch_Block scratch(app); ProfileScopeNamed(app, "get file list", profile_get_file_list); @@ -102,44 +117,42 @@ open_files_pattern_match__recursive(Application_Links *app, String_Const_u8 path File_Info **info = list.infos; for (u32 i = 0; i < list.count; ++i, ++info){ String_Const_u8 file_name = (**info).file_name; - if (HasFlag((**info).attributes.flags, FileAttribute_IsDirectory)){ - if ((flags & OpenAllFilesFlag_Recursive) == 0) continue; - if (match_in_pattern_array(file_name, blacklist)) continue; - - String_Const_u8 new_path = push_u8_stringf(scratch, "%.*s%.*s/", - string_expand(path), - string_expand(file_name)); + if ((flags & OpenAllFilesFlag_Recursive) == 0){ + continue; + } + if (match_in_pattern_list(file_name, blacklist)){ + continue; + } + String_Const_u8 new_path = push_u8_stringf(scratch, "%.*s%.*s/", string_expand(path), string_expand(file_name)); open_files_pattern_match__recursive(app, new_path, whitelist, blacklist, flags); } else{ - if (!match_in_pattern_array(file_name, whitelist)){ + if (!match_in_pattern_list(file_name, whitelist)){ continue; } - if (match_in_pattern_array(file_name, blacklist)){ + if (match_in_pattern_list(file_name, blacklist)){ continue; } - - String_Const_u8 full_path = push_u8_stringf(scratch, "%.*s%.*s", - string_expand(path), - string_expand(file_name)); - + String_Const_u8 full_path = push_u8_stringf(scratch, "%.*s%.*s", string_expand(path), string_expand(file_name)); create_buffer(app, full_path, 0); } } } -function Project_File_Pattern_Array +// TODO(allen): dumb name +function Match_Pattern_List get_standard_blacklist(Arena *arena){ String_Const_u8 dot = string_u8_litexpr(".*"); String_Const_u8_Array black_array = {}; black_array.strings = ˙ black_array.count = 1; - return(get_pattern_array_from_string_array(arena, black_array)); + return(prj_pattern_list_from_extension_array(arena, black_array)); } function void -open_files_pattern_match(Application_Links *app, String_Const_u8 dir, Project_File_Pattern_Array whitelist, Project_File_Pattern_Array blacklist, u32 flags){ +open_files_pattern_match(Application_Links *app, String_Const_u8 dir, + Match_Pattern_List whitelist, Match_Pattern_List blacklist, u32 flags){ ProfileScope(app, "open all files in directory pattern"); Scratch_Block scratch(app); String_Const_u8 directory = dir; @@ -152,8 +165,8 @@ open_files_pattern_match(Application_Links *app, String_Const_u8 dir, Project_Fi function void open_files_with_extension(Application_Links *app, String_Const_u8 dir, String_Const_u8_Array array, u32 flags){ Scratch_Block scratch(app); - Project_File_Pattern_Array whitelist = get_pattern_array_from_string_array(scratch, array); - Project_File_Pattern_Array blacklist = get_standard_blacklist(scratch); + Match_Pattern_List whitelist = prj_pattern_list_from_extension_array(scratch, array); + Match_Pattern_List blacklist = get_standard_blacklist(scratch); open_files_pattern_match(app, dir, whitelist, blacklist, flags); } @@ -171,20 +184,18 @@ open_all_files_in_hot_with_extension(Application_Links *app, String_Const_u8_Arr /////////////////////////////// function void -parse_project__extract_pattern_array(Arena *arena, Config *parsed, char *root_variable_name, Project_File_Pattern_Array *array_out){ +parse_project__extract_pattern_list(Arena *arena, Config *parsed, char *root_variable_name, Match_Pattern_List *list_out){ Config_Compound *compound = 0; if (config_compound_var(parsed, root_variable_name, 0, &compound)){ Config_Get_Result_List list = typed_string_array_reference_list(arena, parsed, compound); - - array_out->patterns = push_array(arena, Project_File_Pattern, list.count); - array_out->count = list.count; - - i32 i = 0; - for (Config_Get_Result_Node *node = list.first; - node != 0; - node = node->next, i += 1){ - String_Const_u8 str = push_string_copy(arena, node->result.string); - array_out->patterns[i].absolutes = string_split_wildcards(arena, str); + for (Config_Get_Result_Node *cfg_node = list.first; + cfg_node != 0; + cfg_node = cfg_node->next){ + Match_Pattern_Node *node = push_array(arena, Match_Pattern_Node, 1); + sll_queue_push(list_out->first, list_out->last, node); + list_out->count += 1; + String_Const_u8 str = push_string_copy(arena, cfg_node->result.string); + node->pattern.absolutes = string_split_wildcards(arena, str); } } } @@ -222,10 +233,10 @@ parse_project__config_data__version_1(Application_Links *app, Arena *arena, Stri } // patterns - parse_project__extract_pattern_array(arena, parsed, "patterns", &project->pattern_array); + parse_project__extract_pattern_list(arena, parsed, "patterns", &project->pattern_list); // blacklist_patterns - parse_project__extract_pattern_array(arena, parsed, "blacklist_patterns", &project->blacklist_pattern_array); + parse_project__extract_pattern_list(arena, parsed, "blacklist_patterns", &project->blacklist_pattern_list); // load_paths { @@ -416,18 +427,19 @@ parse_project__config_data__version_1(Application_Links *app, Arena *arena, Stri } function void -project_deep_copy__pattern_array(Arena *arena, Project_File_Pattern_Array *src_array, Project_File_Pattern_Array *dst_array){ - i32 pattern_count = src_array->count; - dst_array->patterns = push_array(arena, Project_File_Pattern, pattern_count); - dst_array->count = pattern_count; - Project_File_Pattern *dst = dst_array->patterns; - Project_File_Pattern *src = src_array->patterns; - for (i32 i = 0; i < pattern_count; ++i, ++dst, ++src){ - for (Node_String_Const_u8 *node = src->absolutes.first; +project_deep_copy__pattern_list(Arena *arena, Match_Pattern_List *src_list, Match_Pattern_List *dst_list){ + for (Match_Pattern_Node *src_node = src_list->first; + src_node != 0; + src_node = src_node->next){ + Match_Pattern_Node *dst_node = push_array(arena, Match_Pattern_Node, 1); + sll_queue_push(dst_list->first, dst_list->last, dst_node); + dst_list->count += 1; + + for (Node_String_Const_u8 *node = src_node->pattern.absolutes.first; node != 0; node = node->next){ String_Const_u8 string = push_string_copy(arena, node->string); - string_list_push(arena, &dst->absolutes, string); + string_list_push(arena, &dst_node->pattern.absolutes, string); } } } @@ -437,8 +449,8 @@ project_deep_copy__inner(Arena *arena, Project *project){ Project result = {}; result.dir = push_string_copy(arena, project->dir); result.name = push_string_copy(arena, project->name); - project_deep_copy__pattern_array(arena, &project->pattern_array, &result.pattern_array); - project_deep_copy__pattern_array(arena, &project->blacklist_pattern_array, &result.blacklist_pattern_array); + project_deep_copy__pattern_list(arena, &project->pattern_list, &result.pattern_list); + project_deep_copy__pattern_list(arena, &project->blacklist_pattern_list, &result.blacklist_pattern_list); { i32 path_count = project->load_path_array.count; @@ -587,21 +599,23 @@ prj_version_1_to_version_2(Application_Links *app, Config *parsed, Project *proj // load paterns struct PatternVars{ String_ID id; - Project_File_Pattern_Array array; + Match_Pattern_List list; }; PatternVars pattern_vars[] = { - { patterns_id, project-> pattern_array}, - {blacklist_patterns_id, project->blacklist_pattern_array}, + { patterns_id, project-> pattern_list}, + {blacklist_patterns_id, project->blacklist_pattern_list}, }; PatternVars *pattern_var = pattern_vars; PatternVars *opl = pattern_vars + ArrayCount(pattern_vars); for (; pattern_var < opl; pattern_var += 1){ Variable_Handle patterns = vars_new_variable(proj_var, pattern_var->id); - i32 count = pattern_var->array.count; - Project_File_Pattern *pattern = pattern_var->array.patterns; - for (i32 i = 0; i < count; i += 1, pattern += 1){ - String_Const_u8 pattern_string = prj_join_pattern_string(scratch, pattern->absolutes); + + i32 i = 0; + for (Match_Pattern_Node *node = pattern_var->list.first; + node != 0; + node = node->next, i += 1){ + String_Const_u8 pattern_string = prj_join_pattern_string(scratch, node->pattern.absolutes); String_ID key = vars_save_string(push_stringf(scratch, "%d", i)); String_ID pattern_id = vars_save_string(pattern_string); vars_new_variable(patterns, key, pattern_id); @@ -807,115 +821,112 @@ CUSTOM_DOC("Looks for a project.4coder file in the current directory and tries t } // NOTE(allen): Parse config data out of project file - Project_Parse_Result project_parse = {}; + Config *config_parse = 0; Variable_Handle proj_var = vars_get_nil(); - if (dump.data.str != 0){ Token_Array array = token_array_from_text(app, scratch, dump.data); if (array.tokens != 0){ - project_parse.parsed = def_config_parse(app, scratch, dump.file_name, dump.data, array); - if (project_parse.parsed != 0){ + config_parse = def_config_parse(app, scratch, dump.file_name, dump.data, array); + if (config_parse != 0){ i32 version = 0; - if (project_parse.parsed->version != 0){ - version = *project_parse.parsed->version; + if (config_parse->version != 0){ + version = *config_parse->version; } + switch (version){ case 0: - { - proj_var = prj_version_1_to_version_2(app, project_parse.parsed, project_parse.project); - }break; - case 1: { - project_parse.project = parse_project__config_data__version_1(app, scratch, project_root, project_parse.parsed); - proj_var = prj_version_1_to_version_2(app, project_parse.parsed, project_parse.project); + Project *project = parse_project__config_data__version_1(app, scratch, project_root, config_parse); + proj_var = prj_version_1_to_version_2(app, config_parse, project); }break; - default: { - proj_var = def_fill_var_from_config(app, vars_get_root(), vars_save_string_lit("prj_config"), project_parse.parsed); + proj_var = def_fill_var_from_config(app, vars_get_root(), vars_save_string_lit("prj_config"), config_parse); }break; } + } } } - // NOTE(allen): Dump project + // NOTE(allen): Print Project if (!vars_is_nil(proj_var)){ vars_print(app, proj_var); print_message(app, string_u8_litexpr("\n")); } - - // NOTE(allen): Set current project - if (project_parse.parsed != 0 && project_parse.project != 0){ - if (current_project_arena.base_allocator == 0){ - current_project_arena = make_arena_system(); - } - - // Copy project to current_project - linalloc_clear(¤t_project_arena); - Project new_project = project_deep_copy(¤t_project_arena, project_parse.project); - if (new_project.loaded){ - current_project = new_project; - - // NOTE(allen): Set the normal search list's project slot - def_search_project_path = current_project.dir; - - // Open all project files - for (i32 i = 0; i < current_project.load_path_array.count; ++i){ - Project_File_Load_Path *load_path = ¤t_project.load_path_array.paths[i]; - u32 flags = 0; - if (load_path->recursive){ - flags |= OpenAllFilesFlag_Recursive; - } - - Temp_Memory temp = begin_temp(scratch); - String_Const_u8 path_str = load_path->path; - String_Const_u8 file_dir = path_str; - if (load_path->relative){ - String_Const_u8 project_dir = current_project.dir; - List_String_Const_u8 file_dir_list = {}; - string_list_push(scratch, &file_dir_list, project_dir); - string_list_push_overlap(scratch, &file_dir_list, '/', path_str); - string_list_push_overlap(scratch, &file_dir_list, '/', SCu8()); - file_dir = string_list_flatten(scratch, file_dir_list, StringFill_NullTerminate); - } - - Project_File_Pattern_Array whitelist = current_project.pattern_array; - Project_File_Pattern_Array blacklist = current_project.blacklist_pattern_array; - open_files_pattern_match(app, file_dir, whitelist, blacklist, flags); - end_temp(temp); - } - - // Set window title - if (project_parse.project->name.size > 0){ - Temp_Memory temp = begin_temp(scratch); - String_Const_u8 builder = push_u8_stringf(scratch, "4coder project: %.*s", string_expand(project_parse.project->name)); - set_window_title(app, builder); - end_temp(temp); - } - } - else{ -#define M "Failed to initialize new project; need more memory dedicated to the project system.\n" - print_message(app, string_u8_litexpr(M)); -#undef M - } - } - - // NOTE(allen): errors - if (project_parse.parsed != 0){ - if (project_parse.project == 0){ - print_message(app, string_u8_litexpr("Could not instantiate project\n")); - } - - String_Const_u8 error_text = config_stringize_errors(app, scratch, project_parse.parsed); + // NOTE(allen): Print Errors + if (config_parse != 0){ + String_Const_u8 error_text = config_stringize_errors(app, scratch, config_parse); if (error_text.size > 0){ print_message(app, string_u8_litexpr("Project errors:\n")); print_message(app, error_text); print_message(app, string_u8_litexpr("\n")); } } + + // TODO(allen): this is dummy dumb dumb and don't need to be like this. + // NOTE(allen): Set the normal search list's project slot + String_Const_u8 project_dir = prj_path_from_project(scratch, proj_var); + + if (current_project_arena.base_allocator == 0){ + current_project_arena = make_arena_system(); + } + linalloc_clear(¤t_project_arena); + def_search_project_path = push_string_copy(¤t_project_arena, project_dir); + + // NOTE(allen): Open All Project Files + Variable_Handle load_paths_var = vars_read_key(proj_var, vars_save_string_lit("load_paths")); + Variable_Handle load_paths_os_var = vars_read_key(load_paths_var, vars_save_string_lit(OS_NAME)); + + String_ID path_id = vars_save_string_lit("path"); + String_ID recursive_id = vars_save_string_lit("recursive"); + String_ID relative_id = vars_save_string_lit("relative"); + + Variable_Handle whitelist_var = vars_read_key(proj_var, vars_save_string_lit("patterns")); + Variable_Handle blacklist_var = vars_read_key(proj_var, vars_save_string_lit("blacklist_patterns")); + + Match_Pattern_List whitelist = prj_pattern_list_from_var(scratch, whitelist_var); + Match_Pattern_List blacklist = prj_pattern_list_from_var(scratch, blacklist_var); + + for (Variable_Handle load_path_var = vars_first_child(load_paths_os_var); + !vars_is_nil(load_path_var); + load_path_var = vars_next_sibling(load_path_var)){ + Variable_Handle path_var = vars_read_key(load_path_var, path_id); + Variable_Handle recursive_var = vars_read_key(load_path_var, recursive_id); + Variable_Handle relative_var = vars_read_key(load_path_var, relative_id); + + String_Const_u8 path = vars_string_from_var(scratch, path_var); + b32 recursive = vars_b32_from_var(recursive_var); + b32 relative = vars_b32_from_var(relative_var); + + + u32 flags = 0; + if (recursive){ + flags |= OpenAllFilesFlag_Recursive; + } + + String_Const_u8 file_dir = path; + if (relative){ + List_String_Const_u8 file_dir_list = {}; + string_list_push(scratch, &file_dir_list, project_dir); + string_list_push_overlap(scratch, &file_dir_list, '/', path); + string_list_push_overlap(scratch, &file_dir_list, '/', SCu8()); + file_dir = string_list_flatten(scratch, file_dir_list, StringFill_NullTerminate); + } + + open_files_pattern_match(app, file_dir, whitelist, blacklist, flags); + } + + // NOTE(allen): Set Window Title + Variable_Handle proj_name_var = vars_read_key(proj_var, vars_save_string_lit("project_name")); + String_ID proj_name_id = vars_key_id_from_var(proj_var); + if (proj_name_id != 0){ + String_Const_u8 proj_name = vars_read_string(scratch, proj_name_id); + String_Const_u8 title = push_u8_stringf(scratch, "4coder project: %.*s", string_expand(proj_name)); + set_window_title(app, title); + } } CUSTOM_COMMAND_SIG(project_fkey_command) diff --git a/custom/4coder_project_commands.h b/custom/4coder_project_commands.h index 538e9afb..31fc8846 100644 --- a/custom/4coder_project_commands.h +++ b/custom/4coder_project_commands.h @@ -13,12 +13,18 @@ enum{ /////////////////////////////// -struct Project_File_Pattern{ +struct Match_Pattern{ List_String_Const_u8 absolutes; }; -struct Project_File_Pattern_Array{ - Project_File_Pattern *patterns; +struct Match_Pattern_Node{ + Match_Pattern_Node *next; + Match_Pattern pattern; +}; + +struct Match_Pattern_List{ + Match_Pattern_Node *first; + Match_Pattern_Node *last; i32 count; }; @@ -53,8 +59,8 @@ struct Project{ String_Const_u8 dir; String_Const_u8 name; - Project_File_Pattern_Array pattern_array; - Project_File_Pattern_Array blacklist_pattern_array; + Match_Pattern_List pattern_list; + Match_Pattern_List blacklist_pattern_list; Project_File_Load_Path_Array load_path_array; Project_Command_Array command_array; @@ -69,11 +75,6 @@ enum{ ProjectOSMatchLevel_ActiveMatch = 2, }; -struct Project_Parse_Result{ - Config *parsed; - Project *project; -}; - /////////////////////////////// struct Project_Setup_Status{ diff --git a/custom/4coder_variables.h b/custom/4coder_variables.h index 19a449ce..15c6dba9 100644 --- a/custom/4coder_variables.h +++ b/custom/4coder_variables.h @@ -28,6 +28,11 @@ struct Variable_Handle{ //////////////////////////////// // NOTE(allen): Functions +// TODO(allen): fix names fuck you for picking these allen: +// read_string +// read_keyu +// save_string + function String_ID vars_save_string(String_Const_u8 string); #define vars_save_string_lit(S) vars_save_string(string_u8_litexpr(S)) function String_Const_u8 vars_read_string(Arena *arena, String_ID id); @@ -42,6 +47,8 @@ function Variable_Handle vars_first_child(Variable_Handle var); function Variable_Handle vars_next_sibling(Variable_Handle var); function Variable_Handle vars_parent(Variable_Handle var); +#define Vars_Children(it, par) Variable_Handle it = vars_first_child(par); !vars_is_nil(it); it = vars_next_sibling(it) + function Variable_Handle vars_read_key(Variable_Handle var, String_ID key); function String_ID vars_key_id_from_var(Variable_Handle var); function String_Const_u8 vars_key_from_var(Arena *arena, Variable_Handle var); diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index 2880bb4e..d685af71 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -295,7 +295,7 @@ static Command_Metadata fcoder_metacmd_table[250] = { { PROC_LINKS(click_set_cursor_if_lbutton, 0), false, "click_set_cursor_if_lbutton", 27, "If the mouse left button is pressed, sets the cursor position to the mouse position.", 84, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 243 }, { PROC_LINKS(click_set_mark, 0), false, "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 256 }, { PROC_LINKS(clipboard_record_clip, 0), false, "clipboard_record_clip", 21, "In response to a new clipboard contents events, saves the new clip onto the clipboard history", 93, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 7 }, -{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 764 }, +{ PROC_LINKS(close_all_code, 0), false, "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 778 }, { PROC_LINKS(close_build_panel, 0), false, "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "W:\\4ed\\code\\custom\\4coder_build_commands.cpp", 44, 175 }, { PROC_LINKS(close_panel, 0), false, "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 674 }, { PROC_LINKS(command_documentation, 0), true, "command_documentation", 21, "Prompts the user to select a command then loads a doc buffer for that item", 74, "W:\\4ed\\code\\custom\\4coder_docs.cpp", 34, 190 }, @@ -371,7 +371,7 @@ static Command_Metadata fcoder_metacmd_table[250] = { { PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), false, "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 224 }, { PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 174 }, { PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 186 }, -{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 793 }, +{ PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 807 }, { PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "W:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1560 }, { PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 535 }, { PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 547 }, @@ -414,8 +414,8 @@ static Command_Metadata fcoder_metacmd_table[250] = { { PROC_LINKS(multi_paste_interactive_quick, 0), false, "multi_paste_interactive_quick", 29, "Paste multiple lines from the clipboard history, controlled by inputing the number of lines to paste", 100, "W:\\4ed\\code\\custom\\4coder_clipboard.cpp", 39, 380 }, { PROC_LINKS(music_start, 0), false, "music_start", 11, "Starts the music.", 17, "W:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 213 }, { PROC_LINKS(music_stop, 0), false, "music_stop", 10, "Stops the music.", 16, "W:\\4ed\\code\\custom\\4coder_examples.cpp", 38, 232 }, -{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 773 }, -{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 782 }, +{ PROC_LINKS(open_all_code, 0), false, "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 787 }, +{ PROC_LINKS(open_all_code_recursive, 0), false, "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 796 }, { PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1576 }, { PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 2059 }, { PROC_LINKS(open_long_braces, 0), false, "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 46 }, @@ -436,9 +436,9 @@ static Command_Metadata fcoder_metacmd_table[250] = { { PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 219 }, { PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "W:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 212 }, { PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "W:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 886 }, -{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1337 }, -{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 921 }, -{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 947 }, +{ PROC_LINKS(project_command_lister, 0), false, "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1348 }, +{ PROC_LINKS(project_fkey_command, 0), false, "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 932 }, +{ PROC_LINKS(project_go_to_root_directory, 0), false, "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 958 }, { PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1282 }, { PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1303 }, { PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1319 }, @@ -477,10 +477,10 @@ static Command_Metadata fcoder_metacmd_table[250] = { { PROC_LINKS(set_mark, 0), false, "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 115 }, { PROC_LINKS(set_mode_to_notepad_like, 0), false, "set_mode_to_notepad_like", 24, "Sets the edit mode to Notepad like.", 35, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 499 }, { PROC_LINKS(set_mode_to_original, 0), false, "set_mode_to_original", 20, "Sets the edit mode to 4coder original.", 38, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 493 }, -{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1289 }, -{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1301 }, -{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1295 }, -{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1282 }, +{ PROC_LINKS(setup_build_bat, 0), false, "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1300 }, +{ PROC_LINKS(setup_build_bat_and_sh, 0), false, "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1312 }, +{ PROC_LINKS(setup_build_sh, 0), false, "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1306 }, +{ PROC_LINKS(setup_new_project, 0), false, "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 1293 }, { PROC_LINKS(show_filebar, 0), false, "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 697 }, { PROC_LINKS(show_scrollbar, 0), false, "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 683 }, { PROC_LINKS(show_the_log_graph, 0), true, "show_the_log_graph", 18, "Parses *log* and displays the 'log graph' UI", 44, "W:\\4ed\\code\\custom\\4coder_log_parser.cpp", 40, 991 },