From 65e794f9d3a89991ab68ec73aeed76f11d05ed8c Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 30 Nov 2017 18:25:49 -0500 Subject: [PATCH] Lots of good work, also half assed shitty poop sauce of a buffer uniquifier --- 4coder_API/types.h | 14 +- 4coder_default_hooks.cpp | 44 +++- 4coder_generated/app_functions.h | 14 +- 4coder_generated/command_metadata.h | 384 ++++++++++++++-------------- 4coder_helper/4coder_bind_helper.h | 56 ++-- 4coder_project_commands.cpp | 2 +- 4coder_search.cpp | 4 +- 4ed.cpp | 22 +- 4ed_api_implementation.cpp | 30 +-- 4ed_app_models.h | 1 + 4ed_file.cpp | 15 +- 4ed_file_view.cpp | 122 ++++----- 4ed_view.cpp | 1 - 4ed_working_set.cpp | 148 +++++------ power/4coder_experiments.cpp | 1 + 15 files changed, 417 insertions(+), 441 deletions(-) diff --git a/4coder_API/types.h b/4coder_API/types.h index f86515cc..eeecc20f 100644 --- a/4coder_API/types.h +++ b/4coder_API/types.h @@ -73,8 +73,6 @@ ENUM(uint64_t, Command_ID){ cmdid_interactive_open, /* DOC(cmdid_interactive_open_or_new begins an interactive dialogue to open a file into a buffer, if the name specified does not match any existing buffer, a new buffer is created instead.) */ cmdid_interactive_open_or_new, - /* DOC(cmdid_save_as does not currently work and is likely to be removed rather that fixed.) */ - cmdid_save_as, /* DOC(cmdid_interactive_switch_buffer begins an interactive dialogue to choose an open buffer to swap into the active view.) */ cmdid_interactive_switch_buffer, /* DOC(cmdid_interactive_kill_buffer begins an interactive dialogue to choose an open buffer to kill.) */ @@ -827,7 +825,7 @@ STRUCT User_Input{ }; -/* DOC(Hook_IDs name the various hooks into 4coder, these hooks use the Hook_Function signature.) +/* DOC(Hook_IDs name the various hooks in 4coder, these hooks use the Hook_Function signature.) DOC_SEE(Hook_Function) */ ENUM(int32_t, Hook_ID){ /* DOC(TODO) */ @@ -858,6 +856,8 @@ ENUM(int32_t, Special_Hook_ID){ special_hook_input_filter, /* DOC(TODO) */ special_hook_start, + /* DOC(TODO) */ + special_hook_buffer_name_resolver, }; TYPEDEF_FUNC int32_t Command_Caller_Hook_Function(struct Application_Links *app, Generic_Command cmd); @@ -866,8 +866,8 @@ TYPEDEF_FUNC int32_t Command_Caller_Hook_Function(struct Application_Links *app, TYPEDEF_FUNC int32_t Hook_Function(struct Application_Links *app); #define HOOK_SIG(name) int32_t name(struct Application_Links *app) -TYPEDEF_FUNC int32_t Open_File_Hook_Function(struct Application_Links *app, int32_t buffer_id); -#define OPEN_FILE_HOOK_SIG(name) int32_t name(struct Application_Links *app, int32_t buffer_id) +TYPEDEF_FUNC int32_t Open_File_Hook_Function(struct Application_Links *app, Buffer_ID buffer_id); +#define OPEN_FILE_HOOK_SIG(name) int32_t name(struct Application_Links *app, Buffer_ID buffer_id) TYPEDEF_FUNC void Input_Filter_Function(Mouse_State *mouse); #define INPUT_FILTER_SIG(name) void name(Mouse_State *mouse) @@ -876,6 +876,10 @@ TYPEDEF_FUNC int32_t Scroll_Rule_Function(float target_x, float target_y, float #define SCROLL_RULE_SIG(name) \ int32_t name(float target_x, float target_y, float *scroll_x, float *scroll_y, int32_t view_id, int32_t is_new_target, float dt) +TYPEDEF_FUNC void Buffer_Name_Resolver_Function(struct Application_Links *app, char *file_name, int32_t file_name_len, char *name, int32_t *size, int32_t capacity); +#define BUFFER_NAME_RESOLVER_SIG(n) \ +void n(struct Application_Links *app, char *file_name, int32_t file_name_len, char *name, int32_t *size, int32_t capacity) + TYPEDEF_FUNC int32_t Start_Hook_Function(struct Application_Links *app, char **files, int32_t file_count, char **flags, int32_t flag_count); #define START_HOOK_SIG(name) \ int32_t name(struct Application_Links *app, char **files, int32_t file_count, char **flags, int32_t flag_count) diff --git a/4coder_default_hooks.cpp b/4coder_default_hooks.cpp index 75893d27..b3d9158c 100644 --- a/4coder_default_hooks.cpp +++ b/4coder_default_hooks.cpp @@ -88,7 +88,46 @@ HOOK_SIG(default_view_adjust){ return(0); } -// TODO(allen): Eliminate this hook if you can. +BUFFER_NAME_RESOLVER_SIG(default_buffer_name_resolution){ + String s = make_string_cap(name, *size, capacity); + int32_t original_size = *size; + int32_t x = 0; + for (;;){ + Buffer_Summary conflicting_buffer = get_buffer_by_name(app, s.str, s.size, AccessAll); + if (!conflicting_buffer.exists){ + break; + } + s.size = original_size; + + // Get the uniquifier string + x += 1; + + String s_file_name = path_of_directory(make_string(file_name, file_name_len)); + s_file_name.size -= 1; + char *end = s_file_name.str + s_file_name.size; + + for (int32_t i = 0; i < x; ++i){ + s_file_name = path_of_directory(s_file_name); + if (i + 1 < x){ + s_file_name.size -= 1; + } + if (s_file_name.size <= 0){ + s_file_name.size = 0; + break; + } + } + + char *start = s_file_name.str + s_file_name.size; + + String uniquifier = make_string(start, (int32_t)(end - start)); + + append(&s, " <"); + append(&s, uniquifier); + append(&s, ">"); + } + *size = s.size; +} + OPEN_FILE_HOOK_SIG(default_file_settings){ // NOTE(allen|a4.0.8): The get_parameter_buffer was eliminated // and instead the buffer is passed as an explicit parameter through @@ -207,8 +246,6 @@ OPEN_FILE_HOOK_SIG(default_file_settings){ buffer_set_setting(app, &buffer, BufferSetting_Lex, treat_as_code); } - set_title(app, "TESTINGGGG!!!!!!! BOOOYYAAA!!!!!"); - // no meaning for return return(0); } @@ -374,6 +411,7 @@ set_all_default_hooks(Bind_Helper *context){ set_command_caller(context, default_command_caller); set_input_filter(context, default_suppress_mouse_filter); set_scroll_rule(context, smooth_scroll_rule); + set_buffer_name_resolver(context, default_buffer_name_resolution); } #endif diff --git a/4coder_generated/app_functions.h b/4coder_generated/app_functions.h index 7e9ac99f..b645dad2 100644 --- a/4coder_generated/app_functions.h +++ b/4coder_generated/app_functions.h @@ -83,7 +83,7 @@ struct Application_Links; #define SET_FULLSCREEN_SIG(n) bool32 n(Application_Links *app, bool32 full_screen) #define IS_FULLSCREEN_SIG(n) bool32 n(Application_Links *app) #define SEND_EXIT_SIGNAL_SIG(n) void n(Application_Links *app) -#define SET_TITLE_SIG(n) void n(Application_Links *app, char *title) +#define SET_WINDOW_TITLE_SIG(n) void n(Application_Links *app, char *title) typedef GLOBAL_SET_SETTING_SIG(Global_Set_Setting_Function); typedef GLOBAL_SET_MAPPING_SIG(Global_Set_Mapping_Function); typedef EXEC_COMMAND_SIG(Exec_Command_Function); @@ -168,7 +168,7 @@ typedef SHOW_MOUSE_CURSOR_SIG(Show_Mouse_Cursor_Function); typedef SET_FULLSCREEN_SIG(Set_Fullscreen_Function); typedef IS_FULLSCREEN_SIG(Is_Fullscreen_Function); typedef SEND_EXIT_SIGNAL_SIG(Send_Exit_Signal_Function); -typedef SET_TITLE_SIG(Set_Title_Function); +typedef SET_WINDOW_TITLE_SIG(Set_Window_Title_Function); struct Application_Links{ #if defined(ALLOW_DEP_4CODER) Global_Set_Setting_Function *global_set_setting; @@ -255,7 +255,7 @@ Show_Mouse_Cursor_Function *show_mouse_cursor; Set_Fullscreen_Function *set_fullscreen; Is_Fullscreen_Function *is_fullscreen; Send_Exit_Signal_Function *send_exit_signal; -Set_Title_Function *set_title; +Set_Window_Title_Function *set_window_title; #else Global_Set_Setting_Function *global_set_setting_; Global_Set_Mapping_Function *global_set_mapping_; @@ -341,7 +341,7 @@ Show_Mouse_Cursor_Function *show_mouse_cursor_; Set_Fullscreen_Function *set_fullscreen_; Is_Fullscreen_Function *is_fullscreen_; Send_Exit_Signal_Function *send_exit_signal_; -Set_Title_Function *set_title_; +Set_Window_Title_Function *set_window_title_; #endif void *memory; int32_t memory_size; @@ -435,7 +435,7 @@ app_links->show_mouse_cursor_ = Show_Mouse_Cursor;\ app_links->set_fullscreen_ = Set_Fullscreen;\ app_links->is_fullscreen_ = Is_Fullscreen;\ app_links->send_exit_signal_ = Send_Exit_Signal;\ -app_links->set_title_ = Set_Title;} while(false) +app_links->set_window_title_ = Set_Window_Title;} while(false) #if defined(ALLOW_DEP_4CODER) static inline bool32 global_set_setting(Application_Links *app, Global_Setting_ID setting, int32_t value){return(app->global_set_setting(app, setting, value));} static inline bool32 global_set_mapping(Application_Links *app, void *data, int32_t size){return(app->global_set_mapping(app, data, size));} @@ -521,7 +521,7 @@ static inline void show_mouse_cursor(Application_Links *app, Mouse_Cursor_Show_T static inline bool32 set_fullscreen(Application_Links *app, bool32 full_screen){return(app->set_fullscreen(app, full_screen));} static inline bool32 is_fullscreen(Application_Links *app){return(app->is_fullscreen(app));} static inline void send_exit_signal(Application_Links *app){(app->send_exit_signal(app));} -static inline void set_title(Application_Links *app, char *title){(app->set_title(app, title));} +static inline void set_window_title(Application_Links *app, char *title){(app->set_window_title(app, title));} #else static inline bool32 global_set_setting(Application_Links *app, Global_Setting_ID setting, int32_t value){return(app->global_set_setting_(app, setting, value));} static inline bool32 global_set_mapping(Application_Links *app, void *data, int32_t size){return(app->global_set_mapping_(app, data, size));} @@ -607,5 +607,5 @@ static inline void show_mouse_cursor(Application_Links *app, Mouse_Cursor_Show_T static inline bool32 set_fullscreen(Application_Links *app, bool32 full_screen){return(app->set_fullscreen_(app, full_screen));} static inline bool32 is_fullscreen(Application_Links *app){return(app->is_fullscreen_(app));} static inline void send_exit_signal(Application_Links *app){(app->send_exit_signal_(app));} -static inline void set_title(Application_Links *app, char *title){(app->set_title_(app, title));} +static inline void set_window_title(Application_Links *app, char *title){(app->set_window_title_(app, title));} #endif diff --git a/4coder_generated/command_metadata.h b/4coder_generated/command_metadata.h index eec8d246..f5d9e620 100644 --- a/4coder_generated/command_metadata.h +++ b/4coder_generated/command_metadata.h @@ -212,198 +212,198 @@ int32_t source_name_len; int32_t line_number; }; static Command_Metadata fcoder_metacmd_table[192] = { -{ PROC_LINKS(allow_mouse, 0), "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "/home/allen/4ed/code/4coder_default_framework.h", 47, 232 }, -{ PROC_LINKS(auto_tab_line_at_cursor, 0), "auto_tab_line_at_cursor", 23, "Auto-indents the line on which the cursor sits.", 47, "/home/allen/4ed/code/4coder_auto_indent.cpp", 43, 660 }, -{ PROC_LINKS(auto_tab_range, 0), "auto_tab_range", 14, "Auto-indents the range between the cursor and the mark.", 55, "/home/allen/4ed/code/4coder_auto_indent.cpp", 43, 671 }, -{ PROC_LINKS(auto_tab_whole_file, 0), "auto_tab_whole_file", 19, "Audo-indents the entire current buffer.", 39, "/home/allen/4ed/code/4coder_auto_indent.cpp", 43, 650 }, -{ PROC_LINKS(backspace_char, 0), "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 81 }, -{ PROC_LINKS(backspace_word, 0), "backspace_word", 14, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 147 }, -{ PROC_LINKS(basic_change_active_panel, 0), "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 514 }, -{ PROC_LINKS(build_in_build_panel, 0), "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "/home/allen/4ed/code/4coder_build_commands.cpp", 46, 203 }, -{ PROC_LINKS(build_search, 0), "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "/home/allen/4ed/code/4coder_build_commands.cpp", 46, 169 }, -{ PROC_LINKS(center_view, 0), "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 136 }, -{ PROC_LINKS(change_active_panel, 0), "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "/home/allen/4ed/code/4coder_default_framework.h", 47, 125 }, -{ PROC_LINKS(change_active_panel_backwards, 0), "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "/home/allen/4ed/code/4coder_default_framework.h", 47, 143 }, -{ PROC_LINKS(change_to_build_panel, 0), "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "/home/allen/4ed/code/4coder_build_commands.cpp", 46, 225 }, -{ PROC_LINKS(clean_all_lines, 0), "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 446 }, -{ PROC_LINKS(click_set_cursor, 0), "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 190 }, -{ PROC_LINKS(click_set_mark, 0), "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 203 }, -{ PROC_LINKS(close_all_code, 0), "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "/home/allen/4ed/code/4coder_project_commands.cpp", 48, 188 }, -{ PROC_LINKS(close_build_panel, 0), "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "/home/allen/4ed/code/4coder_build_commands.cpp", 46, 219 }, -{ PROC_LINKS(close_panel, 0), "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 522 }, -{ PROC_LINKS(copy, 0), "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "/home/allen/4ed/code/4coder_clipboard.cpp", 41, 52 }, -{ PROC_LINKS(cursor_mark_swap, 0), "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 109 }, -{ PROC_LINKS(cut, 0), "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "/home/allen/4ed/code/4coder_clipboard.cpp", 41, 61 }, -{ PROC_LINKS(decrease_face_size, 0), "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 615 }, -{ PROC_LINKS(decrease_line_wrap, 0), "decrease_line_wrap", 18, "Decrases the current buffer's width for line wrapping.", 54, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 592 }, -{ PROC_LINKS(delete_char, 0), "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 63 }, -{ PROC_LINKS(delete_current_scope, 0), "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "/home/allen/4ed/code/4coder_scope_commands.cpp", 46, 492 }, -{ PROC_LINKS(delete_file_query, 0), "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1062 }, -{ PROC_LINKS(delete_line, 0), "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 369 }, -{ PROC_LINKS(delete_range, 0), "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 121 }, -{ PROC_LINKS(delete_word, 0), "delete_word", 11, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 167 }, -{ PROC_LINKS(duplicate_line, 0), "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 347 }, -{ PROC_LINKS(eol_dosify, 0), "eol_dosify", 10, "Puts the buffer in DOS line ending mode.", 40, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 645 }, -{ PROC_LINKS(eol_nixify, 0), "eol_nixify", 10, "Puts the buffer in NIX line ending mode.", 40, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 653 }, -{ PROC_LINKS(execute_any_cli, 0), "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "/home/allen/4ed/code/4coder_system_command.cpp", 46, 30 }, -{ PROC_LINKS(execute_arbitrary_command, 0), "execute_arbitrary_command", 25, "Execute a 'long form' command.", 30, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 750 }, -{ PROC_LINKS(execute_previous_cli, 0), "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "/home/allen/4ed/code/4coder_system_command.cpp", 46, 14 }, -{ PROC_LINKS(exit_4coder, 0), "exit_4coder", 11, "Attempts to close 4coder.", 25, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 661 }, -{ PROC_LINKS(goto_first_jump_direct, 0), "goto_first_jump_direct", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "/home/allen/4ed/code/4coder_jump_direct.cpp", 43, 100 }, -{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "/home/allen/4ed/code/4coder_jump_sticky.cpp", 43, 562 }, -{ PROC_LINKS(goto_first_jump_sticky, 0), "goto_first_jump_sticky", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "/home/allen/4ed/code/4coder_jump_sticky.cpp", 43, 544 }, -{ PROC_LINKS(goto_jump_at_cursor_direct, 0), "goto_jump_at_cursor_direct", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "/home/allen/4ed/code/4coder_jump_direct.cpp", 43, 24 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel_direct, 0), "goto_jump_at_cursor_same_panel_direct", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list..", 168, "/home/allen/4ed/code/4coder_jump_direct.cpp", 43, 45 }, -{ PROC_LINKS(goto_jump_at_cursor_same_panel_sticky, 0), "goto_jump_at_cursor_same_panel_sticky", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "/home/allen/4ed/code/4coder_jump_sticky.cpp", 43, 388 }, -{ PROC_LINKS(goto_jump_at_cursor_sticky, 0), "goto_jump_at_cursor_sticky", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "/home/allen/4ed/code/4coder_jump_sticky.cpp", 43, 360 }, -{ PROC_LINKS(goto_line, 0), "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 671 }, -{ PROC_LINKS(goto_next_jump_direct, 0), "goto_next_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "/home/allen/4ed/code/4coder_jump_direct.cpp", 43, 64 }, -{ PROC_LINKS(goto_next_jump_no_skips_direct, 0), "goto_next_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "/home/allen/4ed/code/4coder_jump_direct.cpp", 43, 82 }, -{ PROC_LINKS(goto_next_jump_no_skips_sticky, 0), "goto_next_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "/home/allen/4ed/code/4coder_jump_sticky.cpp", 43, 513 }, -{ PROC_LINKS(goto_next_jump_sticky, 0), "goto_next_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "/home/allen/4ed/code/4coder_jump_sticky.cpp", 43, 483 }, -{ PROC_LINKS(goto_prev_jump_direct, 0), "goto_prev_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "/home/allen/4ed/code/4coder_jump_direct.cpp", 43, 73 }, -{ PROC_LINKS(goto_prev_jump_no_skips_direct, 0), "goto_prev_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "/home/allen/4ed/code/4coder_jump_direct.cpp", 43, 91 }, -{ PROC_LINKS(goto_prev_jump_no_skips_sticky, 0), "goto_prev_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "/home/allen/4ed/code/4coder_jump_sticky.cpp", 43, 529 }, -{ PROC_LINKS(goto_prev_jump_sticky, 0), "goto_prev_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "/home/allen/4ed/code/4coder_jump_sticky.cpp", 43, 499 }, -{ PROC_LINKS(hide_filebar, 0), "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 555 }, -{ PROC_LINKS(hide_scrollbar, 0), "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 541 }, -{ PROC_LINKS(highlight_next_scope_absolute, 0), "highlight_next_scope_absolute", 29, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "/home/allen/4ed/code/4coder_scope_commands.cpp", 46, 368 }, -{ PROC_LINKS(highlight_prev_scope_absolute, 0), "highlight_prev_scope_absolute", 29, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "/home/allen/4ed/code/4coder_scope_commands.cpp", 46, 387 }, -{ PROC_LINKS(highlight_surrounding_scope, 0), "highlight_surrounding_scope", 27, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "/home/allen/4ed/code/4coder_scope_commands.cpp", 46, 346 }, -{ PROC_LINKS(if0_off, 0), "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 537 }, -{ PROC_LINKS(increase_face_size, 0), "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 603 }, -{ PROC_LINKS(increase_line_wrap, 0), "increase_line_wrap", 18, "Increases the current buffer's width for line wrapping.", 55, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 581 }, -{ PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1201 }, -{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1177 }, -{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1183 }, -{ PROC_LINKS(interactive_open_or_new, 0), "interactive_open_or_new", 23, "Interactively opens or creates a new file.", 42, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1189 }, -{ PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1195 }, -{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1219 }, -{ PROC_LINKS(kill_rect, 0), "kill_rect", 9, "Delete characters in a rectangular region. Range testing is done by unwrapped-xy coordinates.", 93, "/home/allen/4ed/code/power/4coder_experiments.cpp", 49, 31 }, -{ PROC_LINKS(left_adjust_view, 0), "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 151 }, -{ PROC_LINKS(list_all_functions_current_buffer, 0), "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "/home/allen/4ed/code/4coder_function_list.cpp", 45, 348 }, -{ PROC_LINKS(list_all_locations, 0), "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "/home/allen/4ed/code/4coder_search.cpp", 38, 698 }, -{ PROC_LINKS(list_all_locations_case_insensitive, 0), "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "/home/allen/4ed/code/4coder_search.cpp", 38, 718 }, -{ PROC_LINKS(list_all_locations_of_identifier, 0), "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "/home/allen/4ed/code/4coder_search.cpp", 38, 782 }, -{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "/home/allen/4ed/code/4coder_search.cpp", 38, 788 }, -{ PROC_LINKS(list_all_locations_of_selection, 0), "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "/home/allen/4ed/code/4coder_search.cpp", 38, 830 }, -{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "/home/allen/4ed/code/4coder_search.cpp", 38, 836 }, -{ PROC_LINKS(list_all_locations_of_type_definition, 0), "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 454 }, -{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), "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, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 466 }, -{ PROC_LINKS(list_all_substring_locations, 0), "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "/home/allen/4ed/code/4coder_search.cpp", 38, 708 }, -{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), "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, "/home/allen/4ed/code/4coder_search.cpp", 38, 728 }, -{ PROC_LINKS(load_project, 0), "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, "/home/allen/4ed/code/4coder_project_commands.cpp", 48, 408 }, -{ PROC_LINKS(make_directory_query, 0), "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1130 }, -{ PROC_LINKS(miblo_decrement_basic, 0), "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "/home/allen/4ed/code/power/4coder_miblo_numbers.cpp", 51, 119 }, -{ PROC_LINKS(miblo_decrement_time_stamp, 0), "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "/home/allen/4ed/code/power/4coder_miblo_numbers.cpp", 51, 392 }, -{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "/home/allen/4ed/code/power/4coder_miblo_numbers.cpp", 51, 404 }, -{ PROC_LINKS(miblo_increment_basic, 0), "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "/home/allen/4ed/code/power/4coder_miblo_numbers.cpp", 51, 103 }, -{ PROC_LINKS(miblo_increment_time_stamp, 0), "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "/home/allen/4ed/code/power/4coder_miblo_numbers.cpp", 51, 386 }, -{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "/home/allen/4ed/code/power/4coder_miblo_numbers.cpp", 51, 398 }, -{ PROC_LINKS(move_down, 0), "move_down", 9, "Moves the cursor down one line.", 31, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 233 }, -{ PROC_LINKS(move_down_10, 0), "move_down_10", 12, "Moves the cursor down ten lines.", 32, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 245 }, -{ PROC_LINKS(move_down_textual, 0), "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 318 }, -{ PROC_LINKS(move_left, 0), "move_left", 9, "Moves the cursor one character to the left.", 43, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 286 }, -{ PROC_LINKS(move_line_down, 0), "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 330 }, -{ PROC_LINKS(move_line_up, 0), "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 271 }, -{ PROC_LINKS(move_right, 0), "move_right", 10, "Moves the cursor one character to the right.", 44, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 295 }, -{ PROC_LINKS(move_up, 0), "move_up", 7, "Moves the cursor up one line.", 29, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 227 }, -{ PROC_LINKS(move_up_10, 0), "move_up_10", 10, "Moves the cursor up ten lines.", 30, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 239 }, -{ PROC_LINKS(multi_line_edit, 0), "multi_line_edit", 15, "Begin multi-line mode. In multi-line mode characters are inserted at every line between the mark and cursor. All characters are inserted at the same character offset into the line. This mode uses line_char coordinates.", 221, "/home/allen/4ed/code/power/4coder_experiments.cpp", 49, 122 }, -{ PROC_LINKS(newline_or_goto_position_direct, 0), "newline_or_goto_position_direct", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "/home/allen/4ed/code/4coder_jump_direct.cpp", 43, 117 }, -{ PROC_LINKS(newline_or_goto_position_same_panel_direct, 0), "newline_or_goto_position_same_panel_direct", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "/home/allen/4ed/code/4coder_jump_direct.cpp", 43, 132 }, -{ PROC_LINKS(newline_or_goto_position_same_panel_sticky, 0), "newline_or_goto_position_same_panel_sticky", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "/home/allen/4ed/code/4coder_jump_sticky.cpp", 43, 600 }, -{ PROC_LINKS(newline_or_goto_position_sticky, 0), "newline_or_goto_position_sticky", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "/home/allen/4ed/code/4coder_jump_sticky.cpp", 43, 585 }, -{ PROC_LINKS(open_all_code, 0), "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, "/home/allen/4ed/code/4coder_project_commands.cpp", 48, 165 }, -{ PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "/home/allen/4ed/code/4coder_project_commands.cpp", 48, 180 }, -{ PROC_LINKS(open_color_tweaker, 0), "open_color_tweaker", 18, "Opens the 4coder colors and fonts selector menu.", 48, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1225 }, -{ PROC_LINKS(open_debug, 0), "open_debug", 10, "Opens a debug view for internal use.", 36, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1231 }, -{ PROC_LINKS(open_file_in_quotes, 0), "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 634 }, -{ PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file, displaying it in the other view.", 127, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 651 }, -{ PROC_LINKS(open_long_braces, 0), "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 513 }, -{ PROC_LINKS(open_long_braces_break, 0), "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 529 }, -{ PROC_LINKS(open_long_braces_semicolon, 0), "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 521 }, -{ PROC_LINKS(open_matching_file_cpp, 0), "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 707 }, -{ PROC_LINKS(open_panel_hsplit, 0), "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "/home/allen/4ed/code/4coder_default_framework.h", 47, 170 }, -{ PROC_LINKS(open_panel_vsplit, 0), "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "/home/allen/4ed/code/4coder_default_framework.h", 47, 161 }, -{ PROC_LINKS(page_down, 0), "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 276 }, -{ PROC_LINKS(page_up, 0), "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 267 }, -{ PROC_LINKS(paste, 0), "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "/home/allen/4ed/code/4coder_clipboard.cpp", 41, 70 }, -{ PROC_LINKS(paste_and_indent, 0), "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 391 }, -{ PROC_LINKS(paste_next, 0), "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "/home/allen/4ed/code/4coder_clipboard.cpp", 41, 108 }, -{ PROC_LINKS(paste_next_and_indent, 0), "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 398 }, -{ PROC_LINKS(place_in_scope, 0), "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "/home/allen/4ed/code/4coder_scope_commands.cpp", 46, 486 }, -{ PROC_LINKS(project_fkey_command, 0), "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, "/home/allen/4ed/code/4coder_project_commands.cpp", 48, 575 }, -{ PROC_LINKS(project_go_to_root_directory, 0), "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, "/home/allen/4ed/code/4coder_project_commands.cpp", 48, 601 }, -{ PROC_LINKS(query_replace, 0), "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 983 }, -{ PROC_LINKS(query_replace_identifier, 0), "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, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1004 }, -{ PROC_LINKS(query_replace_selection, 0), "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, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 240 }, -{ PROC_LINKS(redo, 0), "redo", 4, "Advances forewards through the undo history.", 44, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1171 }, -{ PROC_LINKS(reload_current_project, 0), "reload_current_project", 22, "If a project file has already been loaded, reloads the same file. Useful for when the project configuration is changed.", 120, "/home/allen/4ed/code/4coder_project_commands.cpp", 48, 479 }, -{ PROC_LINKS(remap_interactive, 0), "remap_interactive", 17, "Switch to a named key binding map.", 34, "/home/allen/4ed/code/4coder_default_framework.h", 47, 743 }, -{ PROC_LINKS(rename_file_query, 0), "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1088 }, -{ PROC_LINKS(rename_parameter, 0), "rename_parameter", 16, "If the cursor is found to be on the name of a function parameter in the signature of a function definition, all occurences within the scope of the function will be replaced with a new provided string.", 200, "/home/allen/4ed/code/power/4coder_experiments.cpp", 49, 387 }, -{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1207 }, -{ PROC_LINKS(replace_all_occurrences, 0), "replace_all_occurrences", 23, "Queries the user for two strings, and replaces all occurrences of the first string with the second string in all open buffers.", 126, "/home/allen/4ed/code/power/4coder_experiments.cpp", 49, 773 }, -{ PROC_LINKS(replace_in_range, 0), "replace_in_range", 16, "Queries the user for two strings, and replaces all occurences of the first string in the range between the cursor and the mark with the second string.", 150, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 880 }, -{ PROC_LINKS(reverse_search, 0), "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 851 }, -{ PROC_LINKS(reverse_search_identifier, 0), "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 869 }, -{ PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1213 }, -{ PROC_LINKS(save_all_dirty_buffers, 0), "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1027 }, -{ PROC_LINKS(scope_absorb_down, 0), "scope_absorb_down", 17, "If a scope is currently selected, and a statement or block statement is present below the current scope, the statement is moved into the scope.", 143, "/home/allen/4ed/code/4coder_scope_commands.cpp", 46, 751 }, -{ PROC_LINKS(search, 0), "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 844 }, -{ PROC_LINKS(search_identifier, 0), "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 858 }, -{ PROC_LINKS(seek_alphanumeric_left, 0), "seek_alphanumeric_left", 22, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 128 }, -{ PROC_LINKS(seek_alphanumeric_or_camel_left, 0), "seek_alphanumeric_or_camel_left", 31, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 136 }, -{ PROC_LINKS(seek_alphanumeric_or_camel_right, 0), "seek_alphanumeric_or_camel_right", 32, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 132 }, -{ PROC_LINKS(seek_alphanumeric_right, 0), "seek_alphanumeric_right", 23, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 124 }, -{ PROC_LINKS(seek_beginning_of_line, 0), "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 361 }, -{ PROC_LINKS(seek_beginning_of_textual_line, 0), "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 339 }, -{ PROC_LINKS(seek_end_of_line, 0), "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 374 }, -{ PROC_LINKS(seek_end_of_textual_line, 0), "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 350 }, -{ PROC_LINKS(seek_token_left, 0), "seek_token_left", 15, "Seek left for the next beginning of a token.", 44, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 112 }, -{ PROC_LINKS(seek_token_right, 0), "seek_token_right", 16, "Seek right for the next end of a token.", 39, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 108 }, -{ PROC_LINKS(seek_white_or_token_left, 0), "seek_white_or_token_left", 24, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 120 }, -{ PROC_LINKS(seek_white_or_token_right, 0), "seek_white_or_token_right", 25, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 116 }, -{ PROC_LINKS(seek_whitespace_down, 0), "seek_whitespace_down", 20, "Seeks the cursor down to the next blank line.", 45, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 328 }, -{ PROC_LINKS(seek_whitespace_down_end_line, 0), "seek_whitespace_down_end_line", 29, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 394 }, -{ PROC_LINKS(seek_whitespace_left, 0), "seek_whitespace_left", 20, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 104 }, -{ PROC_LINKS(seek_whitespace_right, 0), "seek_whitespace_right", 21, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 100 }, -{ PROC_LINKS(seek_whitespace_up, 0), "seek_whitespace_up", 18, "Seeks the cursor up to the next blank line.", 43, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 317 }, -{ PROC_LINKS(seek_whitespace_up_end_line, 0), "seek_whitespace_up_end_line", 27, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 387 }, -{ PROC_LINKS(select_all, 0), "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 304 }, -{ PROC_LINKS(set_bindings_choose, 0), "set_bindings_choose", 19, "Remap keybindings using the 'choose' mapping rule.", 50, "/home/allen/4ed/code/4coder_remapping_commands.cpp", 50, 49 }, -{ PROC_LINKS(set_bindings_default, 0), "set_bindings_default", 20, "Remap keybindings using the 'default' mapping rule.", 51, "/home/allen/4ed/code/4coder_remapping_commands.cpp", 50, 63 }, -{ PROC_LINKS(set_bindings_mac_default, 0), "set_bindings_mac_default", 24, "Remap keybindings using the 'mac-default' mapping rule.", 55, "/home/allen/4ed/code/4coder_remapping_commands.cpp", 50, 77 }, -{ PROC_LINKS(set_mark, 0), "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 100 }, -{ PROC_LINKS(setup_new_project, 0), "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "/home/allen/4ed/code/4coder_project_commands.cpp", 48, 658 }, -{ PROC_LINKS(show_filebar, 0), "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 548 }, -{ PROC_LINKS(show_scrollbar, 0), "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 534 }, -{ PROC_LINKS(snipe_token_or_word, 0), "snipe_token_or_word", 19, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 187 }, -{ PROC_LINKS(snipe_token_or_word_right, 0), "snipe_token_or_word_right", 25, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 211 }, -{ PROC_LINKS(suppress_mouse, 0), "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "/home/allen/4ed/code/4coder_default_framework.h", 47, 226 }, -{ PROC_LINKS(swap_buffers_between_panels, 0), "swap_buffers_between_panels", 27, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 731 }, -{ PROC_LINKS(to_lowercase, 0), "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 426 }, -{ PROC_LINKS(to_uppercase, 0), "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 406 }, -{ PROC_LINKS(toggle_filebar, 0), "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 562 }, -{ PROC_LINKS(toggle_fullscreen, 0), "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "/home/allen/4ed/code/4coder_default_framework.h", 47, 244 }, -{ PROC_LINKS(toggle_line_wrap, 0), "toggle_line_wrap", 16, "Toggles the current buffer's line wrapping status.", 50, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 571 }, -{ PROC_LINKS(toggle_mouse, 0), "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "/home/allen/4ed/code/4coder_default_framework.h", 47, 238 }, -{ PROC_LINKS(toggle_show_whitespace, 0), "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 638 }, -{ PROC_LINKS(toggle_virtual_whitespace, 0), "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 627 }, -{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history.", 44, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 1165 }, -{ PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 721 }, -{ PROC_LINKS(word_complete, 0), "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "/home/allen/4ed/code/4coder_search.cpp", 38, 859 }, -{ PROC_LINKS(write_and_auto_tab, 0), "write_and_auto_tab", 18, "Inserts a character and auto-indents the line on which the cursor sits.", 71, "/home/allen/4ed/code/4coder_auto_indent.cpp", 43, 683 }, -{ PROC_LINKS(write_block, 0), "write_block", 11, "At the cursor, insert a block comment.", 38, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 584 }, -{ PROC_LINKS(write_character, 0), "write_character", 15, "Inserts whatever character was used to trigger this command.", 60, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 47 }, -{ PROC_LINKS(write_explicit_enum_flags, 0), "write_explicit_enum_flags", 25, "If the cursor is found to be on the '{' of an enum definition, the values of the enum will be filled in to give each a unique power of 2 value, starting from 1. Existing values are overwritten.", 194, "/home/allen/4ed/code/power/4coder_experiments.cpp", 49, 709 }, -{ PROC_LINKS(write_explicit_enum_values, 0), "write_explicit_enum_values", 26, "If the cursor is found to be on the '{' of an enum definition, the values of the enum will be filled in sequentially starting from zero. Existing values are overwritten.", 170, "/home/allen/4ed/code/power/4coder_experiments.cpp", 49, 703 }, -{ PROC_LINKS(write_hack, 0), "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 572 }, -{ PROC_LINKS(write_note, 0), "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 578 }, -{ PROC_LINKS(write_todo, 0), "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 566 }, -{ PROC_LINKS(write_underscore, 0), "write_underscore", 16, "Inserts an underscore.", 22, "/home/allen/4ed/code/4coder_base_commands.cpp", 45, 56 }, -{ PROC_LINKS(write_zero_struct, 0), "write_zero_struct", 17, "At the cursor, insert a ' = {0};'.", 34, "/home/allen/4ed/code/4coder_default_include.cpp", 47, 590 }, +{ PROC_LINKS(allow_mouse, 0), "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "C:\\work\\4ed\\code\\4coder_default_framework.h", 47, 232 }, +{ PROC_LINKS(auto_tab_line_at_cursor, 0), "auto_tab_line_at_cursor", 23, "Auto-indents the line on which the cursor sits.", 47, "C:\\work\\4ed\\code\\4coder_auto_indent.cpp", 43, 660 }, +{ PROC_LINKS(auto_tab_range, 0), "auto_tab_range", 14, "Auto-indents the range between the cursor and the mark.", 55, "C:\\work\\4ed\\code\\4coder_auto_indent.cpp", 43, 671 }, +{ PROC_LINKS(auto_tab_whole_file, 0), "auto_tab_whole_file", 19, "Audo-indents the entire current buffer.", 39, "C:\\work\\4ed\\code\\4coder_auto_indent.cpp", 43, 650 }, +{ PROC_LINKS(backspace_char, 0), "backspace_char", 14, "Deletes the character to the left of the cursor.", 48, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 81 }, +{ PROC_LINKS(backspace_word, 0), "backspace_word", 14, "Delete characters between the cursor position and the first alphanumeric boundary to the left.", 94, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 147 }, +{ PROC_LINKS(basic_change_active_panel, 0), "basic_change_active_panel", 25, "Change the currently active panel, moving to the panel with the next highest view_id. Will not skipe the build panel if it is open.", 132, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 514 }, +{ PROC_LINKS(build_in_build_panel, 0), "build_in_build_panel", 20, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.", 230, "C:\\work\\4ed\\code\\4coder_build_commands.cpp", 46, 203 }, +{ PROC_LINKS(build_search, 0), "build_search", 12, "Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*.", 153, "C:\\work\\4ed\\code\\4coder_build_commands.cpp", 46, 169 }, +{ PROC_LINKS(center_view, 0), "center_view", 11, "Centers the view vertically on the line on which the cursor sits.", 65, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 136 }, +{ PROC_LINKS(change_active_panel, 0), "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "C:\\work\\4ed\\code\\4coder_default_framework.h", 47, 125 }, +{ PROC_LINKS(change_active_panel_backwards, 0), "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "C:\\work\\4ed\\code\\4coder_default_framework.h", 47, 143 }, +{ PROC_LINKS(change_to_build_panel, 0), "change_to_build_panel", 21, "If the special build panel is open, makes the build panel the active panel.", 75, "C:\\work\\4ed\\code\\4coder_build_commands.cpp", 46, 225 }, +{ PROC_LINKS(clean_all_lines, 0), "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 446 }, +{ PROC_LINKS(click_set_cursor, 0), "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 190 }, +{ PROC_LINKS(click_set_mark, 0), "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 203 }, +{ PROC_LINKS(close_all_code, 0), "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 188 }, +{ PROC_LINKS(close_build_panel, 0), "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "C:\\work\\4ed\\code\\4coder_build_commands.cpp", 46, 219 }, +{ PROC_LINKS(close_panel, 0), "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 522 }, +{ PROC_LINKS(copy, 0), "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "C:\\work\\4ed\\code\\4coder_clipboard.cpp", 41, 52 }, +{ PROC_LINKS(cursor_mark_swap, 0), "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 109 }, +{ PROC_LINKS(cut, 0), "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "C:\\work\\4ed\\code\\4coder_clipboard.cpp", 41, 61 }, +{ PROC_LINKS(decrease_face_size, 0), "decrease_face_size", 18, "Decrease the size of the face used by the current buffer.", 57, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 615 }, +{ PROC_LINKS(decrease_line_wrap, 0), "decrease_line_wrap", 18, "Decrases the current buffer's width for line wrapping.", 54, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 592 }, +{ PROC_LINKS(delete_char, 0), "delete_char", 11, "Deletes the character to the right of the cursor.", 49, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 63 }, +{ PROC_LINKS(delete_current_scope, 0), "delete_current_scope", 20, "Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.", 99, "C:\\work\\4ed\\code\\4coder_scope_commands.cpp", 46, 492 }, +{ PROC_LINKS(delete_file_query, 0), "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1062 }, +{ PROC_LINKS(delete_line, 0), "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 369 }, +{ PROC_LINKS(delete_range, 0), "delete_range", 12, "Deletes the text in the range between the cursor and the mark.", 62, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 121 }, +{ PROC_LINKS(delete_word, 0), "delete_word", 11, "Delete characters between the cursor position and the first alphanumeric boundary to the right.", 95, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 167 }, +{ PROC_LINKS(duplicate_line, 0), "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 347 }, +{ PROC_LINKS(eol_dosify, 0), "eol_dosify", 10, "Puts the buffer in DOS line ending mode.", 40, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 645 }, +{ PROC_LINKS(eol_nixify, 0), "eol_nixify", 10, "Puts the buffer in NIX line ending mode.", 40, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 653 }, +{ PROC_LINKS(execute_any_cli, 0), "execute_any_cli", 15, "Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.", 133, "C:\\work\\4ed\\code\\4coder_system_command.cpp", 46, 30 }, +{ PROC_LINKS(execute_arbitrary_command, 0), "execute_arbitrary_command", 25, "Execute a 'long form' command.", 30, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 750 }, +{ PROC_LINKS(execute_previous_cli, 0), "execute_previous_cli", 20, "If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.", 126, "C:\\work\\4ed\\code\\4coder_system_command.cpp", 46, 14 }, +{ PROC_LINKS(exit_4coder, 0), "exit_4coder", 11, "Attempts to close 4coder.", 25, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 661 }, +{ PROC_LINKS(goto_first_jump_direct, 0), "goto_first_jump_direct", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "C:\\work\\4ed\\code\\4coder_jump_direct.cpp", 43, 100 }, +{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 562 }, +{ PROC_LINKS(goto_first_jump_sticky, 0), "goto_first_jump_sticky", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 544 }, +{ PROC_LINKS(goto_jump_at_cursor_direct, 0), "goto_jump_at_cursor_direct", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "C:\\work\\4ed\\code\\4coder_jump_direct.cpp", 43, 24 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel_direct, 0), "goto_jump_at_cursor_same_panel_direct", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list..", 168, "C:\\work\\4ed\\code\\4coder_jump_direct.cpp", 43, 45 }, +{ PROC_LINKS(goto_jump_at_cursor_same_panel_sticky, 0), "goto_jump_at_cursor_same_panel_sticky", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 388 }, +{ PROC_LINKS(goto_jump_at_cursor_sticky, 0), "goto_jump_at_cursor_sticky", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 360 }, +{ PROC_LINKS(goto_line, 0), "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 671 }, +{ PROC_LINKS(goto_next_jump_direct, 0), "goto_next_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "C:\\work\\4ed\\code\\4coder_jump_direct.cpp", 43, 64 }, +{ PROC_LINKS(goto_next_jump_no_skips_direct, 0), "goto_next_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "C:\\work\\4ed\\code\\4coder_jump_direct.cpp", 43, 82 }, +{ PROC_LINKS(goto_next_jump_no_skips_sticky, 0), "goto_next_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 513 }, +{ PROC_LINKS(goto_next_jump_sticky, 0), "goto_next_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 483 }, +{ PROC_LINKS(goto_prev_jump_direct, 0), "goto_prev_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "C:\\work\\4ed\\code\\4coder_jump_direct.cpp", 43, 73 }, +{ PROC_LINKS(goto_prev_jump_no_skips_direct, 0), "goto_prev_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "C:\\work\\4ed\\code\\4coder_jump_direct.cpp", 43, 91 }, +{ PROC_LINKS(goto_prev_jump_no_skips_sticky, 0), "goto_prev_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 529 }, +{ PROC_LINKS(goto_prev_jump_sticky, 0), "goto_prev_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 499 }, +{ PROC_LINKS(hide_filebar, 0), "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 555 }, +{ PROC_LINKS(hide_scrollbar, 0), "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 541 }, +{ PROC_LINKS(highlight_next_scope_absolute, 0), "highlight_next_scope_absolute", 29, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "C:\\work\\4ed\\code\\4coder_scope_commands.cpp", 46, 368 }, +{ PROC_LINKS(highlight_prev_scope_absolute, 0), "highlight_prev_scope_absolute", 29, "Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.", 103, "C:\\work\\4ed\\code\\4coder_scope_commands.cpp", 46, 387 }, +{ PROC_LINKS(highlight_surrounding_scope, 0), "highlight_surrounding_scope", 27, "Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.", 107, "C:\\work\\4ed\\code\\4coder_scope_commands.cpp", 46, 346 }, +{ PROC_LINKS(if0_off, 0), "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 537 }, +{ PROC_LINKS(increase_face_size, 0), "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 603 }, +{ PROC_LINKS(increase_line_wrap, 0), "increase_line_wrap", 18, "Increases the current buffer's width for line wrapping.", 55, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 581 }, +{ PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1201 }, +{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1177 }, +{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1183 }, +{ PROC_LINKS(interactive_open_or_new, 0), "interactive_open_or_new", 23, "Interactively opens or creates a new file.", 42, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1189 }, +{ PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1195 }, +{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1219 }, +{ PROC_LINKS(kill_rect, 0), "kill_rect", 9, "Delete characters in a rectangular region. Range testing is done by unwrapped-xy coordinates.", 93, "C:\\work\\4ed\\code\\power\\4coder_experiments.cpp", 50, 31 }, +{ PROC_LINKS(left_adjust_view, 0), "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 151 }, +{ PROC_LINKS(list_all_functions_current_buffer, 0), "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "C:\\work\\4ed\\code\\4coder_function_list.cpp", 45, 348 }, +{ PROC_LINKS(list_all_locations, 0), "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 698 }, +{ PROC_LINKS(list_all_locations_case_insensitive, 0), "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 718 }, +{ PROC_LINKS(list_all_locations_of_identifier, 0), "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 782 }, +{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 788 }, +{ PROC_LINKS(list_all_locations_of_selection, 0), "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 830 }, +{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 836 }, +{ PROC_LINKS(list_all_locations_of_type_definition, 0), "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 454 }, +{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), "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, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 466 }, +{ PROC_LINKS(list_all_substring_locations, 0), "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 708 }, +{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), "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, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 728 }, +{ PROC_LINKS(load_project, 0), "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, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 408 }, +{ PROC_LINKS(make_directory_query, 0), "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1130 }, +{ PROC_LINKS(miblo_decrement_basic, 0), "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "C:\\work\\4ed\\code\\power\\4coder_miblo_numbers.cpp", 52, 119 }, +{ PROC_LINKS(miblo_decrement_time_stamp, 0), "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "C:\\work\\4ed\\code\\power\\4coder_miblo_numbers.cpp", 52, 392 }, +{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "C:\\work\\4ed\\code\\power\\4coder_miblo_numbers.cpp", 52, 404 }, +{ PROC_LINKS(miblo_increment_basic, 0), "miblo_increment_basic", 21, "Increment an integer under the cursor by one.", 45, "C:\\work\\4ed\\code\\power\\4coder_miblo_numbers.cpp", 52, 103 }, +{ PROC_LINKS(miblo_increment_time_stamp, 0), "miblo_increment_time_stamp", 26, "Increment a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "C:\\work\\4ed\\code\\power\\4coder_miblo_numbers.cpp", 52, 386 }, +{ PROC_LINKS(miblo_increment_time_stamp_minute, 0), "miblo_increment_time_stamp_minute", 33, "Increment a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "C:\\work\\4ed\\code\\power\\4coder_miblo_numbers.cpp", 52, 398 }, +{ PROC_LINKS(move_down, 0), "move_down", 9, "Moves the cursor down one line.", 31, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 233 }, +{ PROC_LINKS(move_down_10, 0), "move_down_10", 12, "Moves the cursor down ten lines.", 32, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 245 }, +{ PROC_LINKS(move_down_textual, 0), "move_down_textual", 17, "Moves down to the next line of actual text, regardless of line wrapping.", 72, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 318 }, +{ PROC_LINKS(move_left, 0), "move_left", 9, "Moves the cursor one character to the left.", 43, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 286 }, +{ PROC_LINKS(move_line_down, 0), "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 330 }, +{ PROC_LINKS(move_line_up, 0), "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 271 }, +{ PROC_LINKS(move_right, 0), "move_right", 10, "Moves the cursor one character to the right.", 44, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 295 }, +{ PROC_LINKS(move_up, 0), "move_up", 7, "Moves the cursor up one line.", 29, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 227 }, +{ PROC_LINKS(move_up_10, 0), "move_up_10", 10, "Moves the cursor up ten lines.", 30, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 239 }, +{ PROC_LINKS(multi_line_edit, 0), "multi_line_edit", 15, "Begin multi-line mode. In multi-line mode characters are inserted at every line between the mark and cursor. All characters are inserted at the same character offset into the line. This mode uses line_char coordinates.", 221, "C:\\work\\4ed\\code\\power\\4coder_experiments.cpp", 50, 122 }, +{ PROC_LINKS(newline_or_goto_position_direct, 0), "newline_or_goto_position_direct", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "C:\\work\\4ed\\code\\4coder_jump_direct.cpp", 43, 117 }, +{ PROC_LINKS(newline_or_goto_position_same_panel_direct, 0), "newline_or_goto_position_same_panel_direct", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "C:\\work\\4ed\\code\\4coder_jump_direct.cpp", 43, 132 }, +{ PROC_LINKS(newline_or_goto_position_same_panel_sticky, 0), "newline_or_goto_position_same_panel_sticky", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 600 }, +{ PROC_LINKS(newline_or_goto_position_sticky, 0), "newline_or_goto_position_sticky", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 585 }, +{ PROC_LINKS(open_all_code, 0), "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, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 165 }, +{ PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 180 }, +{ PROC_LINKS(open_color_tweaker, 0), "open_color_tweaker", 18, "Opens the 4coder colors and fonts selector menu.", 48, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1225 }, +{ PROC_LINKS(open_debug, 0), "open_debug", 10, "Opens a debug view for internal use.", 36, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1231 }, +{ PROC_LINKS(open_file_in_quotes, 0), "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 634 }, +{ PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file, displaying it in the other view.", 127, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 651 }, +{ PROC_LINKS(open_long_braces, 0), "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 513 }, +{ PROC_LINKS(open_long_braces_break, 0), "open_long_braces_break", 22, "At the cursor, insert a '{' and '}break;' separated by a blank line.", 68, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 529 }, +{ PROC_LINKS(open_long_braces_semicolon, 0), "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 521 }, +{ PROC_LINKS(open_matching_file_cpp, 0), "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 707 }, +{ PROC_LINKS(open_panel_hsplit, 0), "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "C:\\work\\4ed\\code\\4coder_default_framework.h", 47, 170 }, +{ PROC_LINKS(open_panel_vsplit, 0), "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "C:\\work\\4ed\\code\\4coder_default_framework.h", 47, 161 }, +{ PROC_LINKS(page_down, 0), "page_down", 9, "Scrolls the view down one view height and moves the cursor down one view height.", 80, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 276 }, +{ PROC_LINKS(page_up, 0), "page_up", 7, "Scrolls the view up one view height and moves the cursor up one view height.", 76, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 267 }, +{ PROC_LINKS(paste, 0), "paste", 5, "At the cursor, insert the text at the top of the clipboard.", 59, "C:\\work\\4ed\\code\\4coder_clipboard.cpp", 41, 70 }, +{ PROC_LINKS(paste_and_indent, 0), "paste_and_indent", 16, "Paste from the top of clipboard and run auto-indent on the newly pasted text.", 77, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 391 }, +{ PROC_LINKS(paste_next, 0), "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "C:\\work\\4ed\\code\\4coder_clipboard.cpp", 41, 108 }, +{ PROC_LINKS(paste_next_and_indent, 0), "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 398 }, +{ PROC_LINKS(place_in_scope, 0), "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "C:\\work\\4ed\\code\\4coder_scope_commands.cpp", 46, 486 }, +{ PROC_LINKS(project_fkey_command, 0), "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, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 575 }, +{ PROC_LINKS(project_go_to_root_directory, 0), "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, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 601 }, +{ PROC_LINKS(query_replace, 0), "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 983 }, +{ PROC_LINKS(query_replace_identifier, 0), "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, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1004 }, +{ PROC_LINKS(query_replace_selection, 0), "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, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 240 }, +{ PROC_LINKS(redo, 0), "redo", 4, "Advances forewards through the undo history.", 44, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1171 }, +{ PROC_LINKS(reload_current_project, 0), "reload_current_project", 22, "If a project file has already been loaded, reloads the same file. Useful for when the project configuration is changed.", 120, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 479 }, +{ PROC_LINKS(remap_interactive, 0), "remap_interactive", 17, "Switch to a named key binding map.", 34, "C:\\work\\4ed\\code\\4coder_default_framework.h", 47, 743 }, +{ PROC_LINKS(rename_file_query, 0), "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1088 }, +{ PROC_LINKS(rename_parameter, 0), "rename_parameter", 16, "If the cursor is found to be on the name of a function parameter in the signature of a function definition, all occurences within the scope of the function will be replaced with a new provided string.", 200, "C:\\work\\4ed\\code\\power\\4coder_experiments.cpp", 50, 387 }, +{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1207 }, +{ PROC_LINKS(replace_all_occurrences, 0), "replace_all_occurrences", 23, "Queries the user for two strings, and replaces all occurrences of the first string with the second string in all open buffers.", 126, "C:\\work\\4ed\\code\\power\\4coder_experiments.cpp", 50, 773 }, +{ PROC_LINKS(replace_in_range, 0), "replace_in_range", 16, "Queries the user for two strings, and replaces all occurences of the first string in the range between the cursor and the mark with the second string.", 150, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 880 }, +{ PROC_LINKS(reverse_search, 0), "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 851 }, +{ PROC_LINKS(reverse_search_identifier, 0), "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 869 }, +{ PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1213 }, +{ PROC_LINKS(save_all_dirty_buffers, 0), "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1027 }, +{ PROC_LINKS(scope_absorb_down, 0), "scope_absorb_down", 17, "If a scope is currently selected, and a statement or block statement is present below the current scope, the statement is moved into the scope.", 143, "C:\\work\\4ed\\code\\4coder_scope_commands.cpp", 46, 751 }, +{ PROC_LINKS(search, 0), "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 844 }, +{ PROC_LINKS(search_identifier, 0), "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 858 }, +{ PROC_LINKS(seek_alphanumeric_left, 0), "seek_alphanumeric_left", 22, "Seek left for boundary between alphanumeric characters and non-alphanumeric characters.", 87, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 128 }, +{ PROC_LINKS(seek_alphanumeric_or_camel_left, 0), "seek_alphanumeric_or_camel_left", 31, "Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 106, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 136 }, +{ PROC_LINKS(seek_alphanumeric_or_camel_right, 0), "seek_alphanumeric_or_camel_right", 32, "Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.", 107, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 132 }, +{ PROC_LINKS(seek_alphanumeric_right, 0), "seek_alphanumeric_right", 23, "Seek right for boundary between alphanumeric characters and non-alphanumeric characters.", 88, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 124 }, +{ PROC_LINKS(seek_beginning_of_line, 0), "seek_beginning_of_line", 22, "Seeks the cursor to the beginning of the visual line.", 53, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 361 }, +{ PROC_LINKS(seek_beginning_of_textual_line, 0), "seek_beginning_of_textual_line", 30, "Seeks the cursor to the beginning of the line across all text.", 62, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 339 }, +{ PROC_LINKS(seek_end_of_line, 0), "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 374 }, +{ PROC_LINKS(seek_end_of_textual_line, 0), "seek_end_of_textual_line", 24, "Seeks the cursor to the end of the line across all text.", 56, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 350 }, +{ PROC_LINKS(seek_token_left, 0), "seek_token_left", 15, "Seek left for the next beginning of a token.", 44, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 112 }, +{ PROC_LINKS(seek_token_right, 0), "seek_token_right", 16, "Seek right for the next end of a token.", 39, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 108 }, +{ PROC_LINKS(seek_white_or_token_left, 0), "seek_white_or_token_left", 24, "Seek left for the next end of a token or boundary between whitespace and non-whitespace.", 88, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 120 }, +{ PROC_LINKS(seek_white_or_token_right, 0), "seek_white_or_token_right", 25, "Seek right for the next end of a token or boundary between whitespace and non-whitespace.", 89, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 116 }, +{ PROC_LINKS(seek_whitespace_down, 0), "seek_whitespace_down", 20, "Seeks the cursor down to the next blank line.", 45, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 328 }, +{ PROC_LINKS(seek_whitespace_down_end_line, 0), "seek_whitespace_down_end_line", 29, "Seeks the cursor down to the next blank line and places it at the end of the line.", 82, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 394 }, +{ PROC_LINKS(seek_whitespace_left, 0), "seek_whitespace_left", 20, "Seek left for the next boundary between whitespace and non-whitespace.", 70, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 104 }, +{ PROC_LINKS(seek_whitespace_right, 0), "seek_whitespace_right", 21, "Seek right for the next boundary between whitespace and non-whitespace.", 71, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 100 }, +{ PROC_LINKS(seek_whitespace_up, 0), "seek_whitespace_up", 18, "Seeks the cursor up to the next blank line.", 43, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 317 }, +{ PROC_LINKS(seek_whitespace_up_end_line, 0), "seek_whitespace_up_end_line", 27, "Seeks the cursor up to the next blank line and places it at the end of the line.", 80, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 387 }, +{ PROC_LINKS(select_all, 0), "select_all", 10, "Puts the cursor at the top of the file, and the mark at the bottom of the file.", 79, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 304 }, +{ PROC_LINKS(set_bindings_choose, 0), "set_bindings_choose", 19, "Remap keybindings using the 'choose' mapping rule.", 50, "C:\\work\\4ed\\code\\4coder_remapping_commands.cpp", 50, 49 }, +{ PROC_LINKS(set_bindings_default, 0), "set_bindings_default", 20, "Remap keybindings using the 'default' mapping rule.", 51, "C:\\work\\4ed\\code\\4coder_remapping_commands.cpp", 50, 63 }, +{ PROC_LINKS(set_bindings_mac_default, 0), "set_bindings_mac_default", 24, "Remap keybindings using the 'mac-default' mapping rule.", 55, "C:\\work\\4ed\\code\\4coder_remapping_commands.cpp", 50, 77 }, +{ PROC_LINKS(set_mark, 0), "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 100 }, +{ PROC_LINKS(setup_new_project, 0), "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 658 }, +{ PROC_LINKS(show_filebar, 0), "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 548 }, +{ PROC_LINKS(show_scrollbar, 0), "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 534 }, +{ PROC_LINKS(snipe_token_or_word, 0), "snipe_token_or_word", 19, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 187 }, +{ PROC_LINKS(snipe_token_or_word_right, 0), "snipe_token_or_word_right", 25, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 211 }, +{ PROC_LINKS(suppress_mouse, 0), "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "C:\\work\\4ed\\code\\4coder_default_framework.h", 47, 226 }, +{ PROC_LINKS(swap_buffers_between_panels, 0), "swap_buffers_between_panels", 27, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 731 }, +{ PROC_LINKS(to_lowercase, 0), "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 426 }, +{ PROC_LINKS(to_uppercase, 0), "to_uppercase", 12, "Converts all ascii text in the range between the cursor and the mark to uppercase.", 82, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 406 }, +{ PROC_LINKS(toggle_filebar, 0), "toggle_filebar", 14, "Toggles the visibility status of the current view's filebar.", 60, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 562 }, +{ PROC_LINKS(toggle_fullscreen, 0), "toggle_fullscreen", 17, "Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.", 89, "C:\\work\\4ed\\code\\4coder_default_framework.h", 47, 244 }, +{ PROC_LINKS(toggle_line_wrap, 0), "toggle_line_wrap", 16, "Toggles the current buffer's line wrapping status.", 50, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 571 }, +{ PROC_LINKS(toggle_mouse, 0), "toggle_mouse", 12, "Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.", 71, "C:\\work\\4ed\\code\\4coder_default_framework.h", 47, 238 }, +{ PROC_LINKS(toggle_show_whitespace, 0), "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 638 }, +{ PROC_LINKS(toggle_virtual_whitespace, 0), "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 627 }, +{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history.", 44, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1165 }, +{ PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 721 }, +{ PROC_LINKS(word_complete, 0), "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 859 }, +{ PROC_LINKS(write_and_auto_tab, 0), "write_and_auto_tab", 18, "Inserts a character and auto-indents the line on which the cursor sits.", 71, "C:\\work\\4ed\\code\\4coder_auto_indent.cpp", 43, 683 }, +{ PROC_LINKS(write_block, 0), "write_block", 11, "At the cursor, insert a block comment.", 38, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 584 }, +{ PROC_LINKS(write_character, 0), "write_character", 15, "Inserts whatever character was used to trigger this command.", 60, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 47 }, +{ PROC_LINKS(write_explicit_enum_flags, 0), "write_explicit_enum_flags", 25, "If the cursor is found to be on the '{' of an enum definition, the values of the enum will be filled in to give each a unique power of 2 value, starting from 1. Existing values are overwritten.", 194, "C:\\work\\4ed\\code\\power\\4coder_experiments.cpp", 50, 709 }, +{ PROC_LINKS(write_explicit_enum_values, 0), "write_explicit_enum_values", 26, "If the cursor is found to be on the '{' of an enum definition, the values of the enum will be filled in sequentially starting from zero. Existing values are overwritten.", 170, "C:\\work\\4ed\\code\\power\\4coder_experiments.cpp", 50, 703 }, +{ PROC_LINKS(write_hack, 0), "write_hack", 10, "At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.", 99, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 572 }, +{ PROC_LINKS(write_note, 0), "write_note", 10, "At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.", 99, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 578 }, +{ PROC_LINKS(write_todo, 0), "write_todo", 10, "At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.", 99, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 566 }, +{ PROC_LINKS(write_underscore, 0), "write_underscore", 16, "Inserts an underscore.", 22, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 56 }, +{ PROC_LINKS(write_zero_struct, 0), "write_zero_struct", 17, "At the cursor, insert a ' = {0};'.", 34, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 590 }, }; static int32_t fcoder_metacmd_ID_allow_mouse = 0; static int32_t fcoder_metacmd_ID_auto_tab_line_at_cursor = 1; diff --git a/4coder_helper/4coder_bind_helper.h b/4coder_helper/4coder_bind_helper.h index 45845151..1253262f 100644 --- a/4coder_helper/4coder_bind_helper.h +++ b/4coder_helper/4coder_bind_helper.h @@ -148,7 +148,7 @@ inherit_map(Bind_Helper *helper, int32_t mapid){ if (helper->group == 0 && helper->error == 0) helper->error = BH_ERR_MISSING_BEGIN; if (!helper->error && mapid < mapid_global) ++helper->header->header.user_map_count; - Binding_Unit unit; + Binding_Unit unit = {0}; unit.type = unit_inherit; unit.map_inherit.mapid = mapid; @@ -157,91 +157,91 @@ inherit_map(Bind_Helper *helper, int32_t mapid){ inline void set_hook(Bind_Helper *helper, int32_t hook_id, Hook_Function *func){ - Binding_Unit unit; + Binding_Unit unit = {0}; unit.type = unit_hook; unit.hook.hook_id = hook_id; - unit.hook.func = (void*) func; - + unit.hook.func = (void*)func; write_unit(helper, unit); } inline void set_scroll_rule(Bind_Helper *helper, Scroll_Rule_Function *func){ - Binding_Unit unit; + Binding_Unit unit = {0}; unit.type = unit_hook; unit.hook.hook_id = special_hook_scroll_rule; - unit.hook.func = (void*) func; - + unit.hook.func = (void*)func; + write_unit(helper, unit); +} + +inline void +set_buffer_name_resolver(Bind_Helper *helper, Buffer_Name_Resolver_Function *func){ + Binding_Unit unit = {0}; + unit.type = unit_hook; + unit.hook.hook_id = special_hook_buffer_name_resolver; + unit.hook.func = (void*)func; write_unit(helper, unit); } inline void set_new_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){ - Binding_Unit unit; + Binding_Unit unit = {0}; unit.type = unit_hook; unit.hook.hook_id = special_hook_new_file; - unit.hook.func = (void*) func; - + unit.hook.func = (void*)func; write_unit(helper, unit); } inline void set_start_hook(Bind_Helper *helper, Start_Hook_Function *func){ - Binding_Unit unit; + Binding_Unit unit = {0}; unit.type = unit_hook; unit.hook.hook_id = special_hook_start; - unit.hook.func = (void*) func; - + unit.hook.func = (void*)func; write_unit(helper, unit); } inline void set_open_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){ - Binding_Unit unit; + Binding_Unit unit = {0}; unit.type = unit_hook; unit.hook.hook_id = special_hook_open_file; - unit.hook.func = (void*) func; - + unit.hook.func = (void*)func; write_unit(helper, unit); } inline void set_save_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){ - Binding_Unit unit; + Binding_Unit unit = {0}; unit.type = unit_hook; unit.hook.hook_id = special_hook_save_file; - unit.hook.func = (void*) func; - + unit.hook.func = (void*)func; write_unit(helper, unit); } inline void set_end_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){ - Binding_Unit unit; + Binding_Unit unit = {0}; unit.type = unit_hook; unit.hook.hook_id = special_hook_end_file; - unit.hook.func = (void*) func; - + unit.hook.func = (void*)func; write_unit(helper, unit); } inline void set_command_caller(Bind_Helper *helper, Command_Caller_Hook_Function *func){ - Binding_Unit unit; + Binding_Unit unit = {0}; unit.type = unit_hook; unit.hook.hook_id = special_hook_command_caller; - unit.hook.func = (void*) func; - + unit.hook.func = (void*)func; write_unit(helper, unit); } inline void set_input_filter(Bind_Helper *helper, Input_Filter_Function *func){ - Binding_Unit unit; + Binding_Unit unit = {0}; unit.type = unit_hook; unit.hook.hook_id = special_hook_input_filter; - unit.hook.func = (void*) func; - + unit.hook.func = (void*)func; write_unit(helper, unit); } diff --git a/4coder_project_commands.cpp b/4coder_project_commands.cpp index 9e67881d..17c3e94d 100644 --- a/4coder_project_commands.cpp +++ b/4coder_project_commands.cpp @@ -399,7 +399,7 @@ load_project_from_config_data(Application_Links *app, Partition *part, char *con append(&builder, "4coder: "); append(&builder, project_dir); terminate_with_null(&builder); - set_title(app, builder.str); + set_window_title(app, builder.str); } end_temp_memory(temp); diff --git a/4coder_search.cpp b/4coder_search.cpp index c544171d..cb901108 100644 --- a/4coder_search.cpp +++ b/4coder_search.cpp @@ -185,7 +185,7 @@ seek_potential_match(Application_Links *app, Search_Range *range, Search_Key key | OptFlag(!forward, BufferSeekString_Backward); result->buffer = get_buffer(app, range->buffer, AccessAll); - int32_t best_pos = 0; + int32_t best_pos = -1; if (forward){ best_pos = end_pos; } @@ -195,7 +195,7 @@ seek_potential_match(Application_Links *app, Search_Range *range, Search_Key key int32_t new_pos = -1; buffer_seek_string(app, &result->buffer, start_pos, end_pos, range->start, word.str, word.size, &new_pos, flags); - if (new_pos >= 0){ + if (new_pos >= 0 && new_pos < end_pos){ if (forward){ if (new_pos < best_pos){ best_pos = new_pos; diff --git a/4ed.cpp b/4ed.cpp index 51eeab85..e743951c 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -549,14 +549,6 @@ COMMAND_DECL(save){ } } -COMMAND_DECL(save_as){ - USE_MODELS(models); - USE_VIEW(view); - REQ_FILE(file, view); - - view_show_interactive(system, view, models, IAct_Save_As, IInt_Sys_File_List, make_lit_string("Save As: ")); -} - COMMAND_DECL(change_active_panel){ USE_MODELS(models); USE_PANEL(panel); @@ -937,6 +929,11 @@ interpret_binding_buffer(Models *models, void *buffer, i32 size){ models->scroll_rule = (Scroll_Rule_Function*)unit->hook.func; }break; + case special_hook_buffer_name_resolver: + { + models->buffer_name_resolver = (Buffer_Name_Resolver_Function*)unit->hook.func; + }break; + case special_hook_input_filter: { models->input_filter = (Input_Filter_Function*)unit->hook.func; @@ -1031,7 +1028,6 @@ setup_command_table(){ SET(interactive_open_or_new); SET(interactive_switch_buffer); SET(interactive_kill_buffer); - SET(save_as); SET(reopen); SET(save); @@ -1455,7 +1451,7 @@ App_Init_Sig(app_init){ for (i32 i = 0; i < ArrayCount(init_files); ++i){ Editing_File *file = working_set_alloc_always(&models->working_set, general); - buffer_bind_name(general, &models->working_set, file, init_files[i].name); + buffer_bind_name(models, general, &models->working_set, file, init_files[i].name); if (init_files[i].read_only){ init_read_only_file(system, models, file); @@ -1518,9 +1514,9 @@ App_Step_Sig(app_step){ for (;system->get_file_change(buffer, buffer_size, &mem_too_small, &size);){ Assert(!mem_too_small); - Editing_File_Canon_Name canon = {0}; + Editing_File_Name canon = {0}; if (get_canon_name(system, &canon, make_string(buffer, size))){ - Editing_File *file = working_set_canon_contains(working_set, canon.name); + Editing_File *file = working_set_contains_canon(working_set, canon.name); if (file != 0){ if (file->state.ignore_behind_os == 0){ @@ -1732,7 +1728,7 @@ App_Step_Sig(app_step){ cl_filename.size = cl_filename_len; String filename = {0}; - Editing_File_Canon_Name canon_name; + Editing_File_Name canon_name = {0}; if (get_canon_name(system, &canon_name, make_string_slowly(models->settings.init_files[i]))){ filename = canon_name.name; } diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index cd3b395f..df345b50 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -36,8 +36,8 @@ fill_buffer_summary(Buffer_Summary *buffer, Editing_File *file, Working_Set *wor buffer->file_name_len = file->canon.name.size; buffer->file_name = file->canon.name.str; - buffer->buffer_name_len = file->name.live_name.size; - buffer->buffer_name = file->name.live_name.str; + buffer->buffer_name_len = file->name.name.size; + buffer->buffer_name = file->name.name.str; buffer->dirty = file->state.dirty; @@ -114,7 +114,7 @@ get_file_from_identifier(System_Functions *system, Working_Set *working_set, Buf } else if (buffer.name){ String name = make_string(buffer.name, buffer.name_len); - file = working_set_name_contains(working_set, name); + file = working_set_contains_name(working_set, name); } return(file); @@ -276,14 +276,14 @@ DOC_SEE(Command_Line_Interface_Flag) if (file != 0){ if (file->settings.read_only == 0){ append(&feedback_str, make_lit_string("ERROR: ")); - append(&feedback_str, file->name.live_name); + append(&feedback_str, file->name.name); append(&feedback_str, make_lit_string(" is not a read-only buffer\n")); result = false; goto done; } if (file->settings.never_kill){ append(&feedback_str, make_lit_string("ERROR: The buffer ")); - append(&feedback_str, file->name.live_name); + append(&feedback_str, file->name.name); append(&feedback_str, make_lit_string(" is not killable")); result = false; goto done; @@ -300,7 +300,7 @@ DOC_SEE(Command_Line_Interface_Flag) } String name = make_string_terminated(part, buffer_id.name, buffer_id.name_len); - buffer_bind_name(general, working_set, file, name); + buffer_bind_name(models, general, working_set, file, name); init_read_only_file(system, models, file); } @@ -595,7 +595,7 @@ DOC_SEE(Access_Flag) Buffer_Summary buffer = {0}; Working_Set *working_set = &cmd->models->working_set; - Editing_File *file = working_set_name_contains(working_set, make_string(name, len)); + Editing_File *file = working_set_contains_name(working_set, make_string(name, len)); if (file != 0 && !file->is_dummy){ fill_buffer_summary(&buffer, file, working_set); if (!access_test(buffer.lock_flags, access)){ @@ -628,9 +628,9 @@ DOC_SEE(Access_Flag) Working_Set *working_set = &models->working_set; String fname = make_string(name, len); - Editing_File_Canon_Name canon = {0}; + Editing_File_Name canon = {0}; if (get_canon_name(system, &canon, fname)){ - Editing_File *file = working_set_canon_contains(working_set, canon.name); + Editing_File *file = working_set_contains_canon(working_set, canon.name); fill_buffer_summary(&buffer, file, working_set); if (!access_test(buffer.lock_flags, access)){ buffer = null_buffer_summary; @@ -1259,9 +1259,9 @@ DOC_SEE(Buffer_Create_Flag) String fname = make_string(filename, filename_len); Editing_File *file = 0; b32 do_new_file = false; - Editing_File_Canon_Name canon = {0}; + Editing_File_Name canon = {0}; if (get_canon_name(system, &canon, fname)){ - file = working_set_canon_contains(working_set, canon.name); + file = working_set_contains_canon(working_set, canon.name); } else{ do_new_file = true; @@ -1269,7 +1269,7 @@ DOC_SEE(Buffer_Create_Flag) // NOTE(allen): Try to get the file by buffer name. if (file == 0){ - file = working_set_name_contains(working_set, fname); + file = working_set_contains_name(working_set, fname); } // NOTE(allen): If there is still no file, create a new buffer. @@ -1292,7 +1292,7 @@ DOC_SEE(Buffer_Create_Flag) if (!(flags & BufferCreate_NeverNew)){ file = working_set_alloc_always(working_set, general); if (file != 0){ - buffer_bind_name(general, working_set, file, fname); + buffer_bind_name(models, general, working_set, file, fname); init_normal_file(system, models, file, 0, 0); fill_buffer_summary(&result, file, cmd); } @@ -1316,7 +1316,7 @@ DOC_SEE(Buffer_Create_Flag) file = working_set_alloc_always(working_set, general); if (file != 0){ buffer_bind_file(system, general, working_set, file, canon.name); - buffer_bind_name(general, working_set, file, fname); + buffer_bind_name(models, general, working_set, file, fname); init_normal_file(system, models, file, buffer, size); fill_buffer_summary(&result, file, cmd); } @@ -2827,7 +2827,7 @@ DOC(This call sends a signal to 4coder to attempt to exit. If there are unsaved } API_EXPORT void -Set_Title(Application_Links *app, char *title) +Set_Window_Title(Application_Links *app, char *title) /* DOC_PARAM(title, A null terminated string indicating the new title for the 4coder window.) DOC(Sets 4coder's window title to the specified title string.) diff --git a/4ed_app_models.h b/4ed_app_models.h index 0d504bbb..18d1e762 100644 --- a/4ed_app_models.h +++ b/4ed_app_models.h @@ -67,6 +67,7 @@ struct Models{ Command_Caller_Hook_Function *command_caller; Input_Filter_Function *input_filter; Scroll_Rule_Function *scroll_rule; + Buffer_Name_Resolver_Function *buffer_name_resolver; Style_Library styles; u32 *palette; diff --git a/4ed_file.cpp b/4ed_file.cpp index fc4506a5..65528693 100644 --- a/4ed_file.cpp +++ b/4ed_file.cpp @@ -153,21 +153,13 @@ struct Editing_File_State{ global_const Editing_File_State null_editing_file_state = {0}; struct Editing_File_Name{ - char live_name_[256]; - //char source_path_[256]; - char extension_[16]; - String live_name; - //String source_path; - String extension; -}; - -struct Editing_File_Canon_Name{ char name_[256]; String name; }; struct File_Node{ - File_Node *next, *prev; + File_Node *next; + File_Node *prev; }; struct Editing_File{ @@ -179,9 +171,8 @@ struct Editing_File{ Editing_File_State state; Editing_File_Markers markers; Editing_File_Name name; - Editing_File_Canon_Name canon; + Editing_File_Name canon; Buffer_Slot_ID id; - //u64 unique_buffer_id; }; static Editing_File null_editing_file = {0}; diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp index 39d21319..79083d14 100644 --- a/4ed_file_view.cpp +++ b/4ed_file_view.cpp @@ -568,34 +568,6 @@ save_file(System_Functions *system, Models *models, Editing_File *file){ return(result); } -internal b32 -buffer_link_to_new_file(System_Functions *system, General_Memory *general, Working_Set *working_set, - Editing_File *file, String filename){ - b32 result = 0; - - Editing_File_Canon_Name canon_name; - if (get_canon_name(system, &canon_name, filename)){ - buffer_unbind_name(working_set, file); - if (file->canon.name.size != 0){ - buffer_unbind_file(system, working_set, file); - } - buffer_bind_file(system, general, working_set, file, canon_name.name); - buffer_bind_name(general, working_set, file, filename); - result = 1; - } - - return(result); -} - -inline b32 -file_save_and_set_names(System_Functions *system, Models *models, Editing_File *file, String filename){ - b32 result = buffer_link_to_new_file(system, &models->mem.general, &models->working_set, file, filename); - if (result){ - result = save_file(system, models, file); - } - return(result); -} - enum{ GROW_FAILED, GROW_NOT_NEEDED, @@ -1757,8 +1729,12 @@ file_measure_wraps_and_fix_cursor(System_Functions *system, Models *models, Edit // // +enum{ + FileCreateFlag_ReadOnly = 1, +}; + internal void -file_create_from_string(System_Functions *system, Models *models, Editing_File *file, String val, b8 read_only = 0){ +file_create_from_string(System_Functions *system, Models *models, Editing_File *file, String val, u32 flags){ PRFL_FUNC_GROUP(); General_Memory *general = &models->mem.general; @@ -1802,8 +1778,8 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File * file_measure_wraps(system, models, file, font); } - file->settings.read_only = read_only; - if (!read_only){ + file->settings.read_only = ((flags & FileCreateFlag_ReadOnly) != 0); + if (!file->settings.read_only){ // TODO(allen): Redo undo system (if you don't mind the pun) i32 request_size = KB(64); file->state.undo.undo.max = request_size; @@ -3670,7 +3646,7 @@ init_normal_file(System_Functions *system, Models *models, Editing_File *file, c PRFL_FUNC_GROUP(); String val = make_string(buffer, size); - file_create_from_string(system, models, file, val); + file_create_from_string(system, models, file, val, 0); if (file->settings.tokens_exist && file->state.token_array.tokens == 0){ if (!file->settings.virtual_white){ @@ -3685,7 +3661,7 @@ init_normal_file(System_Functions *system, Models *models, Editing_File *file, c internal void init_read_only_file(System_Functions *system, Models *models, Editing_File *file){ String val = null_string; - file_create_from_string(system, models, file, val, 1); + file_create_from_string(system, models, file, val, FileCreateFlag_ReadOnly); if (file->settings.tokens_exist && file->state.token_array.tokens == 0){ if (!file->settings.virtual_white){ @@ -3697,17 +3673,34 @@ init_read_only_file(System_Functions *system, Models *models, Editing_File *file } } +internal void +buffer_bind_name(Models *models, General_Memory *general, Working_Set *working_set, Editing_File *file, String file_name){ + Editing_File_Name new_name = {0}; + editing_file_name_init(&new_name); + copy(&new_name.name, front_of_directory(file_name)); + if (models->buffer_name_resolver != 0){ + models->buffer_name_resolver(&models->app_links, file_name.str, file_name.size, new_name.name.str, &new_name.name.size, new_name.name.memory_size); + if (new_name.name.size < 0){ + new_name.name.size = 0; + } + if (new_name.name.size > new_name.name.memory_size){ + new_name.name.size = new_name.name.memory_size; + } + } + buffer_bind_name_low_level(general, working_set, file, new_name.name); +} + internal Editing_File* open_file(System_Functions *system, Models *models, String filename){ Working_Set *working_set = &models->working_set; Editing_File *file = 0; if (terminate_with_null(&filename)){ - Editing_File_Canon_Name canon_name; + Editing_File_Name canon_name = {0}; if (get_canon_name(system, &canon_name, filename)){ - file = working_set_canon_contains(working_set, canon_name.name); + file = working_set_contains_canon(working_set, canon_name.name); - if (!file){ + if (file == 0){ Plat_Handle handle; if (system->load_handle(canon_name.name.str, &handle)){ Mem_Options *mem = &models->mem; @@ -3716,7 +3709,7 @@ open_file(System_Functions *system, Models *models, String filename){ file = working_set_alloc_always(working_set, general); buffer_bind_file(system, general, working_set, file, canon_name.name); - buffer_bind_name(general, working_set, file, filename); + buffer_bind_name(models, general, working_set, file, filename); i32 size = system->load_size(handle); Partition *part = &mem->part; @@ -3761,25 +3754,17 @@ view_open_file(System_Functions *system, Models *models, View *view, String file } } -internal void -view_interactive_save_as(System_Functions *system, Models *models, Editing_File *file, String filename){ - if (terminate_with_null(&filename)){ - file_save_and_set_names(system, models, file, filename); - } -} - internal void view_interactive_new_file(System_Functions *system, Models *models, View *view, String filename){ Working_Set *working_set = &models->working_set; Editing_File *file = 0; if (terminate_with_null(&filename)){ - Editing_File_Canon_Name canon_name; - + Editing_File_Name canon_name = {0}; if (get_canon_name(system, &canon_name, filename)){ + file = working_set_contains_canon(working_set, canon_name.name); - file = working_set_canon_contains(working_set, canon_name.name); - if (file){ + if (file != 0){ file_clear(system, models, file); } else{ @@ -3789,7 +3774,7 @@ view_interactive_new_file(System_Functions *system, Models *models, View *view, file = working_set_alloc_always(working_set, general); buffer_bind_file(system, general, working_set, file, canon_name.name); - buffer_bind_name(general, working_set, file, filename); + buffer_bind_name(models, general, working_set, file, filename); init_normal_file(system, models, file, 0, 0); } @@ -3810,7 +3795,7 @@ kill_file(System_Functions *system, Models *models, Editing_File *file){ models->hook_end_file(&models->app_links, file->id.id); } - buffer_unbind_name(working_set, file); + buffer_unbind_name_low_level(working_set, file); if (file->canon.name.size != 0){ buffer_unbind_file(system, working_set, file); } @@ -3837,13 +3822,13 @@ kill_file(System_Functions *system, Models *models, Editing_File *file){ internal void kill_file_by_name(System_Functions *system, Models *models, String name){ - Editing_File *file = working_set_name_contains(&models->working_set, name); + Editing_File *file = working_set_contains_name(&models->working_set, name); kill_file(system, models, file); } internal void save_file_by_name(System_Functions *system, Models *models, String name){ - Editing_File *file = working_set_name_contains(&models->working_set, name); + Editing_File *file = working_set_contains_name(&models->working_set, name); if (file != 0){ save_file(system, models, file); } @@ -3852,7 +3837,7 @@ save_file_by_name(System_Functions *system, Models *models, String name){ internal void interactive_begin_sure_to_kill(System_Functions *system, View *view, Models *models, Editing_File *file){ view_show_interactive(system, view, models, IAct_Sure_To_Kill, IInt_Sure_To_Kill, make_lit_string("Are you sure?")); - copy_ss(&view->dest, file->name.live_name); + copy_ss(&view->dest, file->name.name); } enum Try_Kill_Result{ @@ -3892,7 +3877,7 @@ internal b32 interactive_try_kill_file_by_name(System_Functions *system, Models *models, View *view, String name){ b32 kill_dialogue = 0; - Editing_File *file = working_set_name_contains(&models->working_set, name); + Editing_File *file = working_set_contains_name(&models->working_set, name); if (file){ kill_dialogue = interactive_try_kill_file(system, models, view, file); } @@ -3909,12 +3894,6 @@ interactive_view_complete(System_Functions *system, View *view, Models *models, view_show_file(view, models); }break; - case IAct_Save_As: - { - view_interactive_save_as(system, models, view->file_data.file, dest); - view_show_file(view, models); - }break; - case IAct_New: if (dest.size > 0 && !char_is_slash(dest.str[dest.size-1])){ view_interactive_new_file(system, models, view, dest); @@ -3932,7 +3911,7 @@ interactive_view_complete(System_Functions *system, View *view, Models *models, case IAct_Switch: { - Editing_File *file = working_set_name_contains(&models->working_set, dest); + Editing_File *file = working_set_contains_name(&models->working_set, dest); if (file){ view_set_file(system, view, file, models); } @@ -4112,7 +4091,7 @@ get_exhaustive_info(System_Functions *system, Working_Set *working_set, Exhausti append_sc(&loop->full_path, result.info->filename); terminate_with_null(&loop->full_path); - Editing_File *file = working_set_canon_contains(working_set, loop->full_path); + Editing_File *file = working_set_contains_canon(working_set, loop->full_path); String filename = make_string_cap(result.info->filename, result.info->filename_len, result.info->filename_len+1); @@ -4891,7 +4870,7 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ b32 autocomplete_with_enter = true; b32 activate_directly = false; - if (view->action == IAct_Save_As || view->action == IAct_New){ + if (view->action == IAct_New){ autocomplete_with_enter = false; } @@ -4899,7 +4878,6 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ switch (view->action){ case IAct_OpenOrNew: case IAct_Open: message = make_lit_string("Open: "); break; - case IAct_Save_As: message = make_lit_string("Save As: "); break; case IAct_New: message = make_lit_string("New: "); break; } @@ -5057,13 +5035,13 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ Editing_File *file = (Editing_File*)node; Assert(!file->is_dummy); - if (wildcard_match_s(&absolutes, file->name.live_name, 0) != 0){ + if (wildcard_match_s(&absolutes, file->name.name, 0) != 0){ View_Iter iter = file_view_iter_init(layout, file, 0); if (file_view_iter_good(iter)){ reserved_files[reserved_top++] = file; } else{ - if (file->name.live_name.str[0] == '*'){ + if (file->name.name.str[0] == '*'){ reserved_files[reserved_top++] = file; } else{ @@ -5076,9 +5054,9 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ } id.id[0] = (u64)(file); - if (gui_do_file_option(target, id, file->name.live_name, 0, message)){ + if (gui_do_file_option(target, id, file->name.name, 0, message)){ complete = 1; - copy_ss(&comp_dest, file->name.live_name); + copy_ss(&comp_dest, file->name.name); } } } @@ -5097,9 +5075,9 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ } id.id[0] = (u64)(file); - if (gui_do_file_option(target, id, file->name.live_name, 0, message)){ + if (gui_do_file_option(target, id, file->name.name, 0, message)){ complete = 1; - copy_ss(&comp_dest, file->name.live_name); + copy_ss(&comp_dest, file->name.name); } } @@ -5411,7 +5389,7 @@ step_file_view(System_Functions *system, View *view, Models *models, View *activ Editing_File *file = view_ptr->file_data.file; append_ss(&string, make_lit_string(" > buffer: ")); if (file){ - append_ss(&string, file->name.live_name); + append_ss(&string, file->name.name); gui_do_text_field(target, string, empty_str); string.size = 0; append_ss(&string, make_lit_string(" >> buffer-slot-id: ")); @@ -6203,7 +6181,7 @@ draw_file_bar(System_Functions *system, Render_Target *target, View *view, Model Assert(file); - intbar_draw_string(system, target, &bar, file->name.live_name, base_color); + intbar_draw_string(system, target, &bar, file->name.name, base_color); intbar_draw_string(system, target, &bar, make_lit_string(" -"), base_color); if (file->is_loading){ diff --git a/4ed_view.cpp b/4ed_view.cpp index 6ce82002..f90d284a 100644 --- a/4ed_view.cpp +++ b/4ed_view.cpp @@ -32,7 +32,6 @@ global File_Viewing_Data null_file_viewing_data = {0}; enum Interactive_Action{ IAct_Open, - IAct_Save_As, IAct_New, IAct_OpenOrNew, IAct_Switch, diff --git a/4ed_working_set.cpp b/4ed_working_set.cpp index 4150c39f..f802f081 100644 --- a/4ed_working_set.cpp +++ b/4ed_working_set.cpp @@ -266,9 +266,8 @@ working_set_remove_basic(Working_Set *working_set, Table *table, String name){ } internal Editing_File* -working_set_canon_contains(Working_Set *working_set, String name){ - Editing_File *result = - working_set_contains_basic(working_set, &working_set->canon_table, name); +working_set_contains_canon(Working_Set *working_set, String name){ + Editing_File *result = working_set_contains_basic(working_set, &working_set->canon_table, name); return(result); } @@ -284,20 +283,19 @@ working_set_canon_remove(Working_Set *working_set, String name){ } internal Editing_File* -working_set_name_contains(Working_Set *working_set, String name){ - Editing_File *result = - working_set_contains_basic(working_set, &working_set->name_table, name); +working_set_contains_name(Working_Set *working_set, String name){ + Editing_File *result = working_set_contains_basic(working_set, &working_set->name_table, name); return(result); } internal b32 -working_set_name_add(General_Memory *general, Working_Set *working_set, Editing_File *file, String name){ +working_set_add_name(General_Memory *general, Working_Set *working_set, Editing_File *file, String name){ b32 result = working_set_add_basic(general, working_set, &working_set->name_table, file, name); return(result); } internal void -working_set_name_remove(Working_Set *working_set, String name){ +working_set_remove_name(Working_Set *working_set, String name){ working_set_remove_basic(working_set, &working_set->name_table, name); } @@ -313,7 +311,7 @@ working_set_lookup_file(Working_Set *working_set, String string){ used_nodes = &working_set->used_sentinel; for (dll_items(node, used_nodes)){ file = (Editing_File*)node; - if (string.size == 0 || match_ss(string, file->name.live_name)){ + if (string.size == 0 || match_ss(string, file->name.name)){ break; } } @@ -325,7 +323,7 @@ working_set_lookup_file(Working_Set *working_set, String string){ used_nodes = &working_set->used_sentinel; for (dll_items(node, used_nodes)){ file = (Editing_File*)node; - if (string.size == 0 || has_substr_s(file->name.live_name, string)){ + if (string.size == 0 || has_substr_s(file->name.name, string)){ break; } } @@ -351,13 +349,11 @@ touch_file(Working_Set *working_set, Editing_File *file){ internal void editing_file_name_init(Editing_File_Name *name){ - name->live_name = make_fixed_width_string(name->live_name_); - //name->source_path = make_fixed_width_string(name->source_path_); - name->extension = make_fixed_width_string(name->extension_); + name->name = make_fixed_width_string(name->name_); } internal b32 -get_canon_name(System_Functions *system, Editing_File_Canon_Name *canon_name, String filename){ +get_canon_name(System_Functions *system, Editing_File_Name *canon_name, String filename){ canon_name->name = make_fixed_width_string(canon_name->name_); canon_name->name.size = system->get_canonical(filename.str, filename.size, canon_name->name.str, canon_name->name.memory_size); @@ -367,64 +363,9 @@ get_canon_name(System_Functions *system, Editing_File_Canon_Name *canon_name, St return(result); } -internal void -buffer_get_new_name(Working_Set *working_set, Editing_File_Name *name, String filename){ - Assert(name->live_name.str != 0); - - //copy_checked_ss(&name->source_path, filename); - copy_ss(&name->live_name, front_of_directory(filename)); - - String ext = file_extension(filename); - copy_ss(&name->extension, ext); -#if 0 - if (name->source_path.size == name->live_name.size){ - name->extension.size = 0; - } - else{ - String ext = file_extension(filename); - copy_ss(&name->extension, ext); - } -#endif - - { - i32 original_len = name->live_name.size; - i32 file_x = 0; - b32 hit_conflict = 1; - while (hit_conflict){ - hit_conflict = 0; - - File_Node *used_nodes = &working_set->used_sentinel, *node; - for (dll_items(node, used_nodes)){ - Editing_File *file_ptr = (Editing_File*)node; - if (file_is_ready(file_ptr)){ - if (match_ss(name->live_name, file_ptr->name.live_name)){ - ++file_x; - hit_conflict = 1; - break; - } - } - } - - if (hit_conflict){ - name->live_name.size = original_len; - append_ss(&name->live_name, make_lit_string(" <")); - append_int_to_str(&name->live_name, file_x); - append_s_char(&name->live_name, '>'); - } - } - } -} - -inline void -buffer_get_new_name(Working_Set *working_set, Editing_File_Name *name, char *filename){ - String f = make_string_slowly(filename); - buffer_get_new_name(working_set, name, f); -} - internal void buffer_bind_file(System_Functions *system, General_Memory *general, Working_Set *working_set, Editing_File *file, String canon_filename){ - Assert(file->name.live_name.size == 0 && file->name.extension.size == 0); - //&& file->name.source_path.size == 0); + Assert(file->name.name.size == 0); Assert(file->canon.name.size == 0); file->canon.name = make_fixed_width_string(file->canon.name_); @@ -437,8 +378,7 @@ buffer_bind_file(System_Functions *system, General_Memory *general, Working_Set internal void buffer_unbind_file(System_Functions *system, Working_Set *working_set, Editing_File *file){ - Assert(file->name.live_name.size == 0 && file->name.extension.size == 0); - // && file->name.source_path.size == 0 + Assert(file->name.name.size == 0); Assert(file->canon.name.size != 0); system->remove_listener(file->canon.name_); @@ -446,34 +386,62 @@ buffer_unbind_file(System_Functions *system, Working_Set *working_set, Editing_F file->canon.name.size = 0; } -internal void -buffer_bind_name(General_Memory *general, Working_Set *working_set, Editing_File *file, String filename){ - Assert(file->name.live_name.size == 0 && - file->name.extension.size == 0); - // && file->name.source_path.size == 0 +internal b32 +buffer_name_has_conflict(Working_Set *working_set, String base_name){ + b32 hit_conflict = false; - Editing_File_Name new_name; + File_Node *used_nodes = &working_set->used_sentinel; + for (File_Node *node = used_nodes->next; node != used_nodes; node = node->next){ + Editing_File *file_ptr = (Editing_File*)node; + if (file_is_ready(file_ptr) && match_ss(base_name, file_ptr->name.name)){ + hit_conflict = true; + break; + } + } + + return(hit_conflict); +} + +internal void +buffer_resolve_name_low_level(Working_Set *working_set, Editing_File_Name *name, String base_name){ + Assert(name->name.str != 0); + + copy_ss(&name->name, base_name); + + i32 original_len = name->name.size; + i32 file_x = 0; + for (b32 hit_conflict = true; hit_conflict;){ + hit_conflict = buffer_name_has_conflict(working_set, name->name); + if (hit_conflict){ + ++file_x; + name->name.size = original_len; + append_ss(&name->name, make_lit_string(" ##")); + append_int_to_str(&name->name, file_x); + } + } +} + +internal void +buffer_bind_name_low_level(General_Memory *general, Working_Set *working_set, Editing_File *file, String name){ + Assert(file->name.name.size == 0); + + Editing_File_Name new_name = {0}; editing_file_name_init(&new_name); - buffer_get_new_name(working_set, &new_name, filename); + buffer_resolve_name_low_level(working_set, &new_name, name); editing_file_name_init(&file->name); - copy_ss(&file->name.live_name, new_name.live_name); - //copy_ss(&file->name.source_path, new_name.source_path); - copy_ss(&file->name.extension, new_name.extension); + copy_ss(&file->name.name, new_name.name); - b32 result = working_set_name_add(general, working_set, file, file->name.live_name); + b32 result = working_set_add_name(general, working_set, file, file->name.name); Assert(result); AllowLocal(result); } internal void -buffer_unbind_name(Working_Set *working_set, Editing_File *file){ - Assert(file->name.live_name.size != 0); - working_set_name_remove(working_set, file->name.live_name); - file->name.live_name.size = 0; - //file->name.source_path.size = 0; - file->name.extension.size = 0; +buffer_unbind_name_low_level(Working_Set *working_set, Editing_File *file){ + Assert(file->name.name.size != 0); + working_set_remove_name(working_set, file->name.name); + file->name.name.size = 0; } - // BOTTOM diff --git a/power/4coder_experiments.cpp b/power/4coder_experiments.cpp index 6cd8a501..f7a2d274 100644 --- a/power/4coder_experiments.cpp +++ b/power/4coder_experiments.cpp @@ -836,6 +836,7 @@ get_bindings(void *data, int32_t size){ set_command_caller(context, default_command_caller); set_scroll_rule(context, smooth_scroll_rule); + set_buffer_name_resolver(context, default_buffer_name_resolution); default_keys(context);