Try moving one variable out of the old config system into the new one 'enable_virtual_whitespace'

This commit is contained in:
Allen Webster 2020-11-25 14:35:27 -08:00
parent f0339a9eb7
commit 43913b122a
8 changed files with 126 additions and 109 deletions

View File

@ -33,7 +33,7 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
}
}
switch (mode){
switch (mode){
case CLMode_App:
{
switch (action){

View File

@ -1195,7 +1195,8 @@ function Layout_Item_List
layout_virt_indent_index(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width, Layout_Wrap_Kind kind){
Layout_Item_List result = {};
if (global_config.enable_virtual_whitespace){
b32 enable_virtual_whitespace = def_get_config_b32(vars_save_string_lit("enable_virtual_whitespace"));
if (enable_virtual_whitespace){
code_index_lock();
Code_Index_File *file = code_index_get_file(buffer);
if (file != 0){
@ -1234,7 +1235,9 @@ layout_virt_indent_index_generic(Application_Links *app, Arena *arena, Buffer_ID
CUSTOM_COMMAND_SIG(toggle_virtual_whitespace)
CUSTOM_DOC("Toggles virtual whitespace for all files.")
{
global_config.enable_virtual_whitespace = !global_config.enable_virtual_whitespace;
String_ID key = vars_save_string_lit("enable_virtual_whitespace");
b32 enable_virtual_whitespace = def_get_config_b32(key);
def_set_config_b32(key, !enable_virtual_whitespace);
for (Buffer_ID buffer = get_buffer_next(app, 0, Access_Always);
buffer != 0;

View File

@ -35,6 +35,16 @@ parse_extension_line_to_extension_list(Application_Links *app,
return(array);
}
////////////////////////////////
// NOTE(allen): Token Array
function Token_Array
token_array_from_text(Application_Links *app, Arena *arena, String_Const_u8 data){
ProfileScope(app, "token array from text");
Token_List list = lex_full_input_cpp(arena, data);
return(token_array_from_list(arena, &list));
}
////////////////////////////////
// NOTE(allen): Built in Mapping
@ -232,7 +242,7 @@ def_config_parser_get_boolean(Config_Parser *ctx){
}
function Config*
def_config_parser_config(Config_Parser *ctx){
def_config_parser_top(Config_Parser *ctx){
i32 *version = def_config_parser_version(ctx);
Config_Assignment *first = 0;
@ -485,18 +495,31 @@ def_config_parser_element(Config_Parser *ctx){
}
function Config*
def_config_parse(Application_Links *app, Arena *arena, String_Const_u8 file_name,
String_Const_u8 data, Token_Array array){
def_config_parse(Application_Links *app, Arena *arena, String_Const_u8 file_name, String_Const_u8 data, Token_Array array){
ProfileScope(app, "config parse");
Temp_Memory restore_point = begin_temp(arena);
Config_Parser ctx = def_config_parser_init(arena, file_name, data, array);
Config *config = def_config_parser_config(&ctx);
Config *config = def_config_parser_top(&ctx);
if (config == 0){
end_temp(restore_point);
}
return(config);
}
function Config*
def_config_from_text(Application_Links *app, Arena *arena, String_Const_u8 file_name, String_Const_u8 data){
Config *parsed = 0;
Temp_Memory restore_point = begin_temp(arena);
Token_Array array = token_array_from_text(app, arena, data);
if (array.tokens != 0){
parsed = def_config_parse(app, arena, file_name, data, array);
if (parsed == 0){
end_temp(restore_point);
}
}
return(parsed);
}
function Config_Error*
def_config_push_error(Arena *arena, Config_Error_List *list, String_Const_u8 file_name, u8 *pos, char *error_text){
Config_Error *error = push_array(arena, Config_Error, 1);
@ -672,12 +695,11 @@ def_var_dump_rvalue(Application_Links *app, Config *config, Variable_Handle dst,
}
function Variable_Handle
def_var_from_config(Application_Links *app, Variable_Handle parent, String_Const_u8 key, Config *config){
def_fill_var_from_config(Application_Links *app, Variable_Handle parent, String_ID key, Config *config){
Variable_Handle result = vars_get_nil();
String_ID key_id = vars_save_string(key);
if (key_id != 0){
if (key != 0){
String_ID file_name_id = vars_save_string(config->file_name);
result = vars_new_variable(parent, key_id, file_name_id);
result = vars_new_variable(parent, key, file_name_id);
Variable_Handle var = result;
@ -715,6 +737,64 @@ def_var_from_config(Application_Links *app, Variable_Handle parent, String_Const
}
////////////////////////////////
// NOTE(allen): Config Variables Read
global const u64 def_config_lookup_count = 4;
global String_ID def_config_lookup_table[def_config_lookup_count] = {};
function void
_def_config_table_init(void){
if (def_config_lookup_table[0] == 0){
def_config_lookup_table[0] = vars_save_string(string_u8_litinit("ses_config"));
def_config_lookup_table[1] = vars_save_string(string_u8_litinit("prj_config"));
def_config_lookup_table[2] = vars_save_string(string_u8_litinit("usr_config"));
def_config_lookup_table[3] = vars_save_string(string_u8_litinit("def_config"));
}
}
function Variable_Handle
def_get_config_var(String_ID key){
_def_config_table_init();
Variable_Handle result = vars_get_nil();
Variable_Handle root = vars_get_root();
for (u64 i = 0; i < def_config_lookup_count; i += 1){
String_ID block_key = def_config_lookup_table[i];
Variable_Handle block_var = vars_read_key(root, block_key);
Variable_Handle var = vars_read_key(block_var, key);
if (!vars_is_nil(var)){
result = var;
break;
}
}
return(result);
}
function void
def_set_config_var(String_ID key, String_ID val){
_def_config_table_init();
Variable_Handle root = vars_get_root();
Variable_Handle block_var = vars_read_key(root, def_config_lookup_table[0]);
vars_new_variable(block_var, key, val);
}
function b32
def_get_config_b32(String_ID key){
Variable_Handle var = def_get_config_var(key);
String_ID val = vars_string_id_from_var(var);
b32 result = (val != 0 && val != vars_save_string_lit("false"));
return(result);
}
function void
def_set_config_b32(String_ID key, b32 val){
String_ID val_id = val?vars_save_string_lit("true"):vars_save_string_lit("false");
def_set_config_var(key, val_id);
}
////////////////////////////////
// NOTE(allen): Eval
@ -1240,30 +1320,6 @@ change_mode(Application_Links *app, String_Const_u8 mode){
////////////////////////////////
function Token_Array
token_array_from_text(Application_Links *app, Arena *arena, String_Const_u8 data){
ProfileScope(app, "token array from text");
Token_List list = lex_full_input_cpp(arena, data);
return(token_array_from_list(arena, &list));
}
function Config*
config_from_text(Application_Links *app, Arena *arena, String_Const_u8 file_name,
String_Const_u8 data){
Config *parsed = 0;
Temp_Memory restore_point = begin_temp(arena);
Token_Array array = token_array_from_text(app, arena, data);
if (array.tokens != 0){
parsed = def_config_parse(app, arena, file_name, data, array);
if (parsed == 0){
end_temp(restore_point);
}
}
return(parsed);
}
////////////////////////////////
function void
config_init_default(Config_Data *config){
config->user_name = SCu8(config->user_name_space, (u64)0);
@ -1287,7 +1343,6 @@ config_init_default(Config_Data *config){
config->enable_output_wrapping = false;
config->enable_undo_fade_out = true;
config->enable_virtual_whitespace = true;
config->enable_code_wrapping = true;
config->automatically_indent_text_on_save = true;
config->automatically_save_changes_on_build = true;
@ -1331,7 +1386,7 @@ config_parse__data(Application_Links *app, Arena *arena, String_Const_u8 file_na
b32 success = false;
Config *parsed = config_from_text(app, arena, file_name, data);
Config *parsed = def_config_from_text(app, arena, file_name, data);
if (parsed != 0){
success = true;
@ -1364,7 +1419,6 @@ config_parse__data(Application_Links *app, Arena *arena, String_Const_u8 file_na
config_bool_var(parsed, "enable_undo_fade_out", 0, &config->enable_undo_fade_out);
config_bool_var(parsed, "enable_virtual_whitespace", 0, &config->enable_virtual_whitespace);
config_bool_var(parsed, "enable_code_wrapping", 0, &config->enable_code_wrapping);
config_bool_var(parsed, "automatically_indent_text_on_save", 0, &config->automatically_indent_text_on_save);
config_bool_var(parsed, "automatically_save_changes_on_build", 0, &config->automatically_save_changes_on_build);
@ -1453,7 +1507,7 @@ config_parse__file_name(Application_Links *app, Arena *arena, char *file_name, C
function Config*
theme_parse__data(Application_Links *app, Arena *arena, String_Const_u8 file_name, String_Const_u8 data, Arena *color_arena, Color_Table *color_table){
Config *parsed = config_from_text(app, arena, file_name, data);
Config *parsed = def_config_from_text(app, arena, file_name, data);
if (parsed != 0){
for (Config_Assignment *node = parsed->first;
node != 0;
@ -1538,39 +1592,6 @@ theme_parse__file_name(Application_Links *app, Arena *arena, char *file_name, Ar
////////////////////////////////
function void
config_feedback_bool(Arena *arena, List_String_Const_u8 *list, char *name, b32 val){
string_list_pushf(arena, list, "%s = %s;\n", name, (char*)(val?"true":"false"));
}
function void
config_feedback_string(Arena *arena, List_String_Const_u8 *list, char *name, String_Const_u8 val){
val.size = clamp_bot(0, val.size);
string_list_pushf(arena, list, "%s = \"%.*s\";\n", name, string_expand(val));
}
function void
config_feedback_string(Arena *arena, List_String_Const_u8 *list, char *name, char *val){
string_list_pushf(arena, list, "%s = \"%s\";\n", name, val);
}
function void
config_feedback_extension_list(Arena *arena, List_String_Const_u8 *list, char *name, String_Const_u8_Array *extensions){
string_list_pushf(arena, list, "%s = \"", name);
for (i32 i = 0; i < extensions->count; ++i){
String_Const_u8 ext = extensions->strings[i];
string_list_pushf(arena, list, ".%.*s", string_expand(ext));
}
string_list_push_u8_lit(arena, list, "\";\n");
}
function void
config_feedback_int(Arena *arena, List_String_Const_u8 *list, char *name, i32 val){
string_list_pushf(arena, list, "%s = %d;\n", name, val);
}
////////////////////////////////
function void
load_config_and_apply(Application_Links *app, Arena *out_arena, Config_Data *config,
i32 override_font_size, b32 override_hinting){
@ -1589,7 +1610,7 @@ load_config_and_apply(Application_Links *app, Arena *out_arena, Config_Data *con
// NOTE(allen): Save As Variables
if (error_text.str == 0){
Variable_Handle config_var = def_var_from_config(app, vars_get_root(), string_litinit("config"), parsed);
Variable_Handle config_var = def_fill_var_from_config(app, vars_get_root(), vars_save_string_lit("def_config"), parsed);
vars_print(app, config_var);
}
}

View File

@ -204,7 +204,6 @@ struct Config_Data{
b8 indent_with_tabs;
b8 enable_undo_fade_out;
b8 enable_virtual_whitespace;
b8 enable_code_wrapping;
b8 automatically_indent_text_on_save;
b8 automatically_save_changes_on_build;
@ -266,7 +265,7 @@ function b32 def_config_parser_get_boolean(Config_Parser *ctx);
function void def_config_parser_recover(Config_Parser *ctx);
function Config* def_config_parser_config (Config_Parser *ctx);
function Config* def_config_parser_top (Config_Parser *ctx);
function i32* def_config_parser_version (Config_Parser *ctx);
function Config_Assignment* def_config_parser_assignment(Config_Parser *ctx);
function Config_LValue* def_config_parser_lvalue (Config_Parser *ctx);
@ -275,6 +274,7 @@ function Config_Compound* def_config_parser_compound (Config_Parser *ct
function Config_Compound_Element* def_config_parser_element (Config_Parser *ctx);
function Config* def_config_parse(Application_Links *app, Arena *arena, String_Const_u8 file_name, String_Const_u8 data, Token_Array array);
function Config* def_config_from_text(Application_Links *app, Arena *arena, String_Const_u8 file_name, String_Const_u8 data);
function Config_Error* def_config_push_error(Arena *arena, Config_Error_List *list, String_Const_u8 file_name, u8 *pos, char *error_text);
function Config_Error* def_config_push_error(Arena *arena, Config *config, u8 *pos, char *error_text);
@ -287,7 +287,16 @@ function void def_config_parser_recover(Config_Parser *ctx);
////////////////////////////////
// NOTE(allen): Dump Config to Variables
function Variable_Handle def_var_from_config(Application_Links *app, Variable_Handle parent, String_Const_u8 key, Config *config);
function Variable_Handle def_fill_var_from_config(Application_Links *app, Variable_Handle parent, String_ID key, Config *config);
////////////////////////////////
// NOTE(allen): Config Variables Read
function Variable_Handle def_get_config_var(String_ID key);
function void def_set_config_var(String_ID key, String_ID val);
function b32 def_get_config_b32(String_ID key);
function void def_set_config_b32(String_ID key, b32 val);
#endif

View File

@ -895,7 +895,7 @@ BUFFER_HOOK_SIG(default_file_save){
// buffer_id
ProfileScope(app, "default file save");
b32 is_virtual = global_config.enable_virtual_whitespace;
b32 is_virtual = def_get_config_b32(vars_save_string_lit("enable_virtual_whitespace"));
if (global_config.automatically_indent_text_on_save && is_virtual){
auto_indent_buffer(app, buffer_id, buffer_range(app, buffer_id));
}

View File

@ -27,7 +27,7 @@ dynamic_binding_load_from_file(Application_Links *app, Mapping *mapping, String_
FILE *file = open_file_try_current_path_then_binary_path(app, (char*)filename_copied.str);
if (file != 0){
Data data = dump_file_handle(scratch, file);
Config *parsed = config_from_text(app, scratch, filename, SCu8(data));
Config *parsed = def_config_from_text(app, scratch, filename, SCu8(data));
fclose(file);
if (parsed != 0){

View File

@ -718,25 +718,9 @@ set_current_project(Application_Links *app, Project *project, Config *parsed){
Variable_Handle proj_var = {};
if (parsed->version == 0 || *parsed->version < 2){
#if 0
struct Project{
b32 loaded;
String_Const_u8 dir;
String_Const_u8 name;
Project_File_Pattern_Array pattern_array;
Project_File_Pattern_Array blacklist_pattern_array;
Project_File_Load_Path_Array load_path_array;
Project_Command_Array command_array;
i32 fkey_commands[16];
};
#endif
print_message(app, string_u8_litexpr("Project variables converted from version 1 to version 2\n"));
String_ID project_id = vars_save_string(string_litinit("project"));
String_ID project_id = vars_save_string_lit("prj_config");
String_ID version_id = vars_save_string(string_litinit("version"));
String_ID project_name_id = vars_save_string(string_litinit("project_name"));
String_ID patterns_id = vars_save_string(string_litinit("patterns"));
@ -818,7 +802,7 @@ set_current_project(Application_Links *app, Project *project, Config *parsed){
}
}
else{
proj_var = def_var_from_config(app, vars_get_root(), string_litinit("project"), parsed);
proj_var = def_fill_var_from_config(app, vars_get_root(), vars_save_string_lit("prj_config"), parsed);
}
vars_print(app, proj_var);

View File

@ -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, 959 },
{ 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, 943 },
{ 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, 174 },
{ 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,8 +371,8 @@ 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, 979 },
{ 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, 1661 },
{ 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, 963 },
{ 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, 1682 },
{ 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, 533 },
{ 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, 545 },
{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1493 },
@ -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, 965 },
{ 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, 971 },
{ 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, 949 },
{ 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, 955 },
{ 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, 1574 },
{ 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, 2056 },
{ 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, 1405 },
{ 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, 987 },
{ 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, 1013 },
{ 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, 1389 },
{ 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, 971 },
{ 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, 997 },
{ 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, 1280 },
{ 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, 1301 },
{ 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, 1317 },
@ -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, 503 },
{ 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, 497 },
{ 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, 1354 },
{ 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, 1366 },
{ 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, 1360 },
{ 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, 1347 },
{ 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, 1338 },
{ 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, 1350 },
{ 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, 1344 },
{ 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, 1331 },
{ 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, 993 },
@ -503,7 +503,7 @@ static Command_Metadata fcoder_metacmd_table[250] = {
{ PROC_LINKS(toggle_mouse, 0), false, "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 491 },
{ PROC_LINKS(toggle_paren_matching_helper, 0), false, "toggle_paren_matching_helper", 28, "In code files matching parentheses pairs are colored with distinguishing colors.", 80, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 521 },
{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 816 },
{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "W:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1234 },
{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles virtual whitespace for all files.", 41, "W:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 1235 },
{ PROC_LINKS(tutorial_maximize, 0), false, "tutorial_maximize", 17, "Expand the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 20 },
{ PROC_LINKS(tutorial_minimize, 0), false, "tutorial_minimize", 17, "Shrink the tutorial window", 26, "W:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 34 },
{ PROC_LINKS(uncomment_line, 0), false, "uncomment_line", 14, "If present, delete '//' at the beginning of the line after leading whitespace.", 78, "W:\\4ed\\code\\custom\\4coder_combined_write_commands.cpp", 53, 137 },