Finished the bindings.html generator (mostly), fixed the windows crash bug (major

This commit is contained in:
Allen Webster 2017-11-18 17:40:10 -05:00
parent 15d6ccf27f
commit 818e3781df
22 changed files with 2819 additions and 902 deletions

View File

@ -5,14 +5,14 @@
#include <stdint.h> #include <stdint.h>
#include "version.h" #include "version.h"
#include "keycodes.h" #include "4coder_generated/keycodes.h"
#include "style.h" #include "4coder_generated/style.h"
// TODO(allen): I don't like having to pull in the types from my standalone libraries to define the API. // TODO(allen): I don't like having to pull in the types from my standalone libraries to define the API.
// What to do??? Hmmm.... // What to do??? Hmmm....
#include "4coder_lib/4coder_string.h" #include "4coder_lib/4coder_string.h"
#include "4cpp/4cpp_lexer_types.h" #include "4cpp/4cpp_lexer_types.h"
#include "types.h" #include "types.h"
#include "app_functions.h" #include "4coder_generated/app_functions.h"
extern "C" _GET_VERSION_SIG(get_alpha_4coder_version){ extern "C" _GET_VERSION_SIG(get_alpha_4coder_version){
int32_t result = (maj == MAJOR && min == MINOR && patch == PATCH); int32_t result = (maj == MAJOR && min == MINOR && patch == PATCH);

View File

@ -1,73 +0,0 @@
enum{
key_back = 55296,
key_up = 55297,
key_down = 55298,
key_left = 55299,
key_right = 55300,
key_del = 55301,
key_insert = 55302,
key_home = 55303,
key_end = 55304,
key_page_up = 55305,
key_page_down = 55306,
key_esc = 55307,
key_mouse_left = 55308,
key_mouse_right = 55309,
key_mouse_left_release = 55310,
key_mouse_right_release = 55311,
key_f1 = 55312,
key_f2 = 55313,
key_f3 = 55314,
key_f4 = 55315,
key_f5 = 55316,
key_f6 = 55317,
key_f7 = 55318,
key_f8 = 55319,
key_f9 = 55320,
key_f10 = 55321,
key_f11 = 55322,
key_f12 = 55323,
key_f13 = 55324,
key_f14 = 55325,
key_f15 = 55326,
key_f16 = 55327,
};
static char*
global_key_name(uint32_t key_code, int32_t *size){
char *result = 0;
switch(key_code){
case key_back: result = "back"; *size = sizeof("back")-1; break;
case key_up: result = "up"; *size = sizeof("up")-1; break;
case key_down: result = "down"; *size = sizeof("down")-1; break;
case key_left: result = "left"; *size = sizeof("left")-1; break;
case key_right: result = "right"; *size = sizeof("right")-1; break;
case key_del: result = "del"; *size = sizeof("del")-1; break;
case key_insert: result = "insert"; *size = sizeof("insert")-1; break;
case key_home: result = "home"; *size = sizeof("home")-1; break;
case key_end: result = "end"; *size = sizeof("end")-1; break;
case key_page_up: result = "page_up"; *size = sizeof("page_up")-1; break;
case key_page_down: result = "page_down"; *size = sizeof("page_down")-1; break;
case key_esc: result = "esc"; *size = sizeof("esc")-1; break;
case key_mouse_left: result = "mouse_left"; *size = sizeof("mouse_left")-1; break;
case key_mouse_right: result = "mouse_right"; *size = sizeof("mouse_right")-1; break;
case key_mouse_left_release: result = "mouse_left_release"; *size = sizeof("mouse_left_release")-1; break;
case key_mouse_right_release: result = "mouse_right_release"; *size = sizeof("mouse_right_release")-1; break;
case key_f1: result = "f1"; *size = sizeof("f1")-1; break;
case key_f2: result = "f2"; *size = sizeof("f2")-1; break;
case key_f3: result = "f3"; *size = sizeof("f3")-1; break;
case key_f4: result = "f4"; *size = sizeof("f4")-1; break;
case key_f5: result = "f5"; *size = sizeof("f5")-1; break;
case key_f6: result = "f6"; *size = sizeof("f6")-1; break;
case key_f7: result = "f7"; *size = sizeof("f7")-1; break;
case key_f8: result = "f8"; *size = sizeof("f8")-1; break;
case key_f9: result = "f9"; *size = sizeof("f9")-1; break;
case key_f10: result = "f10"; *size = sizeof("f10")-1; break;
case key_f11: result = "f11"; *size = sizeof("f11")-1; break;
case key_f12: result = "f12"; *size = sizeof("f12")-1; break;
case key_f13: result = "f13"; *size = sizeof("f13")-1; break;
case key_f14: result = "f14"; *size = sizeof("f14")-1; break;
case key_f15: result = "f15"; *size = sizeof("f15")-1; break;
case key_f16: result = "f16"; *size = sizeof("f16")-1; break;
}
return(result);
}

View File

@ -0,0 +1,539 @@
#define command_id(c) (fcoder_metacmd_ID_##c)
#define command_metadata(c) (&fcoder_metacmd_table[command_id(c)])
#define command_metadata_by_id(id) (&fcoder_metacmd_table[id])
#define command_one_past_last_id 172
#if defined(CUSTOM_COMMAND_SIG)
#define PROC_LINKS(x,y) x
#else
#define PROC_LINKS(x,y) y
#endif
#if defined(CUSTOM_COMMAND_SIG)
CUSTOM_COMMAND_SIG(auto_tab_whole_file);
CUSTOM_COMMAND_SIG(auto_tab_line_at_cursor);
CUSTOM_COMMAND_SIG(auto_tab_range);
CUSTOM_COMMAND_SIG(write_and_auto_tab);
CUSTOM_COMMAND_SIG(write_character);
CUSTOM_COMMAND_SIG(delete_char);
CUSTOM_COMMAND_SIG(backspace_char);
CUSTOM_COMMAND_SIG(set_mark);
CUSTOM_COMMAND_SIG(cursor_mark_swap);
CUSTOM_COMMAND_SIG(delete_range);
CUSTOM_COMMAND_SIG(center_view);
CUSTOM_COMMAND_SIG(left_adjust_view);
CUSTOM_COMMAND_SIG(click_set_cursor);
CUSTOM_COMMAND_SIG(click_set_mark);
CUSTOM_COMMAND_SIG(move_up);
CUSTOM_COMMAND_SIG(move_down);
CUSTOM_COMMAND_SIG(move_up_10);
CUSTOM_COMMAND_SIG(move_down_10);
CUSTOM_COMMAND_SIG(page_up);
CUSTOM_COMMAND_SIG(page_down);
CUSTOM_COMMAND_SIG(move_left);
CUSTOM_COMMAND_SIG(move_right);
CUSTOM_COMMAND_SIG(select_all);
CUSTOM_COMMAND_SIG(seek_whitespace_up);
CUSTOM_COMMAND_SIG(seek_whitespace_down);
CUSTOM_COMMAND_SIG(seek_beginning_of_textual_line);
CUSTOM_COMMAND_SIG(seek_end_of_textual_line);
CUSTOM_COMMAND_SIG(seek_beginning_of_line);
CUSTOM_COMMAND_SIG(seek_end_of_line);
CUSTOM_COMMAND_SIG(seek_whitespace_up_end_line);
CUSTOM_COMMAND_SIG(seek_whitespace_down_end_line);
CUSTOM_COMMAND_SIG(to_uppercase);
CUSTOM_COMMAND_SIG(to_lowercase);
CUSTOM_COMMAND_SIG(clean_all_lines);
CUSTOM_COMMAND_SIG(basic_change_active_panel);
CUSTOM_COMMAND_SIG(close_panel);
CUSTOM_COMMAND_SIG(show_scrollbar);
CUSTOM_COMMAND_SIG(hide_scrollbar);
CUSTOM_COMMAND_SIG(show_filebar);
CUSTOM_COMMAND_SIG(hide_filebar);
CUSTOM_COMMAND_SIG(toggle_filebar);
CUSTOM_COMMAND_SIG(toggle_line_wrap);
CUSTOM_COMMAND_SIG(increase_line_wrap);
CUSTOM_COMMAND_SIG(decrease_line_wrap);
CUSTOM_COMMAND_SIG(toggle_virtual_whitespace);
CUSTOM_COMMAND_SIG(toggle_show_whitespace);
CUSTOM_COMMAND_SIG(eol_dosify);
CUSTOM_COMMAND_SIG(eol_nixify);
CUSTOM_COMMAND_SIG(exit_4coder);
CUSTOM_COMMAND_SIG(goto_line);
CUSTOM_COMMAND_SIG(search);
CUSTOM_COMMAND_SIG(reverse_search);
CUSTOM_COMMAND_SIG(search_identifier);
CUSTOM_COMMAND_SIG(reverse_search_identifier);
CUSTOM_COMMAND_SIG(replace_in_range);
CUSTOM_COMMAND_SIG(query_replace);
CUSTOM_COMMAND_SIG(query_replace_identifier);
CUSTOM_COMMAND_SIG(save_all_dirty_buffers);
CUSTOM_COMMAND_SIG(undo);
CUSTOM_COMMAND_SIG(redo);
CUSTOM_COMMAND_SIG(interactive_new);
CUSTOM_COMMAND_SIG(interactive_open);
CUSTOM_COMMAND_SIG(interactive_open_or_new);
CUSTOM_COMMAND_SIG(interactive_switch_buffer);
CUSTOM_COMMAND_SIG(interactive_kill_buffer);
CUSTOM_COMMAND_SIG(reopen);
CUSTOM_COMMAND_SIG(save);
CUSTOM_COMMAND_SIG(kill_buffer);
CUSTOM_COMMAND_SIG(open_color_tweaker);
CUSTOM_COMMAND_SIG(open_debug);
CUSTOM_COMMAND_SIG(build_search);
CUSTOM_COMMAND_SIG(build_in_build_panel);
CUSTOM_COMMAND_SIG(close_build_panel);
CUSTOM_COMMAND_SIG(change_to_build_panel);
CUSTOM_COMMAND_SIG(copy);
CUSTOM_COMMAND_SIG(cut);
CUSTOM_COMMAND_SIG(paste);
CUSTOM_COMMAND_SIG(paste_next);
CUSTOM_COMMAND_SIG(change_active_panel);
CUSTOM_COMMAND_SIG(change_active_panel_backwards);
CUSTOM_COMMAND_SIG(open_panel_vsplit);
CUSTOM_COMMAND_SIG(open_panel_hsplit);
CUSTOM_COMMAND_SIG(suppress_mouse);
CUSTOM_COMMAND_SIG(allow_mouse);
CUSTOM_COMMAND_SIG(toggle_mouse);
CUSTOM_COMMAND_SIG(toggle_fullscreen);
CUSTOM_COMMAND_SIG(remap_interactive);
CUSTOM_COMMAND_SIG(seek_whitespace_right);
CUSTOM_COMMAND_SIG(seek_whitespace_left);
CUSTOM_COMMAND_SIG(seek_token_right);
CUSTOM_COMMAND_SIG(seek_token_left);
CUSTOM_COMMAND_SIG(seek_white_or_token_right);
CUSTOM_COMMAND_SIG(seek_white_or_token_left);
CUSTOM_COMMAND_SIG(seek_alphanumeric_right);
CUSTOM_COMMAND_SIG(seek_alphanumeric_left);
CUSTOM_COMMAND_SIG(seek_alphanumeric_or_camel_right);
CUSTOM_COMMAND_SIG(seek_alphanumeric_or_camel_left);
CUSTOM_COMMAND_SIG(backspace_word);
CUSTOM_COMMAND_SIG(delete_word);
CUSTOM_COMMAND_SIG(snipe_token_or_word);
CUSTOM_COMMAND_SIG(snipe_token_or_word_right);
CUSTOM_COMMAND_SIG(duplicate_line);
CUSTOM_COMMAND_SIG(delete_line);
CUSTOM_COMMAND_SIG(paste_and_indent);
CUSTOM_COMMAND_SIG(paste_next_and_indent);
CUSTOM_COMMAND_SIG(open_long_braces);
CUSTOM_COMMAND_SIG(open_long_braces_semicolon);
CUSTOM_COMMAND_SIG(open_long_braces_break);
CUSTOM_COMMAND_SIG(if0_off);
CUSTOM_COMMAND_SIG(write_todo);
CUSTOM_COMMAND_SIG(write_hack);
CUSTOM_COMMAND_SIG(write_note);
CUSTOM_COMMAND_SIG(write_block);
CUSTOM_COMMAND_SIG(write_zero_struct);
CUSTOM_COMMAND_SIG(open_file_in_quotes);
CUSTOM_COMMAND_SIG(open_in_other);
CUSTOM_COMMAND_SIG(open_matching_file_cpp);
CUSTOM_COMMAND_SIG(execute_arbitrary_command);
CUSTOM_COMMAND_SIG(list_all_functions_current_buffer);
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_direct);
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_same_panel_direct);
CUSTOM_COMMAND_SIG(goto_next_jump_direct);
CUSTOM_COMMAND_SIG(goto_prev_jump_direct);
CUSTOM_COMMAND_SIG(goto_next_jump_no_skips_direct);
CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips_direct);
CUSTOM_COMMAND_SIG(goto_first_jump_direct);
CUSTOM_COMMAND_SIG(newline_or_goto_position_direct);
CUSTOM_COMMAND_SIG(newline_or_goto_position_same_panel_direct);
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_sticky);
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_same_panel_sticky);
CUSTOM_COMMAND_SIG(goto_next_jump_sticky);
CUSTOM_COMMAND_SIG(goto_prev_jump_sticky);
CUSTOM_COMMAND_SIG(goto_next_jump_no_skips_sticky);
CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips_sticky);
CUSTOM_COMMAND_SIG(goto_first_jump_sticky);
CUSTOM_COMMAND_SIG(newline_or_goto_position_sticky);
CUSTOM_COMMAND_SIG(newline_or_goto_position_same_panel_sticky);
CUSTOM_COMMAND_SIG(open_all_code);
CUSTOM_COMMAND_SIG(open_all_code_recursive);
CUSTOM_COMMAND_SIG(close_all_code);
CUSTOM_COMMAND_SIG(load_project);
CUSTOM_COMMAND_SIG(project_fkey_command);
CUSTOM_COMMAND_SIG(project_go_to_root_directory);
CUSTOM_COMMAND_SIG(setup_new_project);
CUSTOM_COMMAND_SIG(set_bindings_choose);
CUSTOM_COMMAND_SIG(set_bindings_default);
CUSTOM_COMMAND_SIG(set_bindings_mac_default);
CUSTOM_COMMAND_SIG(list_all_locations);
CUSTOM_COMMAND_SIG(list_all_substring_locations);
CUSTOM_COMMAND_SIG(list_all_locations_case_insensitive);
CUSTOM_COMMAND_SIG(list_all_substring_locations_case_insensitive);
CUSTOM_COMMAND_SIG(list_all_locations_of_identifier);
CUSTOM_COMMAND_SIG(list_all_locations_of_identifier_case_insensitive);
CUSTOM_COMMAND_SIG(word_complete);
CUSTOM_COMMAND_SIG(execute_previous_cli);
CUSTOM_COMMAND_SIG(execute_any_cli);
CUSTOM_COMMAND_SIG(kill_rect);
CUSTOM_COMMAND_SIG(multi_line_edit);
CUSTOM_COMMAND_SIG(highlight_surrounding_scope);
CUSTOM_COMMAND_SIG(highlight_next_scope_absolute);
CUSTOM_COMMAND_SIG(highlight_prev_scope_absolute);
CUSTOM_COMMAND_SIG(place_in_scope);
CUSTOM_COMMAND_SIG(delete_current_scope);
CUSTOM_COMMAND_SIG(scope_absorb_down);
CUSTOM_COMMAND_SIG(rename_parameter);
CUSTOM_COMMAND_SIG(write_explicit_enum_values);
CUSTOM_COMMAND_SIG(miblo_increment_basic);
CUSTOM_COMMAND_SIG(miblo_decrement_basic);
CUSTOM_COMMAND_SIG(miblo_increment_time_stamp);
CUSTOM_COMMAND_SIG(miblo_decrement_time_stamp);
CUSTOM_COMMAND_SIG(miblo_increment_time_stamp_minute);
CUSTOM_COMMAND_SIG(miblo_decrement_time_stamp_minute);
#endif
struct Command_Metadata{
PROC_LINKS(Custom_Command_Function, void) *proc;
char *name;
int32_t name_len;
char *description;
int32_t description_len;
char *source_name;
int32_t source_name_len;
int32_t line_number;
};
static Command_Metadata fcoder_metacmd_table[172] = {
{ 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, 608 },
{ 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, 618 },
{ 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, 629 },
{ 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, 641 },
{ 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, 22 },
{ 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, 52 },
{ 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, 70 },
{ 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, 89 },
{ 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, 98 },
{ 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, 110 },
{ 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, 125 },
{ 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, 140 },
{ 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, 179 },
{ 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, 192 },
{ PROC_LINKS(move_up, 0), "move_up", 7, "Moves the cursor up one line.", 29, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 216 },
{ PROC_LINKS(move_down, 0), "move_down", 9, "Moves the cursor down one line.", 31, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 222 },
{ 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, 228 },
{ 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, 234 },
{ 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, 256 },
{ 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, 265 },
{ 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, 275 },
{ 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, 284 },
{ 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, 293 },
{ 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, 306 },
{ 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, 317 },
{ 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, 328 },
{ 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, 339 },
{ 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, 350 },
{ 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, 363 },
{ 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, 376 },
{ 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, 383 },
{ 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, 395 },
{ 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, 415 },
{ 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, 435 },
{ 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, 503 },
{ 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, 511 },
{ 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, 523 },
{ 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, 530 },
{ 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, 537 },
{ 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, 544 },
{ 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, 551 },
{ 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, 560 },
{ 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, 570 },
{ 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, 581 },
{ 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, 592 },
{ 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, 603 },
{ 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, 610 },
{ 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, 618 },
{ PROC_LINKS(exit_4coder, 0), "exit_4coder", 11, "Attempts to close 4coder.", 25, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 626 },
{ 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, 636 },
{ 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, 809 },
{ 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, 816 },
{ 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, 823 },
{ 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, 834 },
{ 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, 845 },
{ 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, 915 },
{ 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, 948 },
{ 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, 991 },
{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history.", 44, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1007 },
{ PROC_LINKS(redo, 0), "redo", 4, "Advances forewards through the undo history.", 44, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1013 },
{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1019 },
{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1025 },
{ 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, 1031 },
{ 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, 1037 },
{ 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, 1043 },
{ PROC_LINKS(reopen, 0), "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1049 },
{ PROC_LINKS(save, 0), "save", 4, "Saves the current buffer.", 25, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1055 },
{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1061 },
{ 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, 1067 },
{ 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, 1073 },
{ 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(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(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(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(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(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(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_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(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(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(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, 169 },
{ 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, 224 },
{ 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, 230 },
{ 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, 236 },
{ 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, 242 },
{ 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, 741 },
{ 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, 97 },
{ 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, 101 },
{ 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, 105 },
{ 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, 109 },
{ 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, 113 },
{ 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, 117 },
{ 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, 121 },
{ 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, 125 },
{ 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, 129 },
{ 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, 133 },
{ 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, 144 },
{ 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, 164 },
{ 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.", 61, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 184 },
{ 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.", 62, "C:\\work\\4ed\\code\\4coder_default_include.cpp", 47, 199 },
{ 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, 218 },
{ 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, 240 },
{ 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, 262 },
{ 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, 269 },
{ 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, 309 },
{ 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, 317 },
{ 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, 325 },
{ 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, 333 },
{ 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, 405 },
{ 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, 411 },
{ 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, 417 },
{ 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, 423 },
{ 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, 429 },
{ 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, 473 },
{ 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, 486 },
{ 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, 546 },
{ 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, 565 },
{ 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(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_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_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_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_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_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(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(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_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_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_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(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_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_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(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, 566 },
{ 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, 581 },
{ 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(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(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, 400 },
{ 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, 524 },
{ 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, 550 },
{ 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, 607 },
{ 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(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, 654 },
{ 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, 663 },
{ 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, 672 },
{ 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, 681 },
{ 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, 724 },
{ 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, 730 },
{ 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, 752 },
{ 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(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(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(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(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\\power\\4coder_experiments.cpp", 50, 548 },
{ 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\\power\\4coder_experiments.cpp", 50, 569 },
{ 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\\power\\4coder_experiments.cpp", 50, 587 },
{ 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\\power\\4coder_experiments.cpp", 50, 605 },
{ 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\\power\\4coder_experiments.cpp", 50, 681 },
{ 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\\power\\4coder_experiments.cpp", 50, 940 },
{ 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, 1015 },
{ 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, 1168 },
{ 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_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_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_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_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(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 },
};
static int32_t fcoder_metacmd_ID_auto_tab_whole_file = 0;
static int32_t fcoder_metacmd_ID_auto_tab_line_at_cursor = 1;
static int32_t fcoder_metacmd_ID_auto_tab_range = 2;
static int32_t fcoder_metacmd_ID_write_and_auto_tab = 3;
static int32_t fcoder_metacmd_ID_write_character = 4;
static int32_t fcoder_metacmd_ID_delete_char = 5;
static int32_t fcoder_metacmd_ID_backspace_char = 6;
static int32_t fcoder_metacmd_ID_set_mark = 7;
static int32_t fcoder_metacmd_ID_cursor_mark_swap = 8;
static int32_t fcoder_metacmd_ID_delete_range = 9;
static int32_t fcoder_metacmd_ID_center_view = 10;
static int32_t fcoder_metacmd_ID_left_adjust_view = 11;
static int32_t fcoder_metacmd_ID_click_set_cursor = 12;
static int32_t fcoder_metacmd_ID_click_set_mark = 13;
static int32_t fcoder_metacmd_ID_move_up = 14;
static int32_t fcoder_metacmd_ID_move_down = 15;
static int32_t fcoder_metacmd_ID_move_up_10 = 16;
static int32_t fcoder_metacmd_ID_move_down_10 = 17;
static int32_t fcoder_metacmd_ID_page_up = 18;
static int32_t fcoder_metacmd_ID_page_down = 19;
static int32_t fcoder_metacmd_ID_move_left = 20;
static int32_t fcoder_metacmd_ID_move_right = 21;
static int32_t fcoder_metacmd_ID_select_all = 22;
static int32_t fcoder_metacmd_ID_seek_whitespace_up = 23;
static int32_t fcoder_metacmd_ID_seek_whitespace_down = 24;
static int32_t fcoder_metacmd_ID_seek_beginning_of_textual_line = 25;
static int32_t fcoder_metacmd_ID_seek_end_of_textual_line = 26;
static int32_t fcoder_metacmd_ID_seek_beginning_of_line = 27;
static int32_t fcoder_metacmd_ID_seek_end_of_line = 28;
static int32_t fcoder_metacmd_ID_seek_whitespace_up_end_line = 29;
static int32_t fcoder_metacmd_ID_seek_whitespace_down_end_line = 30;
static int32_t fcoder_metacmd_ID_to_uppercase = 31;
static int32_t fcoder_metacmd_ID_to_lowercase = 32;
static int32_t fcoder_metacmd_ID_clean_all_lines = 33;
static int32_t fcoder_metacmd_ID_basic_change_active_panel = 34;
static int32_t fcoder_metacmd_ID_close_panel = 35;
static int32_t fcoder_metacmd_ID_show_scrollbar = 36;
static int32_t fcoder_metacmd_ID_hide_scrollbar = 37;
static int32_t fcoder_metacmd_ID_show_filebar = 38;
static int32_t fcoder_metacmd_ID_hide_filebar = 39;
static int32_t fcoder_metacmd_ID_toggle_filebar = 40;
static int32_t fcoder_metacmd_ID_toggle_line_wrap = 41;
static int32_t fcoder_metacmd_ID_increase_line_wrap = 42;
static int32_t fcoder_metacmd_ID_decrease_line_wrap = 43;
static int32_t fcoder_metacmd_ID_toggle_virtual_whitespace = 44;
static int32_t fcoder_metacmd_ID_toggle_show_whitespace = 45;
static int32_t fcoder_metacmd_ID_eol_dosify = 46;
static int32_t fcoder_metacmd_ID_eol_nixify = 47;
static int32_t fcoder_metacmd_ID_exit_4coder = 48;
static int32_t fcoder_metacmd_ID_goto_line = 49;
static int32_t fcoder_metacmd_ID_search = 50;
static int32_t fcoder_metacmd_ID_reverse_search = 51;
static int32_t fcoder_metacmd_ID_search_identifier = 52;
static int32_t fcoder_metacmd_ID_reverse_search_identifier = 53;
static int32_t fcoder_metacmd_ID_replace_in_range = 54;
static int32_t fcoder_metacmd_ID_query_replace = 55;
static int32_t fcoder_metacmd_ID_query_replace_identifier = 56;
static int32_t fcoder_metacmd_ID_save_all_dirty_buffers = 57;
static int32_t fcoder_metacmd_ID_undo = 58;
static int32_t fcoder_metacmd_ID_redo = 59;
static int32_t fcoder_metacmd_ID_interactive_new = 60;
static int32_t fcoder_metacmd_ID_interactive_open = 61;
static int32_t fcoder_metacmd_ID_interactive_open_or_new = 62;
static int32_t fcoder_metacmd_ID_interactive_switch_buffer = 63;
static int32_t fcoder_metacmd_ID_interactive_kill_buffer = 64;
static int32_t fcoder_metacmd_ID_reopen = 65;
static int32_t fcoder_metacmd_ID_save = 66;
static int32_t fcoder_metacmd_ID_kill_buffer = 67;
static int32_t fcoder_metacmd_ID_open_color_tweaker = 68;
static int32_t fcoder_metacmd_ID_open_debug = 69;
static int32_t fcoder_metacmd_ID_build_search = 70;
static int32_t fcoder_metacmd_ID_build_in_build_panel = 71;
static int32_t fcoder_metacmd_ID_close_build_panel = 72;
static int32_t fcoder_metacmd_ID_change_to_build_panel = 73;
static int32_t fcoder_metacmd_ID_copy = 74;
static int32_t fcoder_metacmd_ID_cut = 75;
static int32_t fcoder_metacmd_ID_paste = 76;
static int32_t fcoder_metacmd_ID_paste_next = 77;
static int32_t fcoder_metacmd_ID_change_active_panel = 78;
static int32_t fcoder_metacmd_ID_change_active_panel_backwards = 79;
static int32_t fcoder_metacmd_ID_open_panel_vsplit = 80;
static int32_t fcoder_metacmd_ID_open_panel_hsplit = 81;
static int32_t fcoder_metacmd_ID_suppress_mouse = 82;
static int32_t fcoder_metacmd_ID_allow_mouse = 83;
static int32_t fcoder_metacmd_ID_toggle_mouse = 84;
static int32_t fcoder_metacmd_ID_toggle_fullscreen = 85;
static int32_t fcoder_metacmd_ID_remap_interactive = 86;
static int32_t fcoder_metacmd_ID_seek_whitespace_right = 87;
static int32_t fcoder_metacmd_ID_seek_whitespace_left = 88;
static int32_t fcoder_metacmd_ID_seek_token_right = 89;
static int32_t fcoder_metacmd_ID_seek_token_left = 90;
static int32_t fcoder_metacmd_ID_seek_white_or_token_right = 91;
static int32_t fcoder_metacmd_ID_seek_white_or_token_left = 92;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_right = 93;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_left = 94;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_right = 95;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_left = 96;
static int32_t fcoder_metacmd_ID_backspace_word = 97;
static int32_t fcoder_metacmd_ID_delete_word = 98;
static int32_t fcoder_metacmd_ID_snipe_token_or_word = 99;
static int32_t fcoder_metacmd_ID_snipe_token_or_word_right = 100;
static int32_t fcoder_metacmd_ID_duplicate_line = 101;
static int32_t fcoder_metacmd_ID_delete_line = 102;
static int32_t fcoder_metacmd_ID_paste_and_indent = 103;
static int32_t fcoder_metacmd_ID_paste_next_and_indent = 104;
static int32_t fcoder_metacmd_ID_open_long_braces = 105;
static int32_t fcoder_metacmd_ID_open_long_braces_semicolon = 106;
static int32_t fcoder_metacmd_ID_open_long_braces_break = 107;
static int32_t fcoder_metacmd_ID_if0_off = 108;
static int32_t fcoder_metacmd_ID_write_todo = 109;
static int32_t fcoder_metacmd_ID_write_hack = 110;
static int32_t fcoder_metacmd_ID_write_note = 111;
static int32_t fcoder_metacmd_ID_write_block = 112;
static int32_t fcoder_metacmd_ID_write_zero_struct = 113;
static int32_t fcoder_metacmd_ID_open_file_in_quotes = 114;
static int32_t fcoder_metacmd_ID_open_in_other = 115;
static int32_t fcoder_metacmd_ID_open_matching_file_cpp = 116;
static int32_t fcoder_metacmd_ID_execute_arbitrary_command = 117;
static int32_t fcoder_metacmd_ID_list_all_functions_current_buffer = 118;
static int32_t fcoder_metacmd_ID_goto_jump_at_cursor_direct = 119;
static int32_t fcoder_metacmd_ID_goto_jump_at_cursor_same_panel_direct = 120;
static int32_t fcoder_metacmd_ID_goto_next_jump_direct = 121;
static int32_t fcoder_metacmd_ID_goto_prev_jump_direct = 122;
static int32_t fcoder_metacmd_ID_goto_next_jump_no_skips_direct = 123;
static int32_t fcoder_metacmd_ID_goto_prev_jump_no_skips_direct = 124;
static int32_t fcoder_metacmd_ID_goto_first_jump_direct = 125;
static int32_t fcoder_metacmd_ID_newline_or_goto_position_direct = 126;
static int32_t fcoder_metacmd_ID_newline_or_goto_position_same_panel_direct = 127;
static int32_t fcoder_metacmd_ID_goto_jump_at_cursor_sticky = 128;
static int32_t fcoder_metacmd_ID_goto_jump_at_cursor_same_panel_sticky = 129;
static int32_t fcoder_metacmd_ID_goto_next_jump_sticky = 130;
static int32_t fcoder_metacmd_ID_goto_prev_jump_sticky = 131;
static int32_t fcoder_metacmd_ID_goto_next_jump_no_skips_sticky = 132;
static int32_t fcoder_metacmd_ID_goto_prev_jump_no_skips_sticky = 133;
static int32_t fcoder_metacmd_ID_goto_first_jump_sticky = 134;
static int32_t fcoder_metacmd_ID_newline_or_goto_position_sticky = 135;
static int32_t fcoder_metacmd_ID_newline_or_goto_position_same_panel_sticky = 136;
static int32_t fcoder_metacmd_ID_open_all_code = 137;
static int32_t fcoder_metacmd_ID_open_all_code_recursive = 138;
static int32_t fcoder_metacmd_ID_close_all_code = 139;
static int32_t fcoder_metacmd_ID_load_project = 140;
static int32_t fcoder_metacmd_ID_project_fkey_command = 141;
static int32_t fcoder_metacmd_ID_project_go_to_root_directory = 142;
static int32_t fcoder_metacmd_ID_setup_new_project = 143;
static int32_t fcoder_metacmd_ID_set_bindings_choose = 144;
static int32_t fcoder_metacmd_ID_set_bindings_default = 145;
static int32_t fcoder_metacmd_ID_set_bindings_mac_default = 146;
static int32_t fcoder_metacmd_ID_list_all_locations = 147;
static int32_t fcoder_metacmd_ID_list_all_substring_locations = 148;
static int32_t fcoder_metacmd_ID_list_all_locations_case_insensitive = 149;
static int32_t fcoder_metacmd_ID_list_all_substring_locations_case_insensitive = 150;
static int32_t fcoder_metacmd_ID_list_all_locations_of_identifier = 151;
static int32_t fcoder_metacmd_ID_list_all_locations_of_identifier_case_insensitive = 152;
static int32_t fcoder_metacmd_ID_word_complete = 153;
static int32_t fcoder_metacmd_ID_execute_previous_cli = 154;
static int32_t fcoder_metacmd_ID_execute_any_cli = 155;
static int32_t fcoder_metacmd_ID_kill_rect = 156;
static int32_t fcoder_metacmd_ID_multi_line_edit = 157;
static int32_t fcoder_metacmd_ID_highlight_surrounding_scope = 158;
static int32_t fcoder_metacmd_ID_highlight_next_scope_absolute = 159;
static int32_t fcoder_metacmd_ID_highlight_prev_scope_absolute = 160;
static int32_t fcoder_metacmd_ID_place_in_scope = 161;
static int32_t fcoder_metacmd_ID_delete_current_scope = 162;
static int32_t fcoder_metacmd_ID_scope_absorb_down = 163;
static int32_t fcoder_metacmd_ID_rename_parameter = 164;
static int32_t fcoder_metacmd_ID_write_explicit_enum_values = 165;
static int32_t fcoder_metacmd_ID_miblo_increment_basic = 166;
static int32_t fcoder_metacmd_ID_miblo_decrement_basic = 167;
static int32_t fcoder_metacmd_ID_miblo_increment_time_stamp = 168;
static int32_t fcoder_metacmd_ID_miblo_decrement_time_stamp = 169;
static int32_t fcoder_metacmd_ID_miblo_increment_time_stamp_minute = 170;
static int32_t fcoder_metacmd_ID_miblo_decrement_time_stamp_minute = 171;

View File

@ -0,0 +1,73 @@
enum{
key_back = 55296,
key_up = 55297,
key_down = 55298,
key_left = 55299,
key_right = 55300,
key_del = 55301,
key_insert = 55302,
key_home = 55303,
key_end = 55304,
key_page_up = 55305,
key_page_down = 55306,
key_esc = 55307,
key_mouse_left = 55308,
key_mouse_right = 55309,
key_mouse_left_release = 55310,
key_mouse_right_release = 55311,
key_f1 = 55312,
key_f2 = 55313,
key_f3 = 55314,
key_f4 = 55315,
key_f5 = 55316,
key_f6 = 55317,
key_f7 = 55318,
key_f8 = 55319,
key_f9 = 55320,
key_f10 = 55321,
key_f11 = 55322,
key_f12 = 55323,
key_f13 = 55324,
key_f14 = 55325,
key_f15 = 55326,
key_f16 = 55327,
};
static char*
global_key_name(uint32_t key_code, int32_t *size){
char *result = 0;
switch(key_code){
case key_back: result = "key_back"; *size = sizeof("key_back")-1; break;
case key_up: result = "key_up"; *size = sizeof("key_up")-1; break;
case key_down: result = "key_down"; *size = sizeof("key_down")-1; break;
case key_left: result = "key_left"; *size = sizeof("key_left")-1; break;
case key_right: result = "key_right"; *size = sizeof("key_right")-1; break;
case key_del: result = "key_del"; *size = sizeof("key_del")-1; break;
case key_insert: result = "key_insert"; *size = sizeof("key_insert")-1; break;
case key_home: result = "key_home"; *size = sizeof("key_home")-1; break;
case key_end: result = "key_end"; *size = sizeof("key_end")-1; break;
case key_page_up: result = "key_page_up"; *size = sizeof("key_page_up")-1; break;
case key_page_down: result = "key_page_down"; *size = sizeof("key_page_down")-1; break;
case key_esc: result = "key_esc"; *size = sizeof("key_esc")-1; break;
case key_mouse_left: result = "key_mouse_left"; *size = sizeof("key_mouse_left")-1; break;
case key_mouse_right: result = "key_mouse_right"; *size = sizeof("key_mouse_right")-1; break;
case key_mouse_left_release: result = "key_mouse_left_release"; *size = sizeof("key_mouse_left_release")-1; break;
case key_mouse_right_release: result = "key_mouse_right_release"; *size = sizeof("key_mouse_right_release")-1; break;
case key_f1: result = "key_f1"; *size = sizeof("key_f1")-1; break;
case key_f2: result = "key_f2"; *size = sizeof("key_f2")-1; break;
case key_f3: result = "key_f3"; *size = sizeof("key_f3")-1; break;
case key_f4: result = "key_f4"; *size = sizeof("key_f4")-1; break;
case key_f5: result = "key_f5"; *size = sizeof("key_f5")-1; break;
case key_f6: result = "key_f6"; *size = sizeof("key_f6")-1; break;
case key_f7: result = "key_f7"; *size = sizeof("key_f7")-1; break;
case key_f8: result = "key_f8"; *size = sizeof("key_f8")-1; break;
case key_f9: result = "key_f9"; *size = sizeof("key_f9")-1; break;
case key_f10: result = "key_f10"; *size = sizeof("key_f10")-1; break;
case key_f11: result = "key_f11"; *size = sizeof("key_f11")-1; break;
case key_f12: result = "key_f12"; *size = sizeof("key_f12")-1; break;
case key_f13: result = "key_f13"; *size = sizeof("key_f13")-1; break;
case key_f14: result = "key_f14"; *size = sizeof("key_f14")-1; break;
case key_f15: result = "key_f15"; *size = sizeof("key_f15")-1; break;
case key_f16: result = "key_f16"; *size = sizeof("key_f16")-1; break;
}
return(result);
}

View File

@ -0,0 +1,596 @@
#if defined(CUSTOM_COMMAND_SIG)
void fill_keys_default(Bind_Helper *context){
begin_map(context, mapid_global);
bind(context, 'p', MDFR_CTRL, open_panel_vsplit);
bind(context, '_', MDFR_CTRL, open_panel_hsplit);
bind(context, 'P', MDFR_CTRL, close_panel);
bind(context, ',', MDFR_CTRL, change_active_panel);
bind(context, '<', MDFR_CTRL, change_active_panel_backwards);
bind(context, 'n', MDFR_CTRL, interactive_new);
bind(context, 'o', MDFR_CTRL, interactive_open_or_new);
bind(context, 'o', MDFR_ALT, open_in_other);
bind(context, 'k', MDFR_CTRL, interactive_kill_buffer);
bind(context, 'i', MDFR_CTRL, interactive_switch_buffer);
bind(context, 'h', MDFR_CTRL, project_go_to_root_directory);
bind(context, 'S', MDFR_CTRL, save_all_dirty_buffers);
bind(context, 'c', MDFR_ALT, open_color_tweaker);
bind(context, 'd', MDFR_ALT, open_debug);
bind(context, '.', MDFR_ALT, change_to_build_panel);
bind(context, ',', MDFR_ALT, close_build_panel);
bind(context, 'n', MDFR_ALT, goto_next_error);
bind(context, 'N', MDFR_ALT, goto_prev_error);
bind(context, 'M', MDFR_ALT, goto_first_error);
bind(context, 'm', MDFR_ALT, build_in_build_panel);
bind(context, 'z', MDFR_ALT, execute_any_cli);
bind(context, 'Z', MDFR_ALT, execute_previous_cli);
bind(context, 'x', MDFR_ALT, execute_arbitrary_command);
bind(context, 's', MDFR_ALT, show_scrollbar);
bind(context, 'w', MDFR_ALT, hide_scrollbar);
bind(context, 'b', MDFR_ALT, toggle_filebar);
bind(context, '@', MDFR_ALT, toggle_mouse);
bind(context, key_page_up, MDFR_CTRL, toggle_fullscreen);
bind(context, 'E', MDFR_ALT, exit_4coder);
bind(context, key_f1, MDFR_NONE, project_fkey_command);
bind(context, key_f2, MDFR_NONE, project_fkey_command);
bind(context, key_f3, MDFR_NONE, project_fkey_command);
bind(context, key_f4, MDFR_NONE, project_fkey_command);
bind(context, key_f5, MDFR_NONE, project_fkey_command);
bind(context, key_f6, MDFR_NONE, project_fkey_command);
bind(context, key_f7, MDFR_NONE, project_fkey_command);
bind(context, key_f8, MDFR_NONE, project_fkey_command);
bind(context, key_f9, MDFR_NONE, project_fkey_command);
bind(context, key_f10, MDFR_NONE, project_fkey_command);
bind(context, key_f11, MDFR_NONE, project_fkey_command);
bind(context, key_f12, MDFR_NONE, project_fkey_command);
bind(context, key_f13, MDFR_NONE, project_fkey_command);
bind(context, key_f14, MDFR_NONE, project_fkey_command);
bind(context, key_f15, MDFR_NONE, project_fkey_command);
bind(context, key_f16, MDFR_NONE, project_fkey_command);
end_map(context);
begin_map(context, mapid_file);
bind_vanilla_keys(context, write_character);
bind(context, key_mouse_left, MDFR_NONE, click_set_cursor);
bind(context, key_mouse_left_release, MDFR_NONE, click_set_mark);
bind(context, key_mouse_right, MDFR_NONE, click_set_mark);
bind(context, key_left, MDFR_NONE, move_left);
bind(context, key_right, MDFR_NONE, move_right);
bind(context, key_del, MDFR_NONE, delete_char);
bind(context, key_del, MDFR_SHIFT, delete_char);
bind(context, key_back, MDFR_NONE, backspace_char);
bind(context, key_back, MDFR_SHIFT, backspace_char);
bind(context, key_up, MDFR_NONE, move_up);
bind(context, key_down, MDFR_NONE, move_down);
bind(context, key_end, MDFR_NONE, seek_end_of_line);
bind(context, key_home, MDFR_NONE, seek_beginning_of_line);
bind(context, key_page_up, MDFR_NONE, page_up);
bind(context, key_page_down, MDFR_NONE, page_down);
bind(context, key_right, MDFR_CTRL, seek_whitespace_right);
bind(context, key_left, MDFR_CTRL, seek_whitespace_left);
bind(context, key_up, MDFR_CTRL, seek_whitespace_up_end_line);
bind(context, key_down, MDFR_CTRL, seek_whitespace_down_end_line);
bind(context, key_up, MDFR_ALT, move_up_10);
bind(context, key_down, MDFR_ALT, move_down_10);
bind(context, key_back, MDFR_CTRL, backspace_word);
bind(context, key_del, MDFR_CTRL, delete_word);
bind(context, key_back, MDFR_ALT, snipe_token_or_word);
bind(context, key_del, MDFR_ALT, snipe_token_or_word_right);
bind(context, ' ', MDFR_CTRL, set_mark);
bind(context, 'a', MDFR_CTRL, replace_in_range);
bind(context, 'c', MDFR_CTRL, copy);
bind(context, 'd', MDFR_CTRL, delete_range);
bind(context, 'e', MDFR_CTRL, center_view);
bind(context, 'E', MDFR_CTRL, left_adjust_view);
bind(context, 'f', MDFR_CTRL, search);
bind(context, 'F', MDFR_CTRL, list_all_locations);
bind(context, 'F', MDFR_ALT, list_all_substring_locations_case_insensitive);
bind(context, 'g', MDFR_CTRL, goto_line);
bind(context, 'j', MDFR_CTRL, to_lowercase);
bind(context, 'K', MDFR_CTRL, kill_buffer);
bind(context, 'l', MDFR_CTRL, toggle_line_wrap);
bind(context, 'm', MDFR_CTRL, cursor_mark_swap);
bind(context, 'O', MDFR_CTRL, reopen);
bind(context, 'q', MDFR_CTRL, query_replace);
bind(context, 'Q', MDFR_CTRL, query_replace_identifier);
bind(context, 'r', MDFR_CTRL, reverse_search);
bind(context, 's', MDFR_CTRL, save);
bind(context, 't', MDFR_CTRL, search_identifier);
bind(context, 'T', MDFR_CTRL, list_all_locations_of_identifier);
bind(context, 'u', MDFR_CTRL, to_uppercase);
bind(context, 'v', MDFR_CTRL, paste_and_indent);
bind(context, 'v', MDFR_ALT, toggle_virtual_whitespace);
bind(context, 'V', MDFR_CTRL, paste_next_and_indent);
bind(context, 'x', MDFR_CTRL, cut);
bind(context, 'y', MDFR_CTRL, redo);
bind(context, 'z', MDFR_CTRL, undo);
bind(context, '2', MDFR_CTRL, decrease_line_wrap);
bind(context, '3', MDFR_CTRL, increase_line_wrap);
bind(context, '?', MDFR_CTRL, toggle_show_whitespace);
bind(context, '~', MDFR_CTRL, clean_all_lines);
bind(context, '\n', MDFR_NONE, newline_or_goto_position);
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
bind(context, ' ', MDFR_SHIFT, write_character);
end_map(context);
begin_map(context, default_code_map);
inherit_map(context, mapid_file);
bind(context, key_right, MDFR_CTRL, seek_alphanumeric_or_camel_right);
bind(context, key_left, MDFR_CTRL, seek_alphanumeric_or_camel_left);
bind(context, '\n', MDFR_NONE, write_and_auto_tab);
bind(context, '\n', MDFR_SHIFT, write_and_auto_tab);
bind(context, '}', MDFR_NONE, write_and_auto_tab);
bind(context, ')', MDFR_NONE, write_and_auto_tab);
bind(context, ']', MDFR_NONE, write_and_auto_tab);
bind(context, ';', MDFR_NONE, write_and_auto_tab);
bind(context, '#', MDFR_NONE, write_and_auto_tab);
bind(context, '\t', MDFR_NONE, word_complete);
bind(context, '\t', MDFR_CTRL, auto_tab_range);
bind(context, '\t', MDFR_SHIFT, auto_tab_line_at_cursor);
bind(context, 'h', MDFR_ALT, write_hack);
bind(context, 'r', MDFR_ALT, write_block);
bind(context, 't', MDFR_ALT, write_todo);
bind(context, 'y', MDFR_ALT, write_note);
bind(context, '[', MDFR_CTRL, open_long_braces);
bind(context, '{', MDFR_CTRL, open_long_braces_semicolon);
bind(context, '}', MDFR_CTRL, open_long_braces_break);
bind(context, 'i', MDFR_ALT, if0_off);
bind(context, '1', MDFR_ALT, open_file_in_quotes);
bind(context, '2', MDFR_ALT, open_matching_file_cpp);
bind(context, '0', MDFR_CTRL, write_zero_struct);
bind(context, 'I', MDFR_CTRL, list_all_functions_current_buffer);
end_map(context);
}
void fill_keys_mac_default(Bind_Helper *context){
begin_map(context, mapid_global);
bind(context, 'p', MDFR_CMND, open_panel_vsplit);
bind(context, '_', MDFR_CMND, open_panel_hsplit);
bind(context, 'P', MDFR_CMND, close_panel);
bind(context, ',', MDFR_CMND, change_active_panel);
bind(context, '<', MDFR_CMND, change_active_panel_backwards);
bind(context, 'n', MDFR_CMND, interactive_new);
bind(context, 'o', MDFR_CMND, interactive_open_or_new);
bind(context, 'o', MDFR_CTRL, open_in_other);
bind(context, 'k', MDFR_CMND, interactive_kill_buffer);
bind(context, 'i', MDFR_CMND, interactive_switch_buffer);
bind(context, 'h', MDFR_CMND, project_go_to_root_directory);
bind(context, 'S', MDFR_CMND, save_all_dirty_buffers);
bind(context, 'c', MDFR_CTRL, open_color_tweaker);
bind(context, 'd', MDFR_CTRL, open_debug);
bind(context, '.', MDFR_CTRL, change_to_build_panel);
bind(context, ',', MDFR_CTRL, close_build_panel);
bind(context, 'n', MDFR_CTRL, goto_next_error);
bind(context, 'N', MDFR_CTRL, goto_prev_error);
bind(context, 'M', MDFR_CTRL, goto_first_error);
bind(context, 'm', MDFR_CTRL, build_in_build_panel);
bind(context, 'z', MDFR_CTRL, execute_any_cli);
bind(context, 'Z', MDFR_CTRL, execute_previous_cli);
bind(context, 'x', MDFR_CTRL, execute_arbitrary_command);
bind(context, 's', MDFR_CTRL, show_scrollbar);
bind(context, 'w', MDFR_CTRL, hide_scrollbar);
bind(context, 'b', MDFR_CTRL, toggle_filebar);
bind(context, '@', MDFR_CTRL, toggle_mouse);
bind(context, key_page_up, MDFR_CMND, toggle_fullscreen);
bind(context, 'E', MDFR_CTRL, exit_4coder);
bind(context, key_f1, MDFR_NONE, project_fkey_command);
bind(context, key_f2, MDFR_NONE, project_fkey_command);
bind(context, key_f3, MDFR_NONE, project_fkey_command);
bind(context, key_f4, MDFR_NONE, project_fkey_command);
bind(context, key_f5, MDFR_NONE, project_fkey_command);
bind(context, key_f6, MDFR_NONE, project_fkey_command);
bind(context, key_f7, MDFR_NONE, project_fkey_command);
bind(context, key_f8, MDFR_NONE, project_fkey_command);
bind(context, key_f9, MDFR_NONE, project_fkey_command);
bind(context, key_f10, MDFR_NONE, project_fkey_command);
bind(context, key_f11, MDFR_NONE, project_fkey_command);
bind(context, key_f12, MDFR_NONE, project_fkey_command);
bind(context, key_f13, MDFR_NONE, project_fkey_command);
bind(context, key_f14, MDFR_NONE, project_fkey_command);
bind(context, key_f15, MDFR_NONE, project_fkey_command);
bind(context, key_f16, MDFR_NONE, project_fkey_command);
end_map(context);
begin_map(context, mapid_file);
bind_vanilla_keys(context, write_character);
bind_vanilla_keys(context, MDFR_ALT, write_character);
bind(context, key_mouse_left, MDFR_NONE, click_set_cursor);
bind(context, key_mouse_left_release, MDFR_NONE, click_set_mark);
bind(context, key_mouse_right, MDFR_NONE, click_set_mark);
bind(context, key_left, MDFR_NONE, move_left);
bind(context, key_right, MDFR_NONE, move_right);
bind(context, key_del, MDFR_NONE, delete_char);
bind(context, key_del, MDFR_SHIFT, delete_char);
bind(context, key_back, MDFR_NONE, backspace_char);
bind(context, key_back, MDFR_SHIFT, backspace_char);
bind(context, key_up, MDFR_NONE, move_up);
bind(context, key_down, MDFR_NONE, move_down);
bind(context, key_end, MDFR_NONE, seek_end_of_line);
bind(context, key_home, MDFR_NONE, seek_beginning_of_line);
bind(context, key_page_up, MDFR_NONE, page_up);
bind(context, key_page_down, MDFR_NONE, page_down);
bind(context, key_right, MDFR_CMND, seek_whitespace_right);
bind(context, key_left, MDFR_CMND, seek_whitespace_left);
bind(context, key_up, MDFR_CMND, seek_whitespace_up_end_line);
bind(context, key_down, MDFR_CMND, seek_whitespace_down_end_line);
bind(context, key_back, MDFR_CMND, backspace_word);
bind(context, key_del, MDFR_CMND, delete_word);
bind(context, key_back, MDFR_CTRL, snipe_token_or_word);
bind(context, key_del, MDFR_CTRL, snipe_token_or_word_right);
bind(context, '/', MDFR_CMND, set_mark);
bind(context, 'a', MDFR_CMND, replace_in_range);
bind(context, 'c', MDFR_CMND, copy);
bind(context, 'd', MDFR_CMND, delete_range);
bind(context, 'e', MDFR_CMND, center_view);
bind(context, 'E', MDFR_CMND, left_adjust_view);
bind(context, 'f', MDFR_CMND, search);
bind(context, 'F', MDFR_CMND, list_all_locations);
bind(context, 'F', MDFR_CTRL, list_all_substring_locations_case_insensitive);
bind(context, 'g', MDFR_CMND, goto_line);
bind(context, 'j', MDFR_CMND, to_lowercase);
bind(context, 'K', MDFR_CMND, kill_buffer);
bind(context, 'l', MDFR_CMND, toggle_line_wrap);
bind(context, 'm', MDFR_CMND, cursor_mark_swap);
bind(context, 'O', MDFR_CMND, reopen);
bind(context, 'q', MDFR_CMND, query_replace);
bind(context, 'Q', MDFR_CMND, query_replace_identifier);
bind(context, 'r', MDFR_CMND, reverse_search);
bind(context, 's', MDFR_CMND, save);
bind(context, 't', MDFR_CMND, search_identifier);
bind(context, 'T', MDFR_CMND, list_all_locations_of_identifier);
bind(context, 'u', MDFR_CMND, to_uppercase);
bind(context, 'v', MDFR_CMND, paste_and_indent);
bind(context, 'v', MDFR_CTRL, toggle_virtual_whitespace);
bind(context, 'V', MDFR_CMND, paste_next_and_indent);
bind(context, 'x', MDFR_CMND, cut);
bind(context, 'y', MDFR_CMND, redo);
bind(context, 'z', MDFR_CMND, undo);
bind(context, '2', MDFR_CMND, decrease_line_wrap);
bind(context, '3', MDFR_CMND, increase_line_wrap);
bind(context, '?', MDFR_CMND, toggle_show_whitespace);
bind(context, '~', MDFR_CMND, clean_all_lines);
bind(context, '\n', MDFR_NONE, newline_or_goto_position);
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
bind(context, ' ', MDFR_SHIFT, write_character);
end_map(context);
begin_map(context, default_code_map);
inherit_map(context, mapid_file);
bind(context, key_right, MDFR_CMND, seek_alphanumeric_or_camel_right);
bind(context, key_left, MDFR_CMND, seek_alphanumeric_or_camel_left);
bind(context, '\n', MDFR_NONE, write_and_auto_tab);
bind(context, '\n', MDFR_SHIFT, write_and_auto_tab);
bind(context, '}', MDFR_NONE, write_and_auto_tab);
bind(context, ')', MDFR_NONE, write_and_auto_tab);
bind(context, ']', MDFR_NONE, write_and_auto_tab);
bind(context, ';', MDFR_NONE, write_and_auto_tab);
bind(context, '#', MDFR_NONE, write_and_auto_tab);
bind(context, '\t', MDFR_NONE, word_complete);
bind(context, '\t', MDFR_CMND, auto_tab_range);
bind(context, '\t', MDFR_SHIFT, auto_tab_line_at_cursor);
bind(context, 'h', MDFR_CTRL, write_hack);
bind(context, 'r', MDFR_CTRL, write_block);
bind(context, 't', MDFR_CTRL, write_todo);
bind(context, 'y', MDFR_CTRL, write_note);
bind(context, '[', MDFR_CMND, open_long_braces);
bind(context, '{', MDFR_CMND, open_long_braces_semicolon);
bind(context, '}', MDFR_CMND, open_long_braces_break);
bind(context, 'i', MDFR_CTRL, if0_off);
bind(context, '1', MDFR_CTRL, open_file_in_quotes);
bind(context, '2', MDFR_CTRL, open_matching_file_cpp);
bind(context, '0', MDFR_CMND, write_zero_struct);
bind(context, 'I', MDFR_CMND, list_all_functions_current_buffer);
end_map(context);
}
#endif
#if defined(CUSTOM_COMMAND_SIG)
#define LINK_PROCS(x) x
#else
#define LINK_PROCS(x)
#endif
struct Meta_Key_Bind{
int32_t vanilla;
uint32_t keycode;
uint32_t modifiers;
char *command;
int32_t command_len;
LINK_PROCS(Custom_Command_Function *proc;)
};
struct Meta_Sub_Map{
char *name;
int32_t name_len;
char *description;
int32_t description_len;
char *parent;
int32_t parent_len;
Meta_Key_Bind *binds;
int32_t bind_count;
};
struct Meta_Mapping{
char *name;
int32_t name_len;
char *description;
int32_t description_len;
Meta_Sub_Map *sub_maps;
int32_t sub_map_count;
LINK_PROCS(void (*fill_keys_proc)(Bind_Helper *context);)
};
static Meta_Key_Bind fcoder_binds_for_default_mapid_global[45] = {
{0, 112, 1, "open_panel_vsplit", 17, LINK_PROCS(open_panel_vsplit)},
{0, 95, 1, "open_panel_hsplit", 17, LINK_PROCS(open_panel_hsplit)},
{0, 80, 1, "close_panel", 11, LINK_PROCS(close_panel)},
{0, 44, 1, "change_active_panel", 19, LINK_PROCS(change_active_panel)},
{0, 60, 1, "change_active_panel_backwards", 29, LINK_PROCS(change_active_panel_backwards)},
{0, 110, 1, "interactive_new", 15, LINK_PROCS(interactive_new)},
{0, 111, 1, "interactive_open_or_new", 23, LINK_PROCS(interactive_open_or_new)},
{0, 111, 2, "open_in_other", 13, LINK_PROCS(open_in_other)},
{0, 107, 1, "interactive_kill_buffer", 23, LINK_PROCS(interactive_kill_buffer)},
{0, 105, 1, "interactive_switch_buffer", 25, LINK_PROCS(interactive_switch_buffer)},
{0, 104, 1, "project_go_to_root_directory", 28, LINK_PROCS(project_go_to_root_directory)},
{0, 83, 1, "save_all_dirty_buffers", 22, LINK_PROCS(save_all_dirty_buffers)},
{0, 99, 2, "open_color_tweaker", 18, LINK_PROCS(open_color_tweaker)},
{0, 100, 2, "open_debug", 10, LINK_PROCS(open_debug)},
{0, 46, 2, "change_to_build_panel", 21, LINK_PROCS(change_to_build_panel)},
{0, 44, 2, "close_build_panel", 17, LINK_PROCS(close_build_panel)},
{0, 110, 2, "goto_next_error", 15, LINK_PROCS(goto_next_error)},
{0, 78, 2, "goto_prev_error", 15, LINK_PROCS(goto_prev_error)},
{0, 77, 2, "goto_first_error", 16, LINK_PROCS(goto_first_error)},
{0, 109, 2, "build_in_build_panel", 20, LINK_PROCS(build_in_build_panel)},
{0, 122, 2, "execute_any_cli", 15, LINK_PROCS(execute_any_cli)},
{0, 90, 2, "execute_previous_cli", 20, LINK_PROCS(execute_previous_cli)},
{0, 120, 2, "execute_arbitrary_command", 25, LINK_PROCS(execute_arbitrary_command)},
{0, 115, 2, "show_scrollbar", 14, LINK_PROCS(show_scrollbar)},
{0, 119, 2, "hide_scrollbar", 14, LINK_PROCS(hide_scrollbar)},
{0, 98, 2, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
{0, 64, 2, "toggle_mouse", 12, LINK_PROCS(toggle_mouse)},
{0, 55305, 1, "toggle_fullscreen", 17, LINK_PROCS(toggle_fullscreen)},
{0, 69, 2, "exit_4coder", 11, LINK_PROCS(exit_4coder)},
{0, 55312, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55313, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55314, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55315, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55316, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55317, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55318, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55319, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55320, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55321, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55322, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55323, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55324, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55325, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55326, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55327, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
};
static Meta_Key_Bind fcoder_binds_for_default_mapid_file[61] = {
{1, 0, 0, "write_character", 15, LINK_PROCS(write_character)},
{0, 55308, 0, "click_set_cursor", 16, LINK_PROCS(click_set_cursor)},
{0, 55310, 0, "click_set_mark", 14, LINK_PROCS(click_set_mark)},
{0, 55309, 0, "click_set_mark", 14, LINK_PROCS(click_set_mark)},
{0, 55299, 0, "move_left", 9, LINK_PROCS(move_left)},
{0, 55300, 0, "move_right", 10, LINK_PROCS(move_right)},
{0, 55301, 0, "delete_char", 11, LINK_PROCS(delete_char)},
{0, 55301, 8, "delete_char", 11, LINK_PROCS(delete_char)},
{0, 55296, 0, "backspace_char", 14, LINK_PROCS(backspace_char)},
{0, 55296, 8, "backspace_char", 14, LINK_PROCS(backspace_char)},
{0, 55297, 0, "move_up", 7, LINK_PROCS(move_up)},
{0, 55298, 0, "move_down", 9, LINK_PROCS(move_down)},
{0, 55304, 0, "seek_end_of_line", 16, LINK_PROCS(seek_end_of_line)},
{0, 55303, 0, "seek_beginning_of_line", 22, LINK_PROCS(seek_beginning_of_line)},
{0, 55305, 0, "page_up", 7, LINK_PROCS(page_up)},
{0, 55306, 0, "page_down", 9, LINK_PROCS(page_down)},
{0, 55300, 1, "seek_whitespace_right", 21, LINK_PROCS(seek_whitespace_right)},
{0, 55299, 1, "seek_whitespace_left", 20, LINK_PROCS(seek_whitespace_left)},
{0, 55297, 1, "seek_whitespace_up_end_line", 27, LINK_PROCS(seek_whitespace_up_end_line)},
{0, 55298, 1, "seek_whitespace_down_end_line", 29, LINK_PROCS(seek_whitespace_down_end_line)},
{0, 55297, 2, "move_up_10", 10, LINK_PROCS(move_up_10)},
{0, 55298, 2, "move_down_10", 12, LINK_PROCS(move_down_10)},
{0, 55296, 1, "backspace_word", 14, LINK_PROCS(backspace_word)},
{0, 55301, 1, "delete_word", 11, LINK_PROCS(delete_word)},
{0, 55296, 2, "snipe_token_or_word", 19, LINK_PROCS(snipe_token_or_word)},
{0, 55301, 2, "snipe_token_or_word_right", 25, LINK_PROCS(snipe_token_or_word_right)},
{0, 32, 1, "set_mark", 8, LINK_PROCS(set_mark)},
{0, 97, 1, "replace_in_range", 16, LINK_PROCS(replace_in_range)},
{0, 99, 1, "copy", 4, LINK_PROCS(copy)},
{0, 100, 1, "delete_range", 12, LINK_PROCS(delete_range)},
{0, 101, 1, "center_view", 11, LINK_PROCS(center_view)},
{0, 69, 1, "left_adjust_view", 16, LINK_PROCS(left_adjust_view)},
{0, 102, 1, "search", 6, LINK_PROCS(search)},
{0, 70, 1, "list_all_locations", 18, LINK_PROCS(list_all_locations)},
{0, 70, 2, "list_all_substring_locations_case_insensitive", 45, LINK_PROCS(list_all_substring_locations_case_insensitive)},
{0, 103, 1, "goto_line", 9, LINK_PROCS(goto_line)},
{0, 106, 1, "to_lowercase", 12, LINK_PROCS(to_lowercase)},
{0, 75, 1, "kill_buffer", 11, LINK_PROCS(kill_buffer)},
{0, 108, 1, "toggle_line_wrap", 16, LINK_PROCS(toggle_line_wrap)},
{0, 109, 1, "cursor_mark_swap", 16, LINK_PROCS(cursor_mark_swap)},
{0, 79, 1, "reopen", 6, LINK_PROCS(reopen)},
{0, 113, 1, "query_replace", 13, LINK_PROCS(query_replace)},
{0, 81, 1, "query_replace_identifier", 24, LINK_PROCS(query_replace_identifier)},
{0, 114, 1, "reverse_search", 14, LINK_PROCS(reverse_search)},
{0, 115, 1, "save", 4, LINK_PROCS(save)},
{0, 116, 1, "search_identifier", 17, LINK_PROCS(search_identifier)},
{0, 84, 1, "list_all_locations_of_identifier", 32, LINK_PROCS(list_all_locations_of_identifier)},
{0, 117, 1, "to_uppercase", 12, LINK_PROCS(to_uppercase)},
{0, 118, 1, "paste_and_indent", 16, LINK_PROCS(paste_and_indent)},
{0, 118, 2, "toggle_virtual_whitespace", 25, LINK_PROCS(toggle_virtual_whitespace)},
{0, 86, 1, "paste_next_and_indent", 21, LINK_PROCS(paste_next_and_indent)},
{0, 120, 1, "cut", 3, LINK_PROCS(cut)},
{0, 121, 1, "redo", 4, LINK_PROCS(redo)},
{0, 122, 1, "undo", 4, LINK_PROCS(undo)},
{0, 50, 1, "decrease_line_wrap", 18, LINK_PROCS(decrease_line_wrap)},
{0, 51, 1, "increase_line_wrap", 18, LINK_PROCS(increase_line_wrap)},
{0, 63, 1, "toggle_show_whitespace", 22, LINK_PROCS(toggle_show_whitespace)},
{0, 126, 1, "clean_all_lines", 15, LINK_PROCS(clean_all_lines)},
{0, 10, 0, "newline_or_goto_position", 24, LINK_PROCS(newline_or_goto_position)},
{0, 10, 8, "newline_or_goto_position_same_panel", 35, LINK_PROCS(newline_or_goto_position_same_panel)},
{0, 32, 8, "write_character", 15, LINK_PROCS(write_character)},
};
static Meta_Key_Bind fcoder_binds_for_default_default_code_map[24] = {
{0, 55300, 1, "seek_alphanumeric_or_camel_right", 32, LINK_PROCS(seek_alphanumeric_or_camel_right)},
{0, 55299, 1, "seek_alphanumeric_or_camel_left", 31, LINK_PROCS(seek_alphanumeric_or_camel_left)},
{0, 10, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 10, 8, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 125, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 41, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 93, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 59, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 35, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 9, 0, "word_complete", 13, LINK_PROCS(word_complete)},
{0, 9, 1, "auto_tab_range", 14, LINK_PROCS(auto_tab_range)},
{0, 9, 8, "auto_tab_line_at_cursor", 23, LINK_PROCS(auto_tab_line_at_cursor)},
{0, 104, 2, "write_hack", 10, LINK_PROCS(write_hack)},
{0, 114, 2, "write_block", 11, LINK_PROCS(write_block)},
{0, 116, 2, "write_todo", 10, LINK_PROCS(write_todo)},
{0, 121, 2, "write_note", 10, LINK_PROCS(write_note)},
{0, 91, 1, "open_long_braces", 16, LINK_PROCS(open_long_braces)},
{0, 123, 1, "open_long_braces_semicolon", 26, LINK_PROCS(open_long_braces_semicolon)},
{0, 125, 1, "open_long_braces_break", 22, LINK_PROCS(open_long_braces_break)},
{0, 105, 2, "if0_off", 7, LINK_PROCS(if0_off)},
{0, 49, 2, "open_file_in_quotes", 19, LINK_PROCS(open_file_in_quotes)},
{0, 50, 2, "open_matching_file_cpp", 22, LINK_PROCS(open_matching_file_cpp)},
{0, 48, 1, "write_zero_struct", 17, LINK_PROCS(write_zero_struct)},
{0, 73, 1, "list_all_functions_current_buffer", 33, LINK_PROCS(list_all_functions_current_buffer)},
};
static Meta_Sub_Map fcoder_submaps_for_default[3] = {
{"mapid_global", 12, "TODO", 4, 0, 0, fcoder_binds_for_default_mapid_global, 45},
{"mapid_file", 10, "TODO", 4, 0, 0, fcoder_binds_for_default_mapid_file, 61},
{"default_code_map", 16, "TODO", 4, "mapid_file", 10, fcoder_binds_for_default_default_code_map, 24},
};
static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_global[45] = {
{0, 112, 4, "open_panel_vsplit", 17, LINK_PROCS(open_panel_vsplit)},
{0, 95, 4, "open_panel_hsplit", 17, LINK_PROCS(open_panel_hsplit)},
{0, 80, 4, "close_panel", 11, LINK_PROCS(close_panel)},
{0, 44, 4, "change_active_panel", 19, LINK_PROCS(change_active_panel)},
{0, 60, 4, "change_active_panel_backwards", 29, LINK_PROCS(change_active_panel_backwards)},
{0, 110, 4, "interactive_new", 15, LINK_PROCS(interactive_new)},
{0, 111, 4, "interactive_open_or_new", 23, LINK_PROCS(interactive_open_or_new)},
{0, 111, 1, "open_in_other", 13, LINK_PROCS(open_in_other)},
{0, 107, 4, "interactive_kill_buffer", 23, LINK_PROCS(interactive_kill_buffer)},
{0, 105, 4, "interactive_switch_buffer", 25, LINK_PROCS(interactive_switch_buffer)},
{0, 104, 4, "project_go_to_root_directory", 28, LINK_PROCS(project_go_to_root_directory)},
{0, 83, 4, "save_all_dirty_buffers", 22, LINK_PROCS(save_all_dirty_buffers)},
{0, 99, 1, "open_color_tweaker", 18, LINK_PROCS(open_color_tweaker)},
{0, 100, 1, "open_debug", 10, LINK_PROCS(open_debug)},
{0, 46, 1, "change_to_build_panel", 21, LINK_PROCS(change_to_build_panel)},
{0, 44, 1, "close_build_panel", 17, LINK_PROCS(close_build_panel)},
{0, 110, 1, "goto_next_error", 15, LINK_PROCS(goto_next_error)},
{0, 78, 1, "goto_prev_error", 15, LINK_PROCS(goto_prev_error)},
{0, 77, 1, "goto_first_error", 16, LINK_PROCS(goto_first_error)},
{0, 109, 1, "build_in_build_panel", 20, LINK_PROCS(build_in_build_panel)},
{0, 122, 1, "execute_any_cli", 15, LINK_PROCS(execute_any_cli)},
{0, 90, 1, "execute_previous_cli", 20, LINK_PROCS(execute_previous_cli)},
{0, 120, 1, "execute_arbitrary_command", 25, LINK_PROCS(execute_arbitrary_command)},
{0, 115, 1, "show_scrollbar", 14, LINK_PROCS(show_scrollbar)},
{0, 119, 1, "hide_scrollbar", 14, LINK_PROCS(hide_scrollbar)},
{0, 98, 1, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
{0, 64, 1, "toggle_mouse", 12, LINK_PROCS(toggle_mouse)},
{0, 55305, 4, "toggle_fullscreen", 17, LINK_PROCS(toggle_fullscreen)},
{0, 69, 1, "exit_4coder", 11, LINK_PROCS(exit_4coder)},
{0, 55312, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55313, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55314, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55315, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55316, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55317, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55318, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55319, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55320, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55321, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55322, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55323, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55324, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55325, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55326, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55327, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
};
static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_file[60] = {
{1, 0, 0, "write_character", 15, LINK_PROCS(write_character)},
{1, 0, 2, "write_character", 15, LINK_PROCS(write_character)},
{0, 55308, 0, "click_set_cursor", 16, LINK_PROCS(click_set_cursor)},
{0, 55310, 0, "click_set_mark", 14, LINK_PROCS(click_set_mark)},
{0, 55309, 0, "click_set_mark", 14, LINK_PROCS(click_set_mark)},
{0, 55299, 0, "move_left", 9, LINK_PROCS(move_left)},
{0, 55300, 0, "move_right", 10, LINK_PROCS(move_right)},
{0, 55301, 0, "delete_char", 11, LINK_PROCS(delete_char)},
{0, 55301, 8, "delete_char", 11, LINK_PROCS(delete_char)},
{0, 55296, 0, "backspace_char", 14, LINK_PROCS(backspace_char)},
{0, 55296, 8, "backspace_char", 14, LINK_PROCS(backspace_char)},
{0, 55297, 0, "move_up", 7, LINK_PROCS(move_up)},
{0, 55298, 0, "move_down", 9, LINK_PROCS(move_down)},
{0, 55304, 0, "seek_end_of_line", 16, LINK_PROCS(seek_end_of_line)},
{0, 55303, 0, "seek_beginning_of_line", 22, LINK_PROCS(seek_beginning_of_line)},
{0, 55305, 0, "page_up", 7, LINK_PROCS(page_up)},
{0, 55306, 0, "page_down", 9, LINK_PROCS(page_down)},
{0, 55300, 4, "seek_whitespace_right", 21, LINK_PROCS(seek_whitespace_right)},
{0, 55299, 4, "seek_whitespace_left", 20, LINK_PROCS(seek_whitespace_left)},
{0, 55297, 4, "seek_whitespace_up_end_line", 27, LINK_PROCS(seek_whitespace_up_end_line)},
{0, 55298, 4, "seek_whitespace_down_end_line", 29, LINK_PROCS(seek_whitespace_down_end_line)},
{0, 55296, 4, "backspace_word", 14, LINK_PROCS(backspace_word)},
{0, 55301, 4, "delete_word", 11, LINK_PROCS(delete_word)},
{0, 55296, 1, "snipe_token_or_word", 19, LINK_PROCS(snipe_token_or_word)},
{0, 55301, 1, "snipe_token_or_word_right", 25, LINK_PROCS(snipe_token_or_word_right)},
{0, 47, 4, "set_mark", 8, LINK_PROCS(set_mark)},
{0, 97, 4, "replace_in_range", 16, LINK_PROCS(replace_in_range)},
{0, 99, 4, "copy", 4, LINK_PROCS(copy)},
{0, 100, 4, "delete_range", 12, LINK_PROCS(delete_range)},
{0, 101, 4, "center_view", 11, LINK_PROCS(center_view)},
{0, 69, 4, "left_adjust_view", 16, LINK_PROCS(left_adjust_view)},
{0, 102, 4, "search", 6, LINK_PROCS(search)},
{0, 70, 4, "list_all_locations", 18, LINK_PROCS(list_all_locations)},
{0, 70, 1, "list_all_substring_locations_case_insensitive", 45, LINK_PROCS(list_all_substring_locations_case_insensitive)},
{0, 103, 4, "goto_line", 9, LINK_PROCS(goto_line)},
{0, 106, 4, "to_lowercase", 12, LINK_PROCS(to_lowercase)},
{0, 75, 4, "kill_buffer", 11, LINK_PROCS(kill_buffer)},
{0, 108, 4, "toggle_line_wrap", 16, LINK_PROCS(toggle_line_wrap)},
{0, 109, 4, "cursor_mark_swap", 16, LINK_PROCS(cursor_mark_swap)},
{0, 79, 4, "reopen", 6, LINK_PROCS(reopen)},
{0, 113, 4, "query_replace", 13, LINK_PROCS(query_replace)},
{0, 81, 4, "query_replace_identifier", 24, LINK_PROCS(query_replace_identifier)},
{0, 114, 4, "reverse_search", 14, LINK_PROCS(reverse_search)},
{0, 115, 4, "save", 4, LINK_PROCS(save)},
{0, 116, 4, "search_identifier", 17, LINK_PROCS(search_identifier)},
{0, 84, 4, "list_all_locations_of_identifier", 32, LINK_PROCS(list_all_locations_of_identifier)},
{0, 117, 4, "to_uppercase", 12, LINK_PROCS(to_uppercase)},
{0, 118, 4, "paste_and_indent", 16, LINK_PROCS(paste_and_indent)},
{0, 118, 1, "toggle_virtual_whitespace", 25, LINK_PROCS(toggle_virtual_whitespace)},
{0, 86, 4, "paste_next_and_indent", 21, LINK_PROCS(paste_next_and_indent)},
{0, 120, 4, "cut", 3, LINK_PROCS(cut)},
{0, 121, 4, "redo", 4, LINK_PROCS(redo)},
{0, 122, 4, "undo", 4, LINK_PROCS(undo)},
{0, 50, 4, "decrease_line_wrap", 18, LINK_PROCS(decrease_line_wrap)},
{0, 51, 4, "increase_line_wrap", 18, LINK_PROCS(increase_line_wrap)},
{0, 63, 4, "toggle_show_whitespace", 22, LINK_PROCS(toggle_show_whitespace)},
{0, 126, 4, "clean_all_lines", 15, LINK_PROCS(clean_all_lines)},
{0, 10, 0, "newline_or_goto_position", 24, LINK_PROCS(newline_or_goto_position)},
{0, 10, 8, "newline_or_goto_position_same_panel", 35, LINK_PROCS(newline_or_goto_position_same_panel)},
{0, 32, 8, "write_character", 15, LINK_PROCS(write_character)},
};
static Meta_Key_Bind fcoder_binds_for_mac_default_default_code_map[24] = {
{0, 55300, 4, "seek_alphanumeric_or_camel_right", 32, LINK_PROCS(seek_alphanumeric_or_camel_right)},
{0, 55299, 4, "seek_alphanumeric_or_camel_left", 31, LINK_PROCS(seek_alphanumeric_or_camel_left)},
{0, 10, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 10, 8, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 125, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 41, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 93, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 59, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 35, 0, "write_and_auto_tab", 18, LINK_PROCS(write_and_auto_tab)},
{0, 9, 0, "word_complete", 13, LINK_PROCS(word_complete)},
{0, 9, 4, "auto_tab_range", 14, LINK_PROCS(auto_tab_range)},
{0, 9, 8, "auto_tab_line_at_cursor", 23, LINK_PROCS(auto_tab_line_at_cursor)},
{0, 104, 1, "write_hack", 10, LINK_PROCS(write_hack)},
{0, 114, 1, "write_block", 11, LINK_PROCS(write_block)},
{0, 116, 1, "write_todo", 10, LINK_PROCS(write_todo)},
{0, 121, 1, "write_note", 10, LINK_PROCS(write_note)},
{0, 91, 4, "open_long_braces", 16, LINK_PROCS(open_long_braces)},
{0, 123, 4, "open_long_braces_semicolon", 26, LINK_PROCS(open_long_braces_semicolon)},
{0, 125, 4, "open_long_braces_break", 22, LINK_PROCS(open_long_braces_break)},
{0, 105, 1, "if0_off", 7, LINK_PROCS(if0_off)},
{0, 49, 1, "open_file_in_quotes", 19, LINK_PROCS(open_file_in_quotes)},
{0, 50, 1, "open_matching_file_cpp", 22, LINK_PROCS(open_matching_file_cpp)},
{0, 48, 4, "write_zero_struct", 17, LINK_PROCS(write_zero_struct)},
{0, 73, 4, "list_all_functions_current_buffer", 33, LINK_PROCS(list_all_functions_current_buffer)},
};
static Meta_Sub_Map fcoder_submaps_for_mac_default[3] = {
{"mapid_global", 12, "TODO", 4, 0, 0, fcoder_binds_for_mac_default_mapid_global, 45},
{"mapid_file", 10, "TODO", 4, 0, 0, fcoder_binds_for_mac_default_mapid_file, 60},
{"default_code_map", 16, "TODO", 4, "mapid_file", 10, fcoder_binds_for_mac_default_default_code_map, 24},
};
static Meta_Mapping fcoder_meta_maps[2] = {
{"default", 7, "TODO", 4, fcoder_submaps_for_default, 3, LINK_PROCS(fill_keys_default)},
{"mac_default", 11, "TODO", 4, fcoder_submaps_for_mac_default, 3, LINK_PROCS(fill_keys_mac_default)},
};

View File

@ -6,11 +6,16 @@ TYPE: 'code-preprocessor'
// TOP // TOP
#define COMMAND_METADATA_OUT "4coder_generated/command_metadata.h"
#include "4coder_lib/4coder_mem.h" #include "4coder_lib/4coder_mem.h"
#define FSTRING_IMPLEMENTATION #define FSTRING_IMPLEMENTATION
#include "4coder_lib/4coder_string.h" #include "4coder_lib/4coder_string.h"
#include "4cpp/4cpp_lexer.h" #include "4cpp/4cpp_lexer.h"
#define str_to_l_c(s) ((s).size), ((s).str)
#define str_to_c_l(s) ((s).str), ((s).size)
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
@ -279,8 +284,15 @@ file_dump(Partition *part, char *name){
return(text); return(text);
} }
static void ///////////////////////////////
error(char *source_name, String text, int32_t pos, char *msg){
struct Line_Column_Coordinates{
int32_t line;
int32_t column;
};
static Line_Column_Coordinates
line_column_coordinates(String text, int32_t pos){
if (pos < 0){ if (pos < 0){
pos = 0; pos = 0;
} }
@ -288,23 +300,38 @@ error(char *source_name, String text, int32_t pos, char *msg){
pos = text.size; pos = text.size;
} }
int32_t line_number = 1; Line_Column_Coordinates coords = {0};
int32_t character_pos = 1; coords.line = 1;
coords.column = 1;
char *end = text.str + pos; char *end = text.str + pos;
for (char *p = text.str; p < end; ++p){ for (char *p = text.str; p < end; ++p){
if (*p == '\n'){ if (*p == '\n'){
++line_number; ++coords.line;
character_pos = 1; coords.column = 1;
} }
else{ else{
++character_pos; ++coords.column;
} }
} }
fprintf(stdout, "%s:%d:%d: %s\n", source_name, line_number, character_pos, msg); return(coords);
}
static int32_t
line_number(String text, int32_t pos){
Line_Column_Coordinates coords = line_column_coordinates(text, pos);
return(coords.line);
}
static void
error(char *source_name, String text, int32_t pos, char *msg){
Line_Column_Coordinates coords = line_column_coordinates(text, pos);
fprintf(stdout, "%s:%d:%d: %s\n", source_name, coords.line, coords.column, msg);
fflush(stdout); fflush(stdout);
} }
///////////////////////////////
struct Reader{ struct Reader{
char *source_name; char *source_name;
String text; String text;
@ -312,6 +339,11 @@ struct Reader{
Cpp_Token *ptr; Cpp_Token *ptr;
}; };
struct Temp_Read{
Reader *reader;
Cpp_Token *pos;
};
static Reader static Reader
make_reader(Cpp_Token_Array array, char *source_name, String text){ make_reader(Cpp_Token_Array array, char *source_name, String text){
Reader reader = {0}; Reader reader = {0};
@ -401,16 +433,17 @@ peek_pos(Reader *reader){
return(token.start); return(token.start);
} }
static int32_t
line_number(Reader *reader, int32_t pos){
int32_t result = line_number(reader->text, pos);
return(result);
}
static void static void
error(Reader *reader, int32_t pos, char *msg){ error(Reader *reader, int32_t pos, char *msg){
error(reader->source_name, reader->text, pos, msg); error(reader->source_name, reader->text, pos, msg);
} }
struct Temp_Read{
Reader *reader;
Cpp_Token *pos;
};
static Temp_Read static Temp_Read
begin_temp_read(Reader *reader){ begin_temp_read(Reader *reader){
Temp_Read temp = {0}; Temp_Read temp = {0};
@ -424,14 +457,70 @@ end_temp_read(Temp_Read temp){
temp.reader->ptr = temp.pos; temp.reader->ptr = temp.pos;
} }
///////////////////////////////
static String static String
token_str(String text, Cpp_Token token){ token_str(String text, Cpp_Token token){
String str = substr(text, token.start, token.size); String str = substr(text, token.start, token.size);
return(str); return(str);
} }
///////////////////////////////
#define sll_push(f,l,n) if((f)==0){(f)=(l)=(n);}else{(l)->next=(n);(l)=(n);}(n)->next=0
///////////////////////////////
typedef uint32_t Meta_Command_Entry_Type;
enum{
MetaCommandEntry_DocString,
MetaCommandEntry_Alias,
};
struct Meta_Command_Entry{
Meta_Command_Entry *next;
String name;
char *source_name;
int32_t line_number;
union{
struct{
String doc;
} docstring;
struct{
String potential;
} alias;
};
};
struct Meta_Command_Entry_Arrays{
Meta_Command_Entry *first_doc_string;
Meta_Command_Entry *last_doc_string;
int32_t doc_string_count;
Meta_Command_Entry *first_alias;
Meta_Command_Entry *last_alias;
int32_t alias_count;
};
///////////////////////////////
static bool32 static bool32
require_key_identifier(Reader *reader, char *str){ has_duplicate_entry(Meta_Command_Entry *first, String name){
bool32 has_duplicate = false;
for (Meta_Command_Entry *entry = first;
entry != 0;
entry = entry->next){
if (match(name, entry->name)){
has_duplicate = true;
}
}
return(has_duplicate);
}
///////////////////////////////
static bool32
require_key_identifier(Reader *reader, char *str, int32_t *opt_pos_out = 0){
bool32 success = false; bool32 success = false;
Cpp_Token token = get_token(reader); Cpp_Token token = get_token(reader);
@ -439,6 +528,9 @@ require_key_identifier(Reader *reader, char *str){
String lexeme = token_str(reader->text, token); String lexeme = token_str(reader->text, token);
if (match(lexeme, str)){ if (match(lexeme, str)){
success = true; success = true;
if (opt_pos_out != 0){
*opt_pos_out = token.start;
}
} }
} }
@ -456,12 +548,15 @@ require_key_identifier(Reader *reader, char *str){
} }
static bool32 static bool32
require_open_parenthese(Reader *reader){ require_open_parenthese(Reader *reader, int32_t *opt_pos_out = 0){
bool32 success = false; bool32 success = false;
Cpp_Token token = get_token(reader); Cpp_Token token = get_token(reader);
if (token.type == CPP_TOKEN_PARENTHESE_OPEN){ if (token.type == CPP_TOKEN_PARENTHESE_OPEN){
success = true; success = true;
if (opt_pos_out != 0){
*opt_pos_out = token.start;
}
} }
if (!success){ if (!success){
@ -472,12 +567,15 @@ require_open_parenthese(Reader *reader){
} }
static bool32 static bool32
require_close_parenthese(Reader *reader){ require_close_parenthese(Reader *reader, int32_t *opt_pos_out = 0){
bool32 success = false; bool32 success = false;
Cpp_Token token = get_token(reader); Cpp_Token token = get_token(reader);
if (token.type == CPP_TOKEN_PARENTHESE_CLOSE){ if (token.type == CPP_TOKEN_PARENTHESE_CLOSE){
success = true; success = true;
if (opt_pos_out != 0){
*opt_pos_out = token.start;
}
} }
if (!success){ if (!success){
@ -488,12 +586,15 @@ require_close_parenthese(Reader *reader){
} }
static bool32 static bool32
require_define(Reader *reader){ require_define(Reader *reader, int32_t *opt_pos_out = 0){
bool32 success = false; bool32 success = false;
Cpp_Token token = get_token(reader); Cpp_Token token = get_token(reader);
if (token.type == CPP_PP_DEFINE){ if (token.type == CPP_PP_DEFINE){
success = true; success = true;
if (opt_pos_out != 0){
*opt_pos_out = token.start;
}
} }
if (!success){ if (!success){
@ -504,7 +605,7 @@ require_define(Reader *reader){
} }
static bool32 static bool32
extract_identifier(Reader *reader, String *str_out){ extract_identifier(Reader *reader, String *str_out, int32_t *opt_pos_out = 0){
bool32 success = false; bool32 success = false;
Cpp_Token token = get_token(reader); Cpp_Token token = get_token(reader);
@ -512,6 +613,9 @@ extract_identifier(Reader *reader, String *str_out){
String lexeme = token_str(reader->text, token); String lexeme = token_str(reader->text, token);
*str_out = lexeme; *str_out = lexeme;
success = true; success = true;
if (opt_pos_out != 0){
*opt_pos_out = token.start;
}
} }
if (!success){ if (!success){
@ -522,7 +626,7 @@ extract_identifier(Reader *reader, String *str_out){
} }
static bool32 static bool32
extract_string(Reader *reader, String *str_out){ extract_string(Reader *reader, String *str_out, int32_t *opt_pos_out = 0){
bool32 success = false; bool32 success = false;
Cpp_Token token = get_token(reader); Cpp_Token token = get_token(reader);
@ -530,6 +634,9 @@ extract_string(Reader *reader, String *str_out){
String lexeme = token_str(reader->text, token); String lexeme = token_str(reader->text, token);
*str_out = lexeme; *str_out = lexeme;
success = true; success = true;
if (opt_pos_out != 0){
*opt_pos_out = token.start;
}
} }
if (!success){ if (!success){
@ -540,12 +647,13 @@ extract_string(Reader *reader, String *str_out){
} }
static bool32 static bool32
parse_documented_command(Partition *part, Reader *reader){ parse_documented_command(Partition *part, Meta_Command_Entry_Arrays *arrays, Reader *reader){
String name = {0}; String name = {0};
String doc = {0}; String doc = {0};
// Getting the command's name // Getting the command's name
if (!require_key_identifier(reader, "CUSTOM_COMMAND_SIG")){ int32_t start_pos = 0;
if (!require_key_identifier(reader, "CUSTOM_COMMAND_SIG", &start_pos)){
return(false); return(false);
} }
@ -570,7 +678,13 @@ parse_documented_command(Partition *part, Reader *reader){
return(false); return(false);
} }
if (!extract_string(reader, &doc)){ int32_t doc_pos = 0;
if (!extract_string(reader, &doc, &doc_pos)){
return(false);
}
if (doc.size < 1 || doc.str[0] != '"'){
error(reader, doc_pos, "warning: doc strings with string literal prefixes not allowed");
return(false); return(false);
} }
@ -578,24 +692,35 @@ parse_documented_command(Partition *part, Reader *reader){
return(false); return(false);
} }
// TODO(allen): Store into data structure for codegen. if (has_duplicate_entry(arrays->first_doc_string, name)){
//error(reader, name_pos, "name of a command"); error(reader, start_pos, "warning: multiple commands with the same name and separate doc strings, skipping this one");
//error(reader, str_pos, "doc string of a command"); return(false);
}
doc = substr(doc, 1, doc.size - 2);
Meta_Command_Entry *new_entry = push_array(part, Meta_Command_Entry, 1);
new_entry->name = name;
new_entry->source_name = reader->source_name;
new_entry->line_number = line_number(reader, start_pos);
new_entry->docstring.doc = doc;
sll_push(arrays->first_doc_string, arrays->last_doc_string, new_entry);
++arrays->doc_string_count;
return(true); return(true);
} }
static bool32 static bool32
parse_alias(Partition *part, Reader *reader){ parse_alias(Partition *part, Meta_Command_Entry_Arrays *arrays, Reader *reader){
String name = {0}; String name = {0};
String potential = {0}; String potential = {0};
// Getting the alias's name // Getting the alias's name
if (!require_define(reader)){ int32_t start_pos = 0;
if (!require_define(reader, &start_pos)){
return(false); return(false);
} }
int32_t name_pos = peek_pos(reader);
if (!extract_identifier(reader, &name)){ if (!extract_identifier(reader, &name)){
return(false); return(false);
} }
@ -609,7 +734,6 @@ parse_alias(Partition *part, Reader *reader){
return(false); return(false);
} }
int32_t potential_pos = peek_pos(reader);
if (!extract_identifier(reader, &potential)){ if (!extract_identifier(reader, &potential)){
return(false); return(false);
} }
@ -618,14 +742,21 @@ parse_alias(Partition *part, Reader *reader){
return(false); return(false);
} }
error(reader, name_pos, "name of an alias"); Meta_Command_Entry *new_entry = push_array(part, Meta_Command_Entry, 1);
error(reader, potential_pos, "name of a potential"); new_entry->name = name;
new_entry->source_name = reader->source_name;
new_entry->line_number = line_number(reader, start_pos);
new_entry->alias.potential = potential;
sll_push(arrays->first_alias, arrays->last_alias, new_entry);
++arrays->alias_count;
return(true); return(true);
} }
///////////////////////////////
static void static void
parse_text(Partition *part, char *source_name, String text){ parse_text(Partition *part, Meta_Command_Entry_Arrays *entry_arrays, char *source_name, String text){
Cpp_Token_Array array = cpp_make_token_array(1024); Cpp_Token_Array array = cpp_make_token_array(1024);
cpp_lex_file(text.str, text.size, &array); cpp_lex_file(text.str, text.size, &array);
@ -662,7 +793,7 @@ parse_text(Partition *part, char *source_name, String text){
end_temp_read(temp_read); end_temp_read(temp_read);
} }
else{ else{
if (!parse_documented_command(part, reader)){ if (!parse_documented_command(part, entry_arrays, reader)){
end_temp_read(temp_read); end_temp_read(temp_read);
} }
} }
@ -688,7 +819,7 @@ parse_text(Partition *part, char *source_name, String text){
end_temp_read(temp_read); end_temp_read(temp_read);
} }
else{ else{
if (!parse_alias(part, reader)){ if (!parse_alias(part, entry_arrays, reader)){
end_temp_read(temp_read); end_temp_read(temp_read);
} }
} }
@ -704,7 +835,7 @@ parse_text(Partition *part, char *source_name, String text){
} }
static void static void
parse_file(Partition *part, Filename_Character *name_, int32_t len){ parse_file(Partition *part, Meta_Command_Entry_Arrays *entry_arrays, Filename_Character *name_, int32_t len){
char *name = unencode(part, name_, len); char *name = unencode(part, name_, len);
if (name == 0){ if (name == 0){
if (sizeof(*name_) == 2){ if (sizeof(*name_) == 2){
@ -717,15 +848,19 @@ parse_file(Partition *part, Filename_Character *name_, int32_t len){
} }
String text = file_dump(part, name); String text = file_dump(part, name);
parse_text(part, name, text); parse_text(part, entry_arrays, name, text);
} }
static void static void
parse_files_in_directory(Partition *part, Filename_Character *root, bool32 recursive){ parse_files_in_directory(Partition *part, Meta_Command_Entry_Arrays *entry_arrays, Filename_Character *root, bool32 recursive){
File_List list = get_file_list(part, root); File_List list = get_file_list(part, root);
for (int32_t i = 0; i < list.count; ++i){ for (int32_t i = 0; i < list.count; ++i){
File_Info *info = &list.info[i]; File_Info *info = &list.info[i];
if (info->is_folder && match(make_string(info->name, info->len), "4coder_generated")){
continue;
}
int32_t full_name_len = list.final_length + 1 + info->len; int32_t full_name_len = list.final_length + 1 + info->len;
Filename_Character *full_name = push_array(part, Filename_Character, full_name_len + 1); Filename_Character *full_name = push_array(part, Filename_Character, full_name_len + 1);
push_align(part, 8); push_align(part, 8);
@ -741,10 +876,10 @@ parse_files_in_directory(Partition *part, Filename_Character *root, bool32 recur
full_name[full_name_len] = 0; full_name[full_name_len] = 0;
if (!info->is_folder){ if (!info->is_folder){
parse_file(part, full_name, full_name_len); parse_file(part, entry_arrays, full_name, full_name_len);
} }
else{ else{
parse_files_in_directory(part, full_name, recursive); parse_files_in_directory(part, entry_arrays, full_name, recursive);
} }
} }
} }
@ -780,9 +915,84 @@ main(int argc, char **argv){
start_i = 2; start_i = 2;
} }
Meta_Command_Entry_Arrays entry_arrays = {0};
for (int32_t i = start_i; i < argc; ++i){ for (int32_t i = start_i; i < argc; ++i){
Filename_Character *root_name = encode(part, argv[i]); Filename_Character *root_name = encode(part, argv[i]);
parse_files_in_directory(part, root_name, recursive); parse_files_in_directory(part, &entry_arrays, root_name, recursive);
}
FILE *out = fopen(COMMAND_METADATA_OUT, "wb");
if (out != 0){
fprintf(out, "#define command_id(c) (fcoder_metacmd_ID_##c)\n");
fprintf(out, "#define command_metadata(c) (&fcoder_metacmd_table[command_id(c)])\n");
fprintf(out, "#define command_metadata_by_id(id) (&fcoder_metacmd_table[id])\n");
fprintf(out, "#define command_one_past_last_id %d\n", entry_arrays.doc_string_count);
fprintf(out, "#if defined(CUSTOM_COMMAND_SIG)\n");
fprintf(out, "#define PROC_LINKS(x,y) x\n");
fprintf(out, "#else\n");
fprintf(out, "#define PROC_LINKS(x,y) y\n");
fprintf(out, "#endif\n");
fprintf(out, "#if defined(CUSTOM_COMMAND_SIG)\n");
for (Meta_Command_Entry *entry = entry_arrays.first_doc_string;
entry != 0;
entry = entry->next){
fprintf(out, "CUSTOM_COMMAND_SIG(%.*s);\n", str_to_l_c(entry->name));
}
fprintf(out, "#endif\n");
fprintf(out,
"struct Command_Metadata{\n"
"PROC_LINKS(Custom_Command_Function, void) *proc;\n"
"char *name;\n"
"int32_t name_len;\n"
"char *description;\n"
"int32_t description_len;\n"
"char *source_name;\n"
"int32_t source_name_len;\n"
"int32_t line_number;\n"
"};\n");
fprintf(out,
"static Command_Metadata fcoder_metacmd_table[%d] = {\n",
entry_arrays.doc_string_count);
for (Meta_Command_Entry *entry = entry_arrays.first_doc_string;
entry != 0;
entry = entry->next){
Temp_Memory temp = begin_temp_memory(part);
// HACK(allen): We could just get these at the HEAD END of the process,
// then we only have to do it once per file, and pass the lengths through.
int32_t source_name_len = str_size(entry->source_name);
char *fixed_name = push_array(part, char, source_name_len*2 + 1);
String s = make_string_cap(fixed_name, 0, source_name_len*2 + 1);
copy(&s, entry->source_name);
replace_str(&s, "\\", "\\\\");
terminate_with_null(&s);
fprintf(out,
"{ PROC_LINKS(%.*s, 0), \"%.*s\", %d, \"%.*s\", %d, \"%s\", %d, %d },\n",
str_to_l_c(entry->name),
str_to_l_c(entry->name), entry->name.size,
str_to_l_c(entry->docstring.doc), entry->docstring.doc.size,
s.str, s.size, entry->line_number);
end_temp_memory(temp);
}
fprintf(out, "};\n");
int32_t id = 0;
for (Meta_Command_Entry *entry = entry_arrays.first_doc_string;
entry != 0;
entry = entry->next){
fprintf(out, "static int32_t fcoder_metacmd_ID_%.*s = %d;\n",
str_to_l_c(entry->name), id);
++id;
}
}
else{
fprintf(stdout, "fatal error: could not open output file %s\n", COMMAND_METADATA_OUT);
} }
return(0); return(0);

View File

@ -14,352 +14,16 @@ TYPE: 'drop-in-command-pack'
// Buffer Filling Helpers // Buffer Filling Helpers
// //
#include "4coder_generated/remapping.h"
void void
default_keys(Bind_Helper *context){ default_keys(Bind_Helper *context){
// NOTE(allen|a4.0.22): GLOBAL fill_keys_default(context);
begin_map(context, mapid_global);
bind(context, 'p', MDFR_CTRL, open_panel_vsplit);
bind(context, '_', MDFR_CTRL, open_panel_hsplit);
bind(context, 'P', MDFR_CTRL, close_panel);
bind(context, ',', MDFR_CTRL, change_active_panel);
bind(context, '<', MDFR_CTRL, change_active_panel_backwards);
bind(context, 'n', MDFR_CTRL, interactive_new);
bind(context, 'o', MDFR_CTRL, interactive_open_or_new);
bind(context, 'o', MDFR_ALT, open_in_other);
bind(context, 'k', MDFR_CTRL, interactive_kill_buffer);
bind(context, 'i', MDFR_CTRL, interactive_switch_buffer);
bind(context, 'h', MDFR_CTRL, project_go_to_root_directory);
bind(context, 'S', MDFR_CTRL, save_all_dirty_buffers);
bind(context, 'c', MDFR_ALT, open_color_tweaker);
bind(context, 'd', MDFR_ALT, open_debug);
bind(context, '.', MDFR_ALT, change_to_build_panel);
bind(context, ',', MDFR_ALT, close_build_panel);
bind(context, 'n', MDFR_ALT, goto_next_error);
bind(context, 'N', MDFR_ALT, goto_prev_error);
bind(context, 'M', MDFR_ALT, goto_first_error);
bind(context, 'm', MDFR_ALT, build_in_build_panel);
bind(context, 'z', MDFR_ALT, execute_any_cli);
bind(context, 'Z', MDFR_ALT, execute_previous_cli);
bind(context, 'x', MDFR_ALT, execute_arbitrary_command);
bind(context, 's', MDFR_ALT, show_scrollbar);
bind(context, 'w', MDFR_ALT, hide_scrollbar);
bind(context, 'b', MDFR_ALT, toggle_filebar);
bind(context, '@', MDFR_ALT, toggle_mouse);
bind(context, key_page_up, MDFR_CTRL, toggle_fullscreen);
bind(context, 'E', MDFR_ALT, exit_4coder);
bind(context, key_f1, MDFR_NONE, project_fkey_command);
bind(context, key_f2, MDFR_NONE, project_fkey_command);
bind(context, key_f3, MDFR_NONE, project_fkey_command);
bind(context, key_f4, MDFR_NONE, project_fkey_command);
bind(context, key_f5, MDFR_NONE, project_fkey_command);
bind(context, key_f6, MDFR_NONE, project_fkey_command);
bind(context, key_f7, MDFR_NONE, project_fkey_command);
bind(context, key_f8, MDFR_NONE, project_fkey_command);
bind(context, key_f9, MDFR_NONE, project_fkey_command);
bind(context, key_f10, MDFR_NONE, project_fkey_command);
bind(context, key_f11, MDFR_NONE, project_fkey_command);
bind(context, key_f12, MDFR_NONE, project_fkey_command);
bind(context, key_f13, MDFR_NONE, project_fkey_command);
bind(context, key_f14, MDFR_NONE, project_fkey_command);
bind(context, key_f15, MDFR_NONE, project_fkey_command);
bind(context, key_f16, MDFR_NONE, project_fkey_command);
end_map(context);
// NOTE(allen|a4.0.22): FILE
begin_map(context, mapid_file);
bind_vanilla_keys(context, write_character);
bind(context, key_mouse_left, MDFR_NONE, click_set_cursor);
bind(context, key_mouse_left_release, MDFR_NONE, click_set_mark);
bind(context, key_mouse_right, MDFR_NONE, click_set_mark);
bind(context, key_left, MDFR_NONE, move_left);
bind(context, key_right, MDFR_NONE, move_right);
bind(context, key_del, MDFR_NONE, delete_char);
bind(context, key_del, MDFR_SHIFT, delete_char);
bind(context, key_back, MDFR_NONE, backspace_char);
bind(context, key_back, MDFR_SHIFT, backspace_char);
bind(context, key_up, MDFR_NONE, move_up);
bind(context, key_down, MDFR_NONE, move_down);
bind(context, key_end, MDFR_NONE, seek_end_of_line);
bind(context, key_home, MDFR_NONE, seek_beginning_of_line);
bind(context, key_page_up, MDFR_NONE, page_up);
bind(context, key_page_down, MDFR_NONE, page_down);
bind(context, key_right, MDFR_CTRL, seek_whitespace_right);
bind(context, key_left, MDFR_CTRL, seek_whitespace_left);
bind(context, key_up, MDFR_CTRL, seek_whitespace_up_end_line);
bind(context, key_down, MDFR_CTRL, seek_whitespace_down_end_line);
bind(context, key_up, MDFR_ALT, move_up_10);
bind(context, key_down, MDFR_ALT, move_down_10);
bind(context, key_back, MDFR_CTRL, backspace_word);
bind(context, key_del, MDFR_CTRL, delete_word);
bind(context, key_back, MDFR_ALT, snipe_token_or_word);
bind(context, key_del, MDFR_ALT, snipe_token_or_word_right);
bind(context, ' ', MDFR_CTRL, set_mark);
bind(context, 'a', MDFR_CTRL, replace_in_range);
bind(context, 'c', MDFR_CTRL, copy);
bind(context, 'd', MDFR_CTRL, delete_range);
bind(context, 'e', MDFR_CTRL, center_view);
bind(context, 'E', MDFR_CTRL, left_adjust_view);
bind(context, 'f', MDFR_CTRL, search);
bind(context, 'F', MDFR_CTRL, list_all_locations);
bind(context, 'F', MDFR_ALT , list_all_substring_locations_case_insensitive);
bind(context, 'g', MDFR_CTRL, goto_line);
bind(context, 'j', MDFR_CTRL, to_lowercase);
bind(context, 'K', MDFR_CTRL, kill_buffer);
bind(context, 'l', MDFR_CTRL, toggle_line_wrap);
bind(context, 'm', MDFR_CTRL, cursor_mark_swap);
bind(context, 'O', MDFR_CTRL, reopen);
bind(context, 'q', MDFR_CTRL, query_replace);
bind(context, 'Q', MDFR_CTRL, query_replace_identifier);
bind(context, 'r', MDFR_CTRL, reverse_search);
bind(context, 's', MDFR_CTRL, save);
bind(context, 't', MDFR_CTRL, search_identifier);
bind(context, 'T', MDFR_CTRL, list_all_locations_of_identifier);
bind(context, 'u', MDFR_CTRL, to_uppercase);
bind(context, 'v', MDFR_CTRL, paste_and_indent);
bind(context, 'v', MDFR_ALT , toggle_virtual_whitespace);
bind(context, 'V', MDFR_CTRL, paste_next_and_indent);
bind(context, 'x', MDFR_CTRL, cut);
bind(context, 'y', MDFR_CTRL, redo);
bind(context, 'z', MDFR_CTRL, undo);
bind(context, '2', MDFR_CTRL, decrease_line_wrap);
bind(context, '3', MDFR_CTRL, increase_line_wrap);
bind(context, '?', MDFR_CTRL, toggle_show_whitespace);
bind(context, '~', MDFR_CTRL, clean_all_lines);
bind(context, '\n', MDFR_NONE, newline_or_goto_position);
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
bind(context, ' ', MDFR_SHIFT, write_character);
end_map(context);
// NOTE(allen|a4.0.22): CODE
begin_map(context, default_code_map);
inherit_map(context, mapid_file);
bind(context, key_right, MDFR_CTRL, seek_alphanumeric_or_camel_right);
bind(context, key_left, MDFR_CTRL, seek_alphanumeric_or_camel_left);
bind(context, '\n', MDFR_NONE, write_and_auto_tab);
bind(context, '\n', MDFR_SHIFT, write_and_auto_tab);
bind(context, '}', MDFR_NONE, write_and_auto_tab);
bind(context, ')', MDFR_NONE, write_and_auto_tab);
bind(context, ']', MDFR_NONE, write_and_auto_tab);
bind(context, ';', MDFR_NONE, write_and_auto_tab);
bind(context, '#', MDFR_NONE, write_and_auto_tab);
bind(context, '\t', MDFR_NONE, word_complete);
bind(context, '\t', MDFR_CTRL, auto_tab_range);
bind(context, '\t', MDFR_SHIFT, auto_tab_line_at_cursor);
bind(context, 'h', MDFR_ALT, write_hack);
bind(context, 'r', MDFR_ALT, write_block);
bind(context, 't', MDFR_ALT, write_todo);
bind(context, 'y', MDFR_ALT, write_note);
bind(context, '[', MDFR_CTRL, open_long_braces);
bind(context, '{', MDFR_CTRL, open_long_braces_semicolon);
bind(context, '}', MDFR_CTRL, open_long_braces_break);
bind(context, 'i', MDFR_ALT, if0_off);
bind(context, '1', MDFR_ALT, open_file_in_quotes);
bind(context, '2', MDFR_ALT, open_matching_file_cpp);
bind(context, '0', MDFR_CTRL, write_zero_struct);
bind(context, 'I', MDFR_CTRL, list_all_functions_current_buffer);
end_map(context);
} }
void void
mac_default_keys(Bind_Helper *context){ mac_default_keys(Bind_Helper *context){
// NOTE(allen|a4.0.22): GLOBAL
begin_map(context, mapid_global);
bind(context, 'p', MDFR_CMND, open_panel_vsplit);
bind(context, '_', MDFR_CMND, open_panel_hsplit);
bind(context, 'P', MDFR_CMND, close_panel);
bind(context, ',', MDFR_CMND, change_active_panel);
bind(context, '<', MDFR_CMND, change_active_panel_backwards);
bind(context, 'n', MDFR_CMND, interactive_new);
bind(context, 'o', MDFR_CMND, interactive_open_or_new);
bind(context, 'o', MDFR_CTRL, open_in_other);
bind(context, 'k', MDFR_CMND, interactive_kill_buffer);
bind(context, 'i', MDFR_CMND, interactive_switch_buffer);
bind(context, 'h', MDFR_CMND, project_go_to_root_directory);
bind(context, 'S', MDFR_CMND, save_all_dirty_buffers);
bind(context, 'c', MDFR_CTRL, open_color_tweaker);
bind(context, 'd', MDFR_CTRL, open_debug);
bind(context, '.', MDFR_CTRL, change_to_build_panel);
bind(context, ',', MDFR_CTRL, close_build_panel);
bind(context, 'n', MDFR_CTRL, goto_next_error);
bind(context, 'N', MDFR_CTRL, goto_prev_error);
bind(context, 'M', MDFR_CTRL, goto_first_error);
bind(context, 'm', MDFR_CTRL, build_in_build_panel);
bind(context, 'z', MDFR_CTRL, execute_any_cli);
bind(context, 'Z', MDFR_CTRL, execute_previous_cli);
bind(context, 'x', MDFR_CTRL, execute_arbitrary_command);
bind(context, 's', MDFR_CTRL, show_scrollbar);
bind(context, 'w', MDFR_CTRL, hide_scrollbar);
bind(context, 'b', MDFR_CTRL, toggle_filebar);
bind(context, '@', MDFR_CTRL, toggle_mouse);
bind(context, key_page_up, MDFR_CMND, toggle_fullscreen);
bind(context, 'E', MDFR_CTRL, exit_4coder);
bind(context, key_f1, MDFR_NONE, project_fkey_command);
bind(context, key_f2, MDFR_NONE, project_fkey_command);
bind(context, key_f3, MDFR_NONE, project_fkey_command);
bind(context, key_f4, MDFR_NONE, project_fkey_command);
bind(context, key_f5, MDFR_NONE, project_fkey_command);
bind(context, key_f6, MDFR_NONE, project_fkey_command);
bind(context, key_f7, MDFR_NONE, project_fkey_command);
bind(context, key_f8, MDFR_NONE, project_fkey_command);
bind(context, key_f9, MDFR_NONE, project_fkey_command);
bind(context, key_f10, MDFR_NONE, project_fkey_command);
bind(context, key_f11, MDFR_NONE, project_fkey_command);
bind(context, key_f12, MDFR_NONE, project_fkey_command);
bind(context, key_f13, MDFR_NONE, project_fkey_command);
bind(context, key_f14, MDFR_NONE, project_fkey_command);
bind(context, key_f15, MDFR_NONE, project_fkey_command);
bind(context, key_f16, MDFR_NONE, project_fkey_command);
end_map(context);
// NOTE(allen|a4.0.22): FILE
begin_map(context, mapid_file);
bind_vanilla_keys(context, write_character);
bind_vanilla_keys(context, MDFR_ALT, write_character);
bind(context, key_mouse_left, MDFR_NONE, click_set_cursor);
bind(context, key_mouse_left_release, MDFR_NONE, click_set_mark);
bind(context, key_mouse_right, MDFR_NONE, click_set_mark);
bind(context, key_left, MDFR_NONE, move_left);
bind(context, key_right, MDFR_NONE, move_right);
bind(context, key_del, MDFR_NONE, delete_char);
bind(context, key_del, MDFR_SHIFT, delete_char);
bind(context, key_back, MDFR_NONE, backspace_char);
bind(context, key_back, MDFR_SHIFT, backspace_char);
bind(context, key_up, MDFR_NONE, move_up);
bind(context, key_down, MDFR_NONE, move_down);
bind(context, key_end, MDFR_NONE, seek_end_of_line);
bind(context, key_home, MDFR_NONE, seek_beginning_of_line);
bind(context, key_page_up, MDFR_NONE, page_up);
bind(context, key_page_down, MDFR_NONE, page_down);
bind(context, key_right, MDFR_CMND, seek_whitespace_right);
bind(context, key_left, MDFR_CMND, seek_whitespace_left);
bind(context, key_up, MDFR_CMND, seek_whitespace_up_end_line);
bind(context, key_down, MDFR_CMND, seek_whitespace_down_end_line);
bind(context, key_back, MDFR_CMND, backspace_word);
bind(context, key_del, MDFR_CMND, delete_word);
bind(context, key_back, MDFR_CTRL, snipe_token_or_word);
bind(context, key_del, MDFR_CTRL, snipe_token_or_word_right);
bind(context, '/', MDFR_CMND, set_mark);
bind(context, 'a', MDFR_CMND, replace_in_range);
bind(context, 'c', MDFR_CMND, copy);
bind(context, 'd', MDFR_CMND, delete_range);
bind(context, 'e', MDFR_CMND, center_view);
bind(context, 'E', MDFR_CMND, left_adjust_view);
bind(context, 'f', MDFR_CMND, search);
bind(context, 'F', MDFR_CMND, list_all_locations);
bind(context, 'F', MDFR_CTRL, list_all_substring_locations_case_insensitive);
bind(context, 'g', MDFR_CMND, goto_line);
bind(context, 'j', MDFR_CMND, to_lowercase);
bind(context, 'K', MDFR_CMND, kill_buffer);
bind(context, 'l', MDFR_CMND, toggle_line_wrap);
bind(context, 'm', MDFR_CMND, cursor_mark_swap);
bind(context, 'O', MDFR_CMND, reopen);
bind(context, 'q', MDFR_CMND, query_replace);
bind(context, 'Q', MDFR_CMND, query_replace_identifier);
bind(context, 'r', MDFR_CMND, reverse_search);
bind(context, 's', MDFR_CMND, save);
bind(context, 't', MDFR_CMND, search_identifier);
bind(context, 'T', MDFR_CMND, list_all_locations_of_identifier);
bind(context, 'u', MDFR_CMND, to_uppercase);
bind(context, 'v', MDFR_CMND, paste_and_indent);
bind(context, 'v', MDFR_CTRL, toggle_virtual_whitespace);
bind(context, 'V', MDFR_CMND, paste_next_and_indent);
bind(context, 'x', MDFR_CMND, cut);
bind(context, 'y', MDFR_CMND, redo);
bind(context, 'z', MDFR_CMND, undo);
bind(context, '2', MDFR_CMND, decrease_line_wrap);
bind(context, '3', MDFR_CMND, increase_line_wrap);
bind(context, '?', MDFR_CMND, toggle_show_whitespace);
bind(context, '~', MDFR_CMND, clean_all_lines);
bind(context, '\n', MDFR_NONE, newline_or_goto_position);
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
bind(context, ' ', MDFR_SHIFT, write_character);
end_map(context);
// NOTE(allen|a4.0.22): CODE
begin_map(context, default_code_map);
inherit_map(context, mapid_file);
bind(context, key_right, MDFR_CMND, seek_alphanumeric_or_camel_right);
bind(context, key_left, MDFR_CMND, seek_alphanumeric_or_camel_left);
bind(context, '\n', MDFR_NONE, write_and_auto_tab);
bind(context, '\n', MDFR_SHIFT, write_and_auto_tab);
bind(context, '}', MDFR_NONE, write_and_auto_tab);
bind(context, ')', MDFR_NONE, write_and_auto_tab);
bind(context, ']', MDFR_NONE, write_and_auto_tab);
bind(context, ';', MDFR_NONE, write_and_auto_tab);
bind(context, '#', MDFR_NONE, write_and_auto_tab);
bind(context, '\t', MDFR_NONE, word_complete);
bind(context, '\t', MDFR_CMND, auto_tab_range);
bind(context, '\t', MDFR_SHIFT, auto_tab_line_at_cursor);
bind(context, 'h', MDFR_CTRL, write_hack);
bind(context, 'r', MDFR_CTRL, write_block);
bind(context, 't', MDFR_CTRL, write_todo);
bind(context, 'y', MDFR_CTRL, write_note);
bind(context, '[', MDFR_CMND, open_long_braces);
bind(context, '{', MDFR_CMND, open_long_braces_semicolon);
bind(context, '}', MDFR_CMND, open_long_braces_break);
bind(context, 'i', MDFR_CTRL, if0_off);
bind(context, '1', MDFR_CTRL, open_file_in_quotes);
bind(context, '2', MDFR_CTRL, open_matching_file_cpp);
bind(context, '0', MDFR_CMND, write_zero_struct);
bind(context, 'I', MDFR_CMND, list_all_functions_current_buffer);
end_map(context);
} }

View File

@ -394,12 +394,7 @@ Clipboard_Post(Application_Links *app, int32_t clipboard_id, char *str, int32_t
DOC_PARAM(clipboard_id, This parameter is set up to prepare for future features, it should always be 0 for now.) DOC_PARAM(clipboard_id, This parameter is set up to prepare for future features, it should always be 0 for now.)
DOC_PARAM(str, The str parameter specifies the string to be posted to the clipboard, it need not be null terminated.) DOC_PARAM(str, The str parameter specifies the string to be posted to the clipboard, it need not be null terminated.)
DOC_PARAM(len, The len parameter specifies the length of the str string.) DOC_PARAM(len, The len parameter specifies the length of the str string.)
DOC DOC(Stores the string str in the clipboard initially with index 0. Also reports the copy to the operating system, so that it may be pasted into other applications.)
(
Stores the string str in the clipboard initially with index 0.
Also reports the copy to the operating system, so that it may
be pasted into other applications.
)
DOC_SEE(The_4coder_Clipboard) DOC_SEE(The_4coder_Clipboard)
*/{ */{
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;

View File

@ -42,6 +42,7 @@
#include "4cpp/4cpp_lexer.h" #include "4cpp/4cpp_lexer.h"
#include "4ed_linked_node_macros.h" #include "4ed_linked_node_macros.h"
#include "4ed_log.h"
#include "4ed_font.cpp" #include "4ed_font.cpp"

View File

@ -60,7 +60,7 @@ debug_gm_free(Debug_GM *general, void *memory){
static void* static void*
debug_gm_reallocate(Debug_GM *general, void *old, int32_t old_size, int32_t size){ debug_gm_reallocate(Debug_GM *general, void *old, int32_t old_size, int32_t size){
void *result = debug_gm_allocate(general, size); void *result = debug_gm_allocate(general, size);
memcpy(result, old, old_size); memcpy(result, old, Min(old_size, size));
debug_gm_free(general, old); debug_gm_free(general, old);
return(result); return(result);
} }

View File

@ -3463,15 +3463,6 @@ working_set_clipboard_roll_down(Working_Set *working){
return(result); return(result);
} }
internal void
clipboard_copy(System_Functions *system, General_Memory *general, Working_Set *working, Range range, Editing_File *file){
i32 size = range.end - range.start;
String *dest = working_set_next_clipboard_string(general, working, size);
buffer_stringify(&file->state.buffer, range.start, range.end, dest->str);
dest->size = size;
system->post_clipboard(*dest);
}
internal Edit_Spec internal Edit_Spec
file_compute_edit(Mem_Options *mem, Editing_File *file, Buffer_Edit *edits, char *str_base, i32 str_size, Buffer_Edit *inverse_array, char *inv_str, i32 inv_max, i32 edit_count, i32 batch_type){ file_compute_edit(Mem_Options *mem, Editing_File *file, Buffer_Edit *edits, char *str_base, i32 str_size, Buffer_Edit *inverse_array, char *inv_str, i32 inv_max, i32 edit_count, i32 batch_type){
General_Memory *general = &mem->general; General_Memory *general = &mem->general;

View File

@ -448,9 +448,9 @@ Sys_Font_Load_Page_Sig(system_font_load_page, settings, metrics, page, page_numb
internal internal
Sys_Font_Allocate_Sig(system_font_allocate, size){ Sys_Font_Allocate_Sig(system_font_allocate, size){
i64 *size_ptr = 0; umem *size_ptr = 0;
void *result = system_memory_allocate(size + sizeof(*size_ptr)); void *result = system_memory_allocate(size + sizeof(*size_ptr));
size_ptr = (i64*)result; size_ptr = (umem*)result;
*size_ptr = size + 4; *size_ptr = size + 4;
return(size_ptr + 1); return(size_ptr + 1);
} }
@ -458,7 +458,7 @@ Sys_Font_Allocate_Sig(system_font_allocate, size){
internal internal
Sys_Font_Free_Sig(system_font_free, ptr){ Sys_Font_Free_Sig(system_font_free, ptr){
if (ptr != 0){ if (ptr != 0){
i64 *size_ptr = ((i64*)ptr) - 1; umem *size_ptr = ((umem*)ptr) - 1;
system_memory_free(size_ptr, *size_ptr); system_memory_free(size_ptr, *size_ptr);
} }
} }

View File

@ -76,6 +76,9 @@ internal void fm_slash_fix(char *path);
internal char *fm_prepare_string_internal(char *s1, ...); internal char *fm_prepare_string_internal(char *s1, ...);
#define fm_str(...) fm_prepare_string_internal(__VA_ARGS__, (void*)0) #define fm_str(...) fm_prepare_string_internal(__VA_ARGS__, (void*)0)
internal char *fm_basic_string_internal(char *s1, ...);
#define fm_basic_str(...) fm_basic_string_internal(__VA_ARGS__, (void*)0)
internal char **fm_prepare_list_internal(char **l1, ...); internal char **fm_prepare_list_internal(char **l1, ...);
#define fm_list(...) fm_prepare_list_internal(__VA_ARGS__, (void*)0) #define fm_list(...) fm_prepare_list_internal(__VA_ARGS__, (void*)0)
@ -619,6 +622,16 @@ fm__prepare(umem item_size, void *i1, va_list list){
return(result); return(result);
} }
internal char*
fm_basic_string_internal(char *s1, ...){
umem item_size = sizeof(*s1);
va_list list;
va_start(list, s1);
char *result = (char*)fm__prepare(item_size, s1, list);
va_end(list);
return(result);
}
internal char* internal char*
fm_prepare_string_internal(char *s1, ...){ fm_prepare_string_internal(char *s1, ...){
umem item_size = sizeof(*s1); umem item_size = sizeof(*s1);

View File

@ -9,10 +9,12 @@
// TOP // TOP
#define KEYCODES_FILE "4coder_API/keycodes.h" #define KEYCODES_FILE "4coder_generated/keycodes.h"
#define STYLE_FILE "4coder_API/style.h" #define STYLE_FILE "4coder_generated/style.h"
#define API_H "4coder_generated/app_functions.h"
#define REMAPPING_FILE "4coder_generated/remapping.h"
#define API_H "4coder_API/app_functions.h"
#define OS_API_H "4ed_os_custom_api.h" #define OS_API_H "4ed_os_custom_api.h"
#include "../4ed_defines.h" #include "../4ed_defines.h"
@ -23,6 +25,7 @@
#include "../4coder_lib/4coder_string.h" #include "../4coder_lib/4coder_string.h"
#include "../4cpp/4cpp_lexer.h" #include "../4cpp/4cpp_lexer.h"
#include "../4ed_linked_node_macros.h"
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@ -34,42 +37,45 @@
#include "4ed_meta_keywords.h" #include "4ed_meta_keywords.h"
////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////
char *keys_that_need_codes[] = { #define KEY_LIST(M)\
"back", M(back) \
"up", M(up) \
"down", M(down) \
"left", M(left) \
"right", M(right) \
"del", M(del) \
"insert", M(insert) \
"home", M(home) \
"end", M(end) \
"page_up", M(page_up) \
"page_down", M(page_down) \
"esc", M(esc) \
M(mouse_left) \
"mouse_left", M(mouse_right) \
"mouse_right", M(mouse_left_release) \
"mouse_left_release", M(mouse_right_release) \
"mouse_right_release", M(f1) \
M(f2) \
"f1", M(f3) \
"f2", M(f4) \
"f3", M(f5) \
"f4", M(f6) \
"f5", M(f7) \
"f6", M(f8) \
"f7", M(f9) \
"f8", M(f10) \
M(f11) \
"f9", M(f12) \
"f10", M(f13) \
"f11", M(f14) \
"f12", M(f15) \
"f13", M(f16)
"f14",
"f15", enum{
"f16", key_enum_kicker_offer = 0xD800 - 1,
#define DefKeyEnum(n) key_##n,
KEY_LIST(DefKeyEnum)
#undef DefKeyEnum
}; };
internal void internal void
@ -78,19 +84,12 @@ generate_keycode_enum(){
char *filename_keycodes = KEYCODES_FILE; char *filename_keycodes = KEYCODES_FILE;
u16 code = 0xD800;
String out = str_alloc(10 << 20); String out = str_alloc(10 << 20);
i32 count = ArrayCount(keys_that_need_codes);
append(&out, "enum{\n"); append(&out, "enum{\n");
for (i32 i = 0; i < count;){ #define DefKeyEnum(n) append(&out, "key_" #n " = "); append_int_to_str(&out, key_##n); append(&out, ",\n");
append(&out, "key_"); KEY_LIST(DefKeyEnum)
append(&out, keys_that_need_codes[i++]); #undef DefKeyEnum
append(&out, " = ");
append_int_to_str(&out, code++);
append(&out, ",\n");
}
append(&out, "};\n"); append(&out, "};\n");
append(&out, append(&out,
@ -99,15 +98,9 @@ generate_keycode_enum(){
"char *result = 0;\n" "char *result = 0;\n"
"switch(key_code){\n"); "switch(key_code){\n");
for (i32 i = 0; i < count; ++i){ #define KeyCase(n) append(&out, "case key_" #n ": result = \"key_" #n "\"; *size = sizeof(\"key_" #n "\")-1; break;\n");
append(&out, "case key_"); KEY_LIST(KeyCase)
append(&out, keys_that_need_codes[i]); #undef KeyCase
append(&out, ": result = \"");
append(&out, keys_that_need_codes[i]);
append(&out, "\"; *size = sizeof(\"");
append(&out, keys_that_need_codes[i]);
append(&out, "\")-1; break;\n");
}
append(&out, append(&out,
"}\n" "}\n"
@ -503,6 +496,769 @@ generate_custom_headers(){
fm_end_temp(temp); fm_end_temp(temp);
} }
//////////////////////////////////////////////////////////////////////////////////////////////////
struct Key_Bind{
Key_Bind *next;
b32 vanilla;
u32 keycode;
u32 modifiers;
char *command;
i32 command_len;
};
struct Sub_Map{
Sub_Map *next;
char *name;
i32 name_len;
char *description;
i32 description_len;
char *parent;
i32 parent_len;
b32 has_vanilla;
Key_Bind *first_key_bind;
Key_Bind *last_key_bind;
i32 key_bind_count;
};
struct Mapping{
Mapping *next;
char *name;
i32 name_len;
char *description;
i32 description_len;
Sub_Map *first_sub_map;
Sub_Map *last_sub_map;
i32 sub_map_count;
};
struct Mapping_Array{
Mapping *first_mapping;
Mapping *last_mapping;
i32 mapping_count;
Mapping *current_mapping;
Sub_Map *current_sub_map;
};
enum{
MDFR_NONE = 0x0,
MDFR_CTRL = 0x1,
MDFR_ALT = 0x2,
MDFR_CMND = 0x4,
MDFR_SHIFT = 0x8,
};
//////////////////////////////////////////////////////////////////////////////////////////////////
internal void
emit_begin_mapping(Mapping_Array *array, char *name, char *description){
Assert(array->current_mapping == 0);
Mapping *mapping = fm_push_array(Mapping, 1);
mapping->name = fm_basic_str(name);
mapping->name_len = str_size(name);
mapping->description = fm_basic_str(description);
mapping->description_len = str_size(description);
mapping->first_sub_map = 0;
mapping->last_sub_map = 0;
mapping->sub_map_count = 0;
sll_push(array->first_mapping, array->last_mapping, mapping);
++array->mapping_count;
array->current_mapping = mapping;
}
internal void
emit_end_mapping(Mapping_Array *array){
Assert(array->current_mapping != 0);
array->current_mapping = 0;
}
internal void
emit_begin_map(Mapping_Array *array, char *mapid, char *description){
Assert(array->current_mapping != 0);
Assert(array->current_sub_map == 0);
Sub_Map *sub_map = fm_push_array(Sub_Map, 1);
sub_map->name = fm_basic_str(mapid);
sub_map->name_len = str_size(mapid);
sub_map->description = fm_basic_str(description);
sub_map->description_len = str_size(description);
sub_map->parent = 0;
sub_map->parent_len = 0;
sub_map->first_key_bind = 0;
sub_map->last_key_bind = 0;
sub_map->key_bind_count = 0;
Mapping *mapping = array->current_mapping;
sll_push(mapping->first_sub_map, mapping->last_sub_map, sub_map);
++mapping->sub_map_count;
array->current_sub_map = sub_map;
}
internal void
emit_end_map(Mapping_Array *array){
Assert(array->current_mapping != 0);
Assert(array->current_sub_map != 0);
array->current_sub_map = 0;
}
internal void
emit_inherit_map(Mapping_Array *array, char *mapid){
Assert(array->current_mapping != 0);
Assert(array->current_sub_map != 0);
Sub_Map *sub_map = array->current_sub_map;
Assert(sub_map->parent == 0);
sub_map->parent = fm_basic_str(mapid);
sub_map->parent_len = str_size(mapid);
}
internal void
emit_bind(Mapping_Array *array, u32 keycode, u32 modifiers, char *command){
Assert(array->current_mapping != 0);
Assert(array->current_sub_map != 0);
b32 is_duplicate = false;
Sub_Map *sub_map = array->current_sub_map;
for (Key_Bind *bind = sub_map->first_key_bind;
bind != 0;
bind = bind->next){
if (!bind->vanilla && keycode == bind->keycode && modifiers == bind->modifiers){
fprintf(stdout, "duplicate binding for %u %u\n", keycode, modifiers);
is_duplicate = true;
break;
}
}
if (!is_duplicate){
Key_Bind *bind = fm_push_array(Key_Bind, 1);
bind->vanilla = false;
bind->keycode = keycode;
bind->modifiers = modifiers;
bind->command = fm_basic_str(command);
bind->command_len = str_size(command);
sll_push(sub_map->first_key_bind, sub_map->last_key_bind, bind);
++sub_map->key_bind_count;
}
}
internal void
emit_bind_vanilla_keys(Mapping_Array *array, u32 modifiers, char *command){
Assert(array->current_mapping != 0);
Assert(array->current_sub_map != 0);
b32 is_duplicate = false;
Sub_Map *sub_map = array->current_sub_map;
for (Key_Bind *bind = sub_map->first_key_bind;
bind != 0;
bind = bind->next){
if (bind->vanilla && modifiers == bind->modifiers){
fprintf(stdout, "duplicate vanilla binding %u\n", modifiers);
is_duplicate = true;
break;
}
}
if (!is_duplicate){
Key_Bind *bind = fm_push_array(Key_Bind, 1);
bind->vanilla = true;
bind->keycode = 0;
bind->modifiers = modifiers;
bind->command = fm_basic_str(command);
bind->command_len = str_size(command);
sll_push(sub_map->first_key_bind, sub_map->last_key_bind, bind);
++sub_map->key_bind_count;
}
}
#define begin_mapping(mp,n,d) emit_begin_mapping(mp, #n, d)
#define end_mapping(mp) emit_end_mapping(mp)
#define begin_map(mp,mapid,d) emit_begin_map(mp, #mapid, d)
#define end_map(mp) emit_end_map(mp)
#define inherit_map(mp,mapid) emit_inherit_map(mp, #mapid)
#define bind(mp,k,md,c) emit_bind(mp, k, md, #c)
#define bind_vanilla_keys(mp,md,c) emit_bind_vanilla_keys(mp, md, #c)
//////////////////////////////////////////////////////////////////////////////////////////////////
internal void
generate_remapping_code_and_data(){
Temp temp = fm_begin_temp();
// Generate mapping array data structure
Mapping_Array mappings_ = {0};
Mapping_Array *mappings = &mappings_;
begin_mapping(mappings, default, "TODO");
{
// NOTE(allen): GLOBAL
begin_map(mappings, mapid_global, "TODO");
bind(mappings, 'p', MDFR_CTRL, open_panel_vsplit);
bind(mappings, '_', MDFR_CTRL, open_panel_hsplit);
bind(mappings, 'P', MDFR_CTRL, close_panel);
bind(mappings, ',', MDFR_CTRL, change_active_panel);
bind(mappings, '<', MDFR_CTRL, change_active_panel_backwards);
bind(mappings, 'n', MDFR_CTRL, interactive_new);
bind(mappings, 'o', MDFR_CTRL, interactive_open_or_new);
bind(mappings, 'o', MDFR_ALT, open_in_other);
bind(mappings, 'k', MDFR_CTRL, interactive_kill_buffer);
bind(mappings, 'i', MDFR_CTRL, interactive_switch_buffer);
bind(mappings, 'h', MDFR_CTRL, project_go_to_root_directory);
bind(mappings, 'S', MDFR_CTRL, save_all_dirty_buffers);
bind(mappings, 'c', MDFR_ALT, open_color_tweaker);
bind(mappings, 'd', MDFR_ALT, open_debug);
bind(mappings, '.', MDFR_ALT, change_to_build_panel);
bind(mappings, ',', MDFR_ALT, close_build_panel);
bind(mappings, 'n', MDFR_ALT, goto_next_error);
bind(mappings, 'N', MDFR_ALT, goto_prev_error);
bind(mappings, 'M', MDFR_ALT, goto_first_error);
bind(mappings, 'm', MDFR_ALT, build_in_build_panel);
bind(mappings, 'z', MDFR_ALT, execute_any_cli);
bind(mappings, 'Z', MDFR_ALT, execute_previous_cli);
bind(mappings, 'x', MDFR_ALT, execute_arbitrary_command);
bind(mappings, 's', MDFR_ALT, show_scrollbar);
bind(mappings, 'w', MDFR_ALT, hide_scrollbar);
bind(mappings, 'b', MDFR_ALT, toggle_filebar);
bind(mappings, '@', MDFR_ALT, toggle_mouse);
bind(mappings, key_page_up, MDFR_CTRL, toggle_fullscreen);
bind(mappings, 'E', MDFR_ALT, exit_4coder);
bind(mappings, key_f1, MDFR_NONE, project_fkey_command);
bind(mappings, key_f2, MDFR_NONE, project_fkey_command);
bind(mappings, key_f3, MDFR_NONE, project_fkey_command);
bind(mappings, key_f4, MDFR_NONE, project_fkey_command);
bind(mappings, key_f5, MDFR_NONE, project_fkey_command);
bind(mappings, key_f6, MDFR_NONE, project_fkey_command);
bind(mappings, key_f7, MDFR_NONE, project_fkey_command);
bind(mappings, key_f8, MDFR_NONE, project_fkey_command);
bind(mappings, key_f9, MDFR_NONE, project_fkey_command);
bind(mappings, key_f10, MDFR_NONE, project_fkey_command);
bind(mappings, key_f11, MDFR_NONE, project_fkey_command);
bind(mappings, key_f12, MDFR_NONE, project_fkey_command);
bind(mappings, key_f13, MDFR_NONE, project_fkey_command);
bind(mappings, key_f14, MDFR_NONE, project_fkey_command);
bind(mappings, key_f15, MDFR_NONE, project_fkey_command);
bind(mappings, key_f16, MDFR_NONE, project_fkey_command);
end_map(mappings);
// NOTE(allen): FILE
begin_map(mappings, mapid_file, "TODO");
bind_vanilla_keys(mappings, MDFR_NONE, write_character);
bind(mappings, key_mouse_left, MDFR_NONE, click_set_cursor);
bind(mappings, key_mouse_left_release, MDFR_NONE, click_set_mark);
bind(mappings, key_mouse_right, MDFR_NONE, click_set_mark);
bind(mappings, key_left, MDFR_NONE, move_left);
bind(mappings, key_right, MDFR_NONE, move_right);
bind(mappings, key_del, MDFR_NONE, delete_char);
bind(mappings, key_del, MDFR_SHIFT, delete_char);
bind(mappings, key_back, MDFR_NONE, backspace_char);
bind(mappings, key_back, MDFR_SHIFT, backspace_char);
bind(mappings, key_up, MDFR_NONE, move_up);
bind(mappings, key_down, MDFR_NONE, move_down);
bind(mappings, key_end, MDFR_NONE, seek_end_of_line);
bind(mappings, key_home, MDFR_NONE, seek_beginning_of_line);
bind(mappings, key_page_up, MDFR_NONE, page_up);
bind(mappings, key_page_down, MDFR_NONE, page_down);
bind(mappings, key_right, MDFR_CTRL, seek_whitespace_right);
bind(mappings, key_left, MDFR_CTRL, seek_whitespace_left);
bind(mappings, key_up, MDFR_CTRL, seek_whitespace_up_end_line);
bind(mappings, key_down, MDFR_CTRL, seek_whitespace_down_end_line);
bind(mappings, key_up, MDFR_ALT, move_up_10);
bind(mappings, key_down, MDFR_ALT, move_down_10);
bind(mappings, key_back, MDFR_CTRL, backspace_word);
bind(mappings, key_del, MDFR_CTRL, delete_word);
bind(mappings, key_back, MDFR_ALT, snipe_token_or_word);
bind(mappings, key_del, MDFR_ALT, snipe_token_or_word_right);
bind(mappings, ' ', MDFR_CTRL, set_mark);
bind(mappings, 'a', MDFR_CTRL, replace_in_range);
bind(mappings, 'c', MDFR_CTRL, copy);
bind(mappings, 'd', MDFR_CTRL, delete_range);
bind(mappings, 'e', MDFR_CTRL, center_view);
bind(mappings, 'E', MDFR_CTRL, left_adjust_view);
bind(mappings, 'f', MDFR_CTRL, search);
bind(mappings, 'F', MDFR_CTRL, list_all_locations);
bind(mappings, 'F', MDFR_ALT , list_all_substring_locations_case_insensitive);
bind(mappings, 'g', MDFR_CTRL, goto_line);
bind(mappings, 'j', MDFR_CTRL, to_lowercase);
bind(mappings, 'K', MDFR_CTRL, kill_buffer);
bind(mappings, 'l', MDFR_CTRL, toggle_line_wrap);
bind(mappings, 'm', MDFR_CTRL, cursor_mark_swap);
bind(mappings, 'O', MDFR_CTRL, reopen);
bind(mappings, 'q', MDFR_CTRL, query_replace);
bind(mappings, 'Q', MDFR_CTRL, query_replace_identifier);
bind(mappings, 'r', MDFR_CTRL, reverse_search);
bind(mappings, 's', MDFR_CTRL, save);
bind(mappings, 't', MDFR_CTRL, search_identifier);
bind(mappings, 'T', MDFR_CTRL, list_all_locations_of_identifier);
bind(mappings, 'u', MDFR_CTRL, to_uppercase);
bind(mappings, 'v', MDFR_CTRL, paste_and_indent);
bind(mappings, 'v', MDFR_ALT , toggle_virtual_whitespace);
bind(mappings, 'V', MDFR_CTRL, paste_next_and_indent);
bind(mappings, 'x', MDFR_CTRL, cut);
bind(mappings, 'y', MDFR_CTRL, redo);
bind(mappings, 'z', MDFR_CTRL, undo);
bind(mappings, '2', MDFR_CTRL, decrease_line_wrap);
bind(mappings, '3', MDFR_CTRL, increase_line_wrap);
bind(mappings, '?', MDFR_CTRL, toggle_show_whitespace);
bind(mappings, '~', MDFR_CTRL, clean_all_lines);
bind(mappings, '\n', MDFR_NONE, newline_or_goto_position);
bind(mappings, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
bind(mappings, ' ', MDFR_SHIFT, write_character);
end_map(mappings);
// NOTE(allen): CODE
begin_map(mappings, default_code_map, "TODO");
inherit_map(mappings, mapid_file);
bind(mappings, key_right, MDFR_CTRL, seek_alphanumeric_or_camel_right);
bind(mappings, key_left, MDFR_CTRL, seek_alphanumeric_or_camel_left);
bind(mappings, '\n', MDFR_NONE, write_and_auto_tab);
bind(mappings, '\n', MDFR_SHIFT, write_and_auto_tab);
bind(mappings, '}', MDFR_NONE, write_and_auto_tab);
bind(mappings, ')', MDFR_NONE, write_and_auto_tab);
bind(mappings, ']', MDFR_NONE, write_and_auto_tab);
bind(mappings, ';', MDFR_NONE, write_and_auto_tab);
bind(mappings, '#', MDFR_NONE, write_and_auto_tab);
bind(mappings, '\t', MDFR_NONE, word_complete);
bind(mappings, '\t', MDFR_CTRL, auto_tab_range);
bind(mappings, '\t', MDFR_SHIFT, auto_tab_line_at_cursor);
bind(mappings, 'h', MDFR_ALT, write_hack);
bind(mappings, 'r', MDFR_ALT, write_block);
bind(mappings, 't', MDFR_ALT, write_todo);
bind(mappings, 'y', MDFR_ALT, write_note);
bind(mappings, '[', MDFR_CTRL, open_long_braces);
bind(mappings, '{', MDFR_CTRL, open_long_braces_semicolon);
bind(mappings, '}', MDFR_CTRL, open_long_braces_break);
bind(mappings, 'i', MDFR_ALT, if0_off);
bind(mappings, '1', MDFR_ALT, open_file_in_quotes);
bind(mappings, '2', MDFR_ALT, open_matching_file_cpp);
bind(mappings, '0', MDFR_CTRL, write_zero_struct);
bind(mappings, 'I', MDFR_CTRL, list_all_functions_current_buffer);
end_map(mappings);
}
end_mapping(mappings);
begin_mapping(mappings, mac_default, "TODO");
{
// NOTE(allen): GLOBAL
begin_map(mappings, mapid_global, "TODO");
bind(mappings, 'p', MDFR_CMND, open_panel_vsplit);
bind(mappings, '_', MDFR_CMND, open_panel_hsplit);
bind(mappings, 'P', MDFR_CMND, close_panel);
bind(mappings, ',', MDFR_CMND, change_active_panel);
bind(mappings, '<', MDFR_CMND, change_active_panel_backwards);
bind(mappings, 'n', MDFR_CMND, interactive_new);
bind(mappings, 'o', MDFR_CMND, interactive_open_or_new);
bind(mappings, 'o', MDFR_CTRL, open_in_other);
bind(mappings, 'k', MDFR_CMND, interactive_kill_buffer);
bind(mappings, 'i', MDFR_CMND, interactive_switch_buffer);
bind(mappings, 'h', MDFR_CMND, project_go_to_root_directory);
bind(mappings, 'S', MDFR_CMND, save_all_dirty_buffers);
bind(mappings, 'c', MDFR_CTRL, open_color_tweaker);
bind(mappings, 'd', MDFR_CTRL, open_debug);
bind(mappings, '.', MDFR_CTRL, change_to_build_panel);
bind(mappings, ',', MDFR_CTRL, close_build_panel);
bind(mappings, 'n', MDFR_CTRL, goto_next_error);
bind(mappings, 'N', MDFR_CTRL, goto_prev_error);
bind(mappings, 'M', MDFR_CTRL, goto_first_error);
bind(mappings, 'm', MDFR_CTRL, build_in_build_panel);
bind(mappings, 'z', MDFR_CTRL, execute_any_cli);
bind(mappings, 'Z', MDFR_CTRL, execute_previous_cli);
bind(mappings, 'x', MDFR_CTRL, execute_arbitrary_command);
bind(mappings, 's', MDFR_CTRL, show_scrollbar);
bind(mappings, 'w', MDFR_CTRL, hide_scrollbar);
bind(mappings, 'b', MDFR_CTRL, toggle_filebar);
bind(mappings, '@', MDFR_CTRL, toggle_mouse);
bind(mappings, key_page_up, MDFR_CMND, toggle_fullscreen);
bind(mappings, 'E', MDFR_CTRL, exit_4coder);
bind(mappings, key_f1, MDFR_NONE, project_fkey_command);
bind(mappings, key_f2, MDFR_NONE, project_fkey_command);
bind(mappings, key_f3, MDFR_NONE, project_fkey_command);
bind(mappings, key_f4, MDFR_NONE, project_fkey_command);
bind(mappings, key_f5, MDFR_NONE, project_fkey_command);
bind(mappings, key_f6, MDFR_NONE, project_fkey_command);
bind(mappings, key_f7, MDFR_NONE, project_fkey_command);
bind(mappings, key_f8, MDFR_NONE, project_fkey_command);
bind(mappings, key_f9, MDFR_NONE, project_fkey_command);
bind(mappings, key_f10, MDFR_NONE, project_fkey_command);
bind(mappings, key_f11, MDFR_NONE, project_fkey_command);
bind(mappings, key_f12, MDFR_NONE, project_fkey_command);
bind(mappings, key_f13, MDFR_NONE, project_fkey_command);
bind(mappings, key_f14, MDFR_NONE, project_fkey_command);
bind(mappings, key_f15, MDFR_NONE, project_fkey_command);
bind(mappings, key_f16, MDFR_NONE, project_fkey_command);
end_map(mappings);
// NOTE(allen): FILE
begin_map(mappings, mapid_file, "TODO");
bind_vanilla_keys(mappings, MDFR_NONE, write_character);
bind_vanilla_keys(mappings, MDFR_ALT, write_character);
bind(mappings, key_mouse_left, MDFR_NONE, click_set_cursor);
bind(mappings, key_mouse_left_release, MDFR_NONE, click_set_mark);
bind(mappings, key_mouse_right, MDFR_NONE, click_set_mark);
bind(mappings, key_left, MDFR_NONE, move_left);
bind(mappings, key_right, MDFR_NONE, move_right);
bind(mappings, key_del, MDFR_NONE, delete_char);
bind(mappings, key_del, MDFR_SHIFT, delete_char);
bind(mappings, key_back, MDFR_NONE, backspace_char);
bind(mappings, key_back, MDFR_SHIFT, backspace_char);
bind(mappings, key_up, MDFR_NONE, move_up);
bind(mappings, key_down, MDFR_NONE, move_down);
bind(mappings, key_end, MDFR_NONE, seek_end_of_line);
bind(mappings, key_home, MDFR_NONE, seek_beginning_of_line);
bind(mappings, key_page_up, MDFR_NONE, page_up);
bind(mappings, key_page_down, MDFR_NONE, page_down);
bind(mappings, key_right, MDFR_CMND, seek_whitespace_right);
bind(mappings, key_left, MDFR_CMND, seek_whitespace_left);
bind(mappings, key_up, MDFR_CMND, seek_whitespace_up_end_line);
bind(mappings, key_down, MDFR_CMND, seek_whitespace_down_end_line);
bind(mappings, key_back, MDFR_CMND, backspace_word);
bind(mappings, key_del, MDFR_CMND, delete_word);
bind(mappings, key_back, MDFR_CTRL, snipe_token_or_word);
bind(mappings, key_del, MDFR_CTRL, snipe_token_or_word_right);
bind(mappings, '/', MDFR_CMND, set_mark);
bind(mappings, 'a', MDFR_CMND, replace_in_range);
bind(mappings, 'c', MDFR_CMND, copy);
bind(mappings, 'd', MDFR_CMND, delete_range);
bind(mappings, 'e', MDFR_CMND, center_view);
bind(mappings, 'E', MDFR_CMND, left_adjust_view);
bind(mappings, 'f', MDFR_CMND, search);
bind(mappings, 'F', MDFR_CMND, list_all_locations);
bind(mappings, 'F', MDFR_CTRL, list_all_substring_locations_case_insensitive);
bind(mappings, 'g', MDFR_CMND, goto_line);
bind(mappings, 'j', MDFR_CMND, to_lowercase);
bind(mappings, 'K', MDFR_CMND, kill_buffer);
bind(mappings, 'l', MDFR_CMND, toggle_line_wrap);
bind(mappings, 'm', MDFR_CMND, cursor_mark_swap);
bind(mappings, 'O', MDFR_CMND, reopen);
bind(mappings, 'q', MDFR_CMND, query_replace);
bind(mappings, 'Q', MDFR_CMND, query_replace_identifier);
bind(mappings, 'r', MDFR_CMND, reverse_search);
bind(mappings, 's', MDFR_CMND, save);
bind(mappings, 't', MDFR_CMND, search_identifier);
bind(mappings, 'T', MDFR_CMND, list_all_locations_of_identifier);
bind(mappings, 'u', MDFR_CMND, to_uppercase);
bind(mappings, 'v', MDFR_CMND, paste_and_indent);
bind(mappings, 'v', MDFR_CTRL, toggle_virtual_whitespace);
bind(mappings, 'V', MDFR_CMND, paste_next_and_indent);
bind(mappings, 'x', MDFR_CMND, cut);
bind(mappings, 'y', MDFR_CMND, redo);
bind(mappings, 'z', MDFR_CMND, undo);
bind(mappings, '2', MDFR_CMND, decrease_line_wrap);
bind(mappings, '3', MDFR_CMND, increase_line_wrap);
bind(mappings, '?', MDFR_CMND, toggle_show_whitespace);
bind(mappings, '~', MDFR_CMND, clean_all_lines);
bind(mappings, '\n', MDFR_NONE, newline_or_goto_position);
bind(mappings, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
bind(mappings, ' ', MDFR_SHIFT, write_character);
end_map(mappings);
// NOTE(allen): CODE
begin_map(mappings, default_code_map, "TODO");
inherit_map(mappings, mapid_file);
bind(mappings, key_right, MDFR_CMND, seek_alphanumeric_or_camel_right);
bind(mappings, key_left, MDFR_CMND, seek_alphanumeric_or_camel_left);
bind(mappings, '\n', MDFR_NONE, write_and_auto_tab);
bind(mappings, '\n', MDFR_SHIFT, write_and_auto_tab);
bind(mappings, '}', MDFR_NONE, write_and_auto_tab);
bind(mappings, ')', MDFR_NONE, write_and_auto_tab);
bind(mappings, ']', MDFR_NONE, write_and_auto_tab);
bind(mappings, ';', MDFR_NONE, write_and_auto_tab);
bind(mappings, '#', MDFR_NONE, write_and_auto_tab);
bind(mappings, '\t', MDFR_NONE, word_complete);
bind(mappings, '\t', MDFR_CMND, auto_tab_range);
bind(mappings, '\t', MDFR_SHIFT, auto_tab_line_at_cursor);
bind(mappings, 'h', MDFR_CTRL, write_hack);
bind(mappings, 'r', MDFR_CTRL, write_block);
bind(mappings, 't', MDFR_CTRL, write_todo);
bind(mappings, 'y', MDFR_CTRL, write_note);
bind(mappings, '[', MDFR_CMND, open_long_braces);
bind(mappings, '{', MDFR_CMND, open_long_braces_semicolon);
bind(mappings, '}', MDFR_CMND, open_long_braces_break);
bind(mappings, 'i', MDFR_CTRL, if0_off);
bind(mappings, '1', MDFR_CTRL, open_file_in_quotes);
bind(mappings, '2', MDFR_CTRL, open_matching_file_cpp);
bind(mappings, '0', MDFR_CMND, write_zero_struct);
bind(mappings, 'I', MDFR_CMND, list_all_functions_current_buffer);
end_map(mappings);
}
end_mapping(mappings);
// Generate remapping from mapping array
FILE *out = fopen(REMAPPING_FILE, "wb");
if (out != 0){
fprintf(out, "#if defined(CUSTOM_COMMAND_SIG)\n");
for (Mapping *mapping = mappings->first_mapping;
mapping != 0;
mapping = mapping->next){
fprintf(out, "void fill_keys_%s(Bind_Helper *context){\n", mapping->name);
for (Sub_Map *sub_map = mapping->first_sub_map;
sub_map != 0;
sub_map = sub_map->next){
fprintf(out, "begin_map(context, %s);\n", sub_map->name);
if (sub_map->parent != 0){
fprintf(out, "inherit_map(context, %s);\n", sub_map->parent);
}
for (Key_Bind *bind = sub_map->first_key_bind;
bind != 0;
bind = bind->next){
char mdfr_str[256];
String m = make_fixed_width_string(mdfr_str);
b32 has_base = false;
if (bind->modifiers & MDFR_CTRL){
if (has_base){
append(&m, "|");
}
append(&m, "MDFR_CTRL");
}
if (bind->modifiers & MDFR_ALT){
if (has_base){
append(&m, "|");
}
append(&m, "MDFR_ALT");
}
if (bind->modifiers & MDFR_CMND){
if (has_base){
append(&m, "|");
}
append(&m, "MDFR_CMND");
}
if (bind->modifiers & MDFR_SHIFT){
if (has_base){
append(&m, "|");
}
append(&m, "MDFR_SHIFT");
}
if (bind->modifiers == 0){
append(&m, "MDFR_NONE");
}
terminate_with_null(&m);
if (bind->vanilla){
if (bind->modifiers == 0){
fprintf(out, "bind_vanilla_keys(context, %s);\n", bind->command);
}
else{
fprintf(out, "bind_vanilla_keys(context, %s, %s);\n", mdfr_str, bind->command);
}
}
else{
char key_str_space[16];
char *key_str = 0;
switch (bind->keycode){
#define KeyCase(n) case key_##n: key_str = "key_" #n; break;
KEY_LIST(KeyCase)
#undef KeyCase
}
if (key_str == 0){
key_str = key_str_space;
if (bind->keycode == '\n'){
memcpy(key_str_space, "'\\n'", 5);
}
else if (bind->keycode == '\t'){
memcpy(key_str_space, "'\\t'", 5);
}
else if (bind->keycode == '\''){
memcpy(key_str_space, "'\\''", 5);
}
else if (bind->keycode == '\\'){
memcpy(key_str_space, "'\\\\'", 5);
}
else{
Assert(bind->keycode <= 127);
key_str_space[0] = '\'';
key_str_space[1] = (char)bind->keycode;
key_str_space[2] = '\'';
key_str_space[3] = 0;
}
}
fprintf(out, "bind(context, %s, %s, %s);\n",
key_str,
mdfr_str,
bind->command);
}
}
fprintf(out, "end_map(context);\n");
}
fprintf(out, "}\n");
}
fprintf(out, "#endif\n");
fprintf(out,
"#if defined(CUSTOM_COMMAND_SIG)\n"
"#define LINK_PROCS(x) x\n"
"#else\n"
"#define LINK_PROCS(x)\n"
"#endif\n");
fprintf(out,
"struct Meta_Key_Bind{\n"
"int32_t vanilla;\n"
"uint32_t keycode;\n"
"uint32_t modifiers;\n"
"char *command;\n"
"int32_t command_len;\n"
"LINK_PROCS(Custom_Command_Function *proc;)\n"
"};\n"
"struct Meta_Sub_Map{\n"
"char *name;\n"
"int32_t name_len;\n"
"char *description;\n"
"int32_t description_len;\n"
"char *parent;\n"
"int32_t parent_len;\n"
"Meta_Key_Bind *binds;\n"
"int32_t bind_count;\n"
"};\n"
"struct Meta_Mapping{\n"
"char *name;\n"
"int32_t name_len;\n"
"char *description;\n"
"int32_t description_len;\n"
"Meta_Sub_Map *sub_maps;\n"
"int32_t sub_map_count;\n"
"LINK_PROCS(void (*fill_keys_proc)(Bind_Helper *context);)\n"
"};\n");
for (Mapping *mapping = mappings->first_mapping;
mapping != 0;
mapping = mapping->next){
for (Sub_Map *sub_map = mapping->first_sub_map;
sub_map != 0;
sub_map = sub_map->next){
if (sub_map->key_bind_count > 0){
fprintf(out, "static Meta_Key_Bind fcoder_binds_for_%s_%s[%d] = {\n",
mapping->name, sub_map->name, sub_map->key_bind_count);
for (Key_Bind *bind = sub_map->first_key_bind;
bind != 0;
bind = bind->next){
fprintf(out,
"{%d, %u, %u, \"%s\", %d, LINK_PROCS(%s)},\n",
bind->vanilla, bind->keycode, bind->modifiers,
bind->command, bind->command_len,
bind->command);
}
fprintf(out, "};\n");
}
}
fprintf(out, "static Meta_Sub_Map fcoder_submaps_for_%s[%d] = {\n",
mapping->name, mapping->sub_map_count);
for (Sub_Map *sub_map = mapping->first_sub_map;
sub_map != 0;
sub_map = sub_map->next){
if (sub_map->parent != 0){
fprintf(out, "{\"%s\", %d, \"%s\", %d, \"%s\", %d, fcoder_binds_for_%s_%s, %d},\n",
sub_map->name, sub_map->name_len,
sub_map->description, sub_map->description_len,
sub_map->parent, sub_map->parent_len,
mapping->name, sub_map->name,
sub_map->key_bind_count);
}
else{
fprintf(out, "{\"%s\", %d, \"%s\", %d, 0, 0, fcoder_binds_for_%s_%s, %d},\n",
sub_map->name, sub_map->name_len,
sub_map->description, sub_map->description_len,
mapping->name, sub_map->name,
sub_map->key_bind_count);
}
}
fprintf(out, "};\n");
}
fprintf(out, "static Meta_Mapping fcoder_meta_maps[%d] = {\n",
mappings->mapping_count);
for (Mapping *mapping = mappings->first_mapping;
mapping != 0;
mapping = mapping->next){
fprintf(out, "{\"%s\", %d, \"%s\", %d, fcoder_submaps_for_%s, %d, LINK_PROCS(fill_keys_%s)},\n",
mapping->name, mapping->name_len,
mapping->description, mapping->description_len,
mapping->name,
mapping->sub_map_count,
mapping->name);
}
fprintf(out, "};\n");
fclose(out);
}
fm_end_temp(temp);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
int main(int argc, char **argv){ int main(int argc, char **argv){
META_BEGIN(); META_BEGIN();
@ -510,6 +1266,7 @@ int main(int argc, char **argv){
generate_keycode_enum(); generate_keycode_enum();
generate_style(); generate_style();
generate_custom_headers(); generate_custom_headers();
generate_remapping_code_and_data();
META_FINISH(); META_FINISH();
} }

View File

@ -20,8 +20,8 @@
#include "4coder_lib/4coder_utf8.h" #include "4coder_lib/4coder_utf8.h"
#if defined(FRED_SUPER) #if defined(FRED_SUPER)
# include "4coder_API/keycodes.h" # include "4coder_generated/keycodes.h"
# include "4coder_API/style.h" # include "4coder_generated/style.h"
# define FSTRING_IMPLEMENTATION # define FSTRING_IMPLEMENTATION
# include "4coder_lib/4coder_string.h" # include "4coder_lib/4coder_string.h"

View File

@ -17,8 +17,8 @@
#include "4coder_lib/4coder_utf8.h" #include "4coder_lib/4coder_utf8.h"
#if defined(FRED_SUPER) #if defined(FRED_SUPER)
# include "4coder_API/keycodes.h" # include "4coder_generated/keycodes.h"
# include "4coder_API/style.h" # include "4coder_generated/style.h"
# define FSTRING_IMPLEMENTATION # define FSTRING_IMPLEMENTATION
# include "4coder_lib/4coder_string.h" # include "4coder_lib/4coder_string.h"

View File

@ -30,8 +30,8 @@
#include "4coder_lib/4coder_utf8.h" #include "4coder_lib/4coder_utf8.h"
#if defined(FRED_SUPER) #if defined(FRED_SUPER)
# include "4coder_API/keycodes.h" # include "4coder_generated/keycodes.h"
# include "4coder_API/style.h" # include "4coder_generated/style.h"
# define FSTRING_IMPLEMENTATION # define FSTRING_IMPLEMENTATION
# include "4coder_lib/4coder_string.h" # include "4coder_lib/4coder_string.h"
@ -309,12 +309,10 @@ win32_post_clipboard(char *text, i32 len){
internal internal
Sys_Post_Clipboard_Sig(system_post_clipboard){ Sys_Post_Clipboard_Sig(system_post_clipboard){
LOG("Beginning clipboard post\n");
Partition *part = &win32vars.clip_post_part; Partition *part = &win32vars.clip_post_part;
part->pos = 0; part->pos = 0;
u8 *post = (u8*)sysshared_push_block(part, str.size + 1); u8 *post = (u8*)sysshared_push_block(part, str.size + 1);
if (post != 0){ if (post != 0){
LOG("Copying post to clipboard buffer\n");
memcpy(post, str.str, str.size); memcpy(post, str.str, str.size);
post[str.size] = 0; post[str.size] = 0;
win32vars.clip_post_len = str.size; win32vars.clip_post_len = str.size;
@ -322,7 +320,6 @@ Sys_Post_Clipboard_Sig(system_post_clipboard){
else{ else{
LOGF("Failed to allocate buffer for clipboard post (%d)\n", str.size + 1); LOGF("Failed to allocate buffer for clipboard post (%d)\n", str.size + 1);
} }
LOG("Finished clipboard post\n");
} }
internal b32 internal b32
@ -571,7 +568,7 @@ struct Win32_Font_Enum{
Font_Setup_List *list; Font_Setup_List *list;
}; };
internal int int CALL_CONVENTION
win32_font_enum_callback( win32_font_enum_callback(
const LOGFONT *lpelfe, const LOGFONT *lpelfe,
const TEXTMETRIC *lpntme, const TEXTMETRIC *lpntme,

View File

@ -3,7 +3,7 @@
* *
* 25.02.2016 * 25.02.2016
* *
* File editing view for 4coder * Document data structure and generator for 4coder documentation.
* *
*/ */

View File

@ -34,8 +34,219 @@
#include "../meta/4ed_meta_keywords.h" #include "../meta/4ed_meta_keywords.h"
#include "4ed_abstract_document.cpp" #include "4ed_abstract_document.cpp"
#include "../4coder_generated/command_metadata.h"
#include "../4coder_generated/remapping.h"
#include "../4coder_generated/keycodes.h"
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
internal void
copy_and_fix_name(char *src, char *dst, int32_t cap){
String s = make_string_cap(dst, 0, cap);
copy(&s, src);
replace_char(&s, '_', '-');
terminate_with_null(&s);
}
enum{
MDFR_NONE = 0x0,
MDFR_CTRL = 0x1,
MDFR_ALT = 0x2,
MDFR_CMND = 0x4,
MDFR_SHIFT = 0x8,
};
global char long_commands_str[] = R"foo(
\SECTION{4coder Long Command}
Long name commands that can be typed in after using the "long command" command for infrequently triggered commands.
\LIST
\ITEM \STYLE{code} "load project" \END Load a project.4coder file, ditching any previously loaded project
\ITEM \STYLE{code} "open all code" \END Open all code files in the current directory, extensions set in config.4coder, default to C/C++ extensions
\ITEM \STYLE{code} "open all code recursive" \END Like \STYLE{code} "open all code" \END but recurses through folders
\ITEM \STYLE{code} "dos lines" \END Switch the buffer to 'dos' line ending mode CRLF
\ITEM \STYLE{code} "nix lines" \END Switch the buffer to 'nix' line ending mode LF
\ITEM \STYLE{code} "remap" \END Change to one of the built in command bindings
\ITEM \STYLE{code} "new project" \END Setup a new project.4coder and accompanying build scripts
\END
\END
)foo";
internal void
generate_binding_list(char *code_directory, char *src_directory){
char full_path[512];
String s = make_fixed_width_string(full_path);
append(&s, src_directory);
if (s.size == 0 || !char_is_slash(s.str[s.size - 1])){
append(&s, "/");
}
append(&s, "binding_list.txt");
terminate_with_null(&s);
FILE *out = fopen(full_path, "wb");
if (out == 0){
fprintf(stdout, "could not open binding_list.txt for auto synchronized binding info\n");
return;
}
fprintf(out, "\n\\INCLUDE{site_header.txt}\n");
fprintf(out, "\n4coder version \\VERSION\n");
fprintf(out, "\n\\SECTION{Built in Bindings}\n");
for (i32 i = 0; i < ArrayCount(fcoder_meta_maps); ++i){
Meta_Mapping *mapping = &fcoder_meta_maps[i];
char s[512];
copy_and_fix_name(mapping->name, s, sizeof(s));
fprintf(out, "\\ITEM \\STYLE{code} \"%s\" \\END %s\n", s, mapping->description);
}
fprintf(out, "\\END\n");
fprintf(out, long_commands_str);
for (i32 i = 0; i < ArrayCount(fcoder_meta_maps); ++i){
Meta_Mapping *mapping = &fcoder_meta_maps[i];
char s[512];
copy_and_fix_name(mapping->name, s, sizeof(s));
fprintf(out, "\\SECTION{Map: %s}\n", s);
for (i32 j = 0; j < mapping->sub_map_count; ++j){
Meta_Sub_Map *sub_map = &mapping->sub_maps[j];
char sub_s[512];
copy_and_fix_name(sub_map->name, sub_s, sizeof(sub_s));
fprintf(out, "\\SECTION{%s}\n", sub_s);
fprintf(out, "%s\n", sub_map->description);
fprintf(out, "\\LIST\n", sub_map->description);
for (i32 k = 0; k < sub_map->bind_count; ++k){
Meta_Key_Bind *bind = &sub_map->binds[k];
// Get modifier key string
char mdfr_str[256];
String m = make_fixed_width_string(mdfr_str);
b32 has_base = false;
if (bind->modifiers & MDFR_CTRL){
if (has_base){
append(&m, "+");
}
append(&m, "ctrl");
}
if (bind->modifiers & MDFR_ALT){
if (has_base){
append(&m, "+");
}
append(&m, "alt");
}
if (bind->modifiers & MDFR_CMND){
if (has_base){
append(&m, "+");
}
append(&m, "cmnd");
}
if (bind->modifiers & MDFR_SHIFT){
if (has_base){
append(&m, "+");
}
append(&m, "shift");
}
if (bind->modifiers != 0){
append(&m, " ");
}
terminate_with_null(&m);
// Get printable key string
char key_str_space[2];
char *key_str = 0;
if (bind->vanilla){
key_str = "any character";
}
else{
switch (bind->keycode){
case key_back: key_str = "backspace"; break;
case key_up: key_str = "up"; break;
case key_down: key_str = "down"; break;
case key_left: key_str = "left"; break;
case key_right: key_str = "right"; break;
case key_del: key_str = "delete"; break;
case key_insert: key_str = "insert"; break;
case key_home: key_str = "home"; break;
case key_end: key_str = "end"; break;
case key_page_up: key_str = "page up"; break;
case key_page_down: key_str = "page down"; break;
case key_esc: key_str = "escape"; break;
case key_mouse_left: key_str = "left click"; break;
case key_mouse_right: key_str = "right click"; break;
case key_mouse_left_release: key_str = "left release"; break;
case key_mouse_right_release: key_str = "right release"; break;
case key_f1: key_str = "f1"; break;
case key_f2: key_str = "f2"; break;
case key_f3: key_str = "f3"; break;
case key_f4: key_str = "f4"; break;
case key_f5: key_str = "f5"; break;
case key_f6: key_str = "f6"; break;
case key_f7: key_str = "f7"; break;
case key_f8: key_str = "f8"; break;
case key_f9: key_str = "f9"; break;
case key_f10: key_str = "f10"; break;
case key_f11: key_str = "f11"; break;
case key_f12: key_str = "f12"; break;
case key_f13: key_str = "f13"; break;
case key_f14: key_str = "f14"; break;
case key_f15: key_str = "f15"; break;
case key_f16: key_str = "f16"; break;
default:
{
if (bind->keycode == '\n'){
key_str = "return";
}
else if (bind->keycode == '\t'){
key_str = "tab";
}
else{
Assert(bind->keycode <= 127);
key_str = key_str_space;
key_str_space[0] = (char)bind->keycode;
key_str_space[1] = 0;
}
}break;
}
}
// Get description from doc string
char *description = "description missing";
char *command = bind->command;
for (i32 i = 0; i < command_one_past_last_id; ++i){
Command_Metadata *metadata = command_metadata_by_id(i);
if (match(metadata->name, command)){
description = metadata->description;
break;
}
}
fprintf(out, "\\ITEM \\STYLE{code} <%s%s> \\END %s\n",
mdfr_str, key_str,
description);
}
fprintf(out, "\\END\n");
fprintf(out, "\\END\n");
}
fprintf(out, "\\END\n");
}
fclose(out);
}
#if 0
#endif
// //
// Meta Parse Rules // Meta Parse Rules
// //
@ -151,10 +362,16 @@ generate_site(char *code_directory, char *asset_directory, char *src_directory,
int main(int argc, char **argv){ int main(int argc, char **argv){
META_BEGIN(); META_BEGIN();
fm_init_system();
if (argc == 5){ if (argc == 5){
generate_site(argv[1], argv[2], argv[3], argv[4]); fm_init_system();
char *code_directory = argv[1];
char *asset_directory = argv[2];
char *src_directory = argv[3];
char *dst_directory = argv[4];
generate_binding_list(code_directory, src_directory);
generate_site(code_directory, asset_directory, src_directory, dst_directory);
} }
META_FINISH(); META_FINISH();

View File

@ -4,375 +4,312 @@
4coder version \VERSION 4coder version \VERSION
\SECTION{Built in Bindings} \SECTION{Built in Bindings}
\ITEM \STYLE{code} "default" \END The standard bindings for Windows and Linux \ITEM \STYLE{code} "default" \END TODO
\ITEM \STYLE{code} "mac-default" \END The standard bindings reconfigured to be similar to other Mac applications \ITEM \STYLE{code} "mac-default" \END TODO
\ITEM \STYLE{code} "mac-4coder-like" \END Bindings for Mac that make it very similar to use to 4coder on other OSes
\END \END
\SECTION{4coder Long Command} \SECTION{4coder Long Command}
Long name commands that can be typed in after using the "long command" command for infrequently triggered commands. Long name commands that can be typed in after using the "long command" command for infrequently triggered commands.
\LIST \LIST
\ITEM \STYLE{code} "load project" \END Load a project.4coder file, ditching any previously loaded project \ITEM \STYLE{code} "load project" \END Load a project.4coder file, ditching any previously loaded project
\ITEM \STYLE{code} "open all code" \END Open all code files in the current directory, extensions set in config.4coder, default to C/C++ extensions \ITEM \STYLE{code} "open all code" \END Open all code files in the current directory, extensions set in config.4coder, default to C/C++ extensions
\ITEM \STYLE{code} "open all code recursive" \END Like \STYLE{code} "open all code" \END but recurses through folders \ITEM \STYLE{code} "open all code recursive" \END Like \STYLE{code} "open all code" \END but recurses through folders
\ITEM \STYLE{code} "dos lines" \END Switch the buffer to 'dos' line ending mode CRLF \ITEM \STYLE{code} "dos lines" \END Switch the buffer to 'dos' line ending mode CRLF
\ITEM \STYLE{code} "nix lines" \END Switch the buffer to 'nix' line ending mode LF \ITEM \STYLE{code} "nix lines" \END Switch the buffer to 'nix' line ending mode LF
\ITEM \STYLE{code} "remap" \END Change to one of the built in command bindings \ITEM \STYLE{code} "remap" \END Change to one of the built in command bindings
\ITEM \STYLE{code} "new project" \END Setup a new project.4coder and accompanying build scripts \ITEM \STYLE{code} "new project" \END Setup a new project.4coder and accompanying build scripts
\END \END
\END \END
\SECTION{Map: default} \SECTION{Map: default}
\SECTION{mapid-global}
\SECTION{Global} TODO
The following bindings apply in all situations. \LIST
\LIST \ITEM \STYLE{code} <ctrl p> \END Create a new panel by vertically splitting the active panel.
\ITEM \STYLE{code} <ctrl p> \END Create a new panel with a vertical split \ITEM \STYLE{code} <ctrl _> \END Create a new panel by horizontally splitting the active panel.
\ITEM \STYLE{code} <ctrl _> \END Create a new panel with a horizontal split \ITEM \STYLE{code} <ctrl P> \END Closes the currently active panel if it is not the only panel open.
\ITEM \STYLE{code} <ctrl P> \END Close a panel \ITEM \STYLE{code} <ctrl ,> \END Change the currently active panel, moving to the panel with the next highest view_id.
\ITEM \STYLE{code} <ctrl ,> \END Change active panel \ITEM \STYLE{code} <ctrl <> \END Change the currently active panel, moving to the panel with the next lowest view_id.
\ITEM \STYLE{code} <ctrl <> \END change active panel backwards \ITEM \STYLE{code} <ctrl n> \END Interactively creates a new file.
\ITEM \STYLE{code} <ctrl o> \END Interactively opens or creates a new file.
\ITEM \STYLE{code} <ctrl n> \END New file dialogue \ITEM \STYLE{code} <alt o> \END Reads a filename from surrounding '"' characters and attempts to open the corresponding file, displaying it in the other view.
\ITEM \STYLE{code} <ctrl o> \END Open file dialogue \ITEM \STYLE{code} <ctrl k> \END Interactively kill an open buffer.
\ITEM \STYLE{code} <alt o> \END Open file dialogue in other panel \ITEM \STYLE{code} <ctrl i> \END Interactively switch to an open buffer.
\ITEM \STYLE{code} <ctrl k> \END Kill buffer dialogue \ITEM \STYLE{code} <ctrl h> \END Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.
\ITEM \STYLE{code} <ctrl i> \END Switch open buffer dialogue \ITEM \STYLE{code} <ctrl S> \END Saves all buffers marked dirty (showing the '*' indicator).
\ITEM \STYLE{code} <ctrl w> \END 'Save As' - save file into new name \ITEM \STYLE{code} <alt c> \END Opens the 4coder colors and fonts selector menu.
\ITEM \STYLE{code} <ctrl h> \END Set hot directory to projet root directory \ITEM \STYLE{code} <alt d> \END Opens a debug view for internal use.
\ITEM \STYLE{code} <ctrl S> \END Save all dirty buffers \ITEM \STYLE{code} <alt .> \END If the special build panel is open, makes the build panel the active panel.
\ITEM \STYLE{code} <alt ,> \END If the special build panel is open, closes it.
\ITEM \STYLE{code} <alt c> \END Open color and font selection GUI \ITEM \STYLE{code} <alt n> \END description missing
\ITEM \STYLE{code} <alt d> \END Open a debug information GUI \ITEM \STYLE{code} <alt N> \END description missing
\ITEM \STYLE{code} <alt M> \END description missing
\ITEM \STYLE{code} <alt .> \END Change to footer build panel \ITEM \STYLE{code} <alt m> \END 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.
\ITEM \STYLE{code} <alt ,> \END Close footer build panel \ITEM \STYLE{code} <alt z> \END Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.
\ITEM \STYLE{code} <alt n> \END Goto next error/jump location \ITEM \STYLE{code} <alt Z> \END If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.
\ITEM \STYLE{code} <alt N> \END Goto previous error/jump location \ITEM \STYLE{code} <alt x> \END Execute a 'long form' command.
\ITEM \STYLE{code} <alt M> \END Goto first error/jump location \ITEM \STYLE{code} <alt s> \END Sets the current view to show it's scrollbar.
\ITEM \STYLE{code} <alt m> \END Launch basic build (calls build.bat, build.sh, or Makefile) \ITEM \STYLE{code} <alt w> \END Sets the current view to hide it's scrollbar.
\ITEM \STYLE{code} <alt b> \END Toggles the visibility status of the current view's filebar.
\ITEM \STYLE{code} <alt z> \END Execute arbitrary shell/terminal command in arbitrary buffer \ITEM \STYLE{code} <alt @> \END Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.
\ITEM \STYLE{code} <alt Z> \END Repeat previous shell/terminal command \ITEM \STYLE{code} <ctrl page up> \END Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.
\ITEM \STYLE{code} <alt E> \END Attempts to close 4coder.
\ITEM \STYLE{code} <alt x> \END Execute "long command" (see long command section) \ITEM \STYLE{code} <f1> \END 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.
\ITEM \STYLE{code} <f2> \END 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.
\ITEM \STYLE{code} <alt s> \END Show scrollbar \ITEM \STYLE{code} <f3> \END 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.
\ITEM \STYLE{code} <alt w> \END Hide scrollbar \ITEM \STYLE{code} <f4> \END 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.
\ITEM \STYLE{code} <alt b> \END Toggle filebar \ITEM \STYLE{code} <f5> \END 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.
\ITEM \STYLE{code} <f6> \END 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.
\ITEM \STYLE{code} <alt @> \END Toggle mouse input \ITEM \STYLE{code} <f7> \END 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.
\ITEM \STYLE{code} <ctrl page up> \END Toggle fullscreen mode \ITEM \STYLE{code} <f8> \END 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.
\ITEM \STYLE{code} <alt E> \END Exit 4coder \ITEM \STYLE{code} <f9> \END 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.
\ITEM \STYLE{code} <f10> \END 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.
\ITEM \STYLE{code} <f1> \END Launch shell command set in a loaded project \ITEM \STYLE{code} <f11> \END 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.
\ITEM \STYLE{code} <f2> \END Launch shell command set in a loaded project \ITEM \STYLE{code} <f12> \END 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.
\ITEM \STYLE{code} <f3> \END Launch shell command set in a loaded project \ITEM \STYLE{code} <f13> \END 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.
\ITEM \STYLE{code} <f4> \END Launch shell command set in a loaded project \ITEM \STYLE{code} <f14> \END 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.
\ITEM \STYLE{code} <f15> \END 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.
\ITEM \STYLE{code} <f5> \END Launch shell command set in a loaded project \ITEM \STYLE{code} <f16> \END 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.
\ITEM \STYLE{code} <f6> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f7> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f8> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f9> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f10> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f11> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f12> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f13> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f14> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f15> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f16> \END Launch shell command set in a loaded project
\END
\END \END
\SECTION{Text File}
The following bindings apply in general text files and most apply in code files, but some are overriden by other commands.
\LIST
\ITEM \STYLE{code} <any character> \END Insert character
\ITEM \STYLE{code} <left click> \END Set cursor position to mouse position
\ITEM \STYLE{code} <left release> \END Set mark position to mouse position
\ITEM \STYLE{code} <right click> \END Set mark position to mouse position
\ITEM \STYLE{code} <left> \END Move left
\ITEM \STYLE{code} <right> \END Move right
\ITEM \STYLE{code} <del> \END Delete character
\ITEM \STYLE{code} <shift del> \END Delete character
\ITEM \STYLE{code} <back> \END Backspace character
\ITEM \STYLE{code} <shift back> \END Backspace character
\ITEM \STYLE{code} <up> \END Move up
\ITEM \STYLE{code} <down> \END Move up
\ITEM \STYLE{code} <end> \END Move to end of line
\ITEM \STYLE{code} <home> \END Move to beginning of line
\ITEM \STYLE{code} <page up> \END Move up one whole page
\ITEM \STYLE{code} <page down> \END Move down one whole page
\ITEM \STYLE{code} <ctrl right> \END Seek right, stop at whitespace
\ITEM \STYLE{code} <ctrl left> \END Seek left, stop at whitespace
\ITEM \STYLE{code} <ctrl up> \END Seek up, stop at blank line
\ITEM \STYLE{code} <ctrl down> \END Seek down, stop at blank line
\ITEM \STYLE{code} <alt up> \END Move up ten lines
\ITEM \STYLE{code} <alt down> \END Move down ten lines
\ITEM \STYLE{code} <ctrl back> \END Delete word backwards
\ITEM \STYLE{code} <ctrl del> \END Delete word forwards
\ITEM \STYLE{code} <alt back> \END Snipe token (or word) left
\ITEM \STYLE{code} <alt del> \END Snipe token (or word) right
\ITEM Note: 'the range' in the following commands refers to the text between the mark and cursor.
\ITEM \STYLE{code} <ctrl space> \END Set mark to the cursor position
\ITEM \STYLE{code} <ctrl a> \END Replace a substring in the range
\ITEM \STYLE{code} <ctrl c> \END Copy text from the range
\ITEM \STYLE{code} <ctrl d> \END Delete the text in the range
\ITEM \STYLE{code} <ctrl e> \END Center the active view on the cursor
\ITEM \STYLE{code} <ctrl E> \END Move the view so that it's left edge is near the cursor's current x position
\ITEM \STYLE{code} <ctrl f> \END Begin an incremental search through the current buffer
\ITEM \STYLE{code} <ctrl F> \END Create a jump location list of all loaded exact matches of a string
\ITEM \STYLE{code} <alt F> \END Create a jump location list of all loaded substring matches of a string without case sensitivity
\ITEM \STYLE{code} <ctrl g> \END Goto a specific line number
\ITEM \STYLE{code} <ctrl j> \END Convert text in the range to lowercase
\ITEM \STYLE{code} <ctrl K> \END Kill the current buffer
\ITEM \STYLE{code} <ctrl l> \END Toggle line wrapping on the current buffer
\ITEM \STYLE{code} <ctrl m> \END Swap the cursor and mark positions
\ITEM \STYLE{code} <ctrl O> \END Reload the current buffer from the file system
\ITEM \STYLE{code} <ctrl q> \END Begin an iterative query replace
\ITEM \STYLE{code} <ctrl Q> \END Begin an iterative query replace to replace the word under the cursor
\ITEM \STYLE{code} <ctrl r> \END Begin a reversed incremental search through the current buffer
\ITEM \STYLE{code} <ctrl s> \END Save the current buffer with it's given filename
\ITEM \STYLE{code} <ctrl t> \END Begin an incremenal search through the current buffer for the word under the cursor
\ITEM \STYLE{code} <ctrl T> \END Create a jump location list of all loaded exact matches of the word under the cursor
\ITEM \STYLE{code} <ctrl u> \END Convert text in the range to uppercase
\ITEM \STYLE{code} <ctrl v> \END Paste from the clipboard
\ITEM \STYLE{code} <alt v> \END Toggle the virtual whitespace system
\ITEM \STYLE{code} <ctrl V> \END Paste the next item on the clipboard, 4coder keeps a finite history of past 64 copies
\ITEM \STYLE{code} <ctrl x> \END Copy text from the range and delete the range (aka cut)
\ITEM \STYLE{code} <ctrl y> \END Redo
\ITEM \STYLE{code} <ctrl z> \END Undo
\ITEM \STYLE{code} <ctrl 2> \END Decrease the line wrap width for the current buffer
\ITEM \STYLE{code} <ctrl 3> \END Increase the line wrap width for the current buffer
\ITEM \STYLE{code} <ctrl ?> \END Toggle the show whitespace option
\ITEM \STYLE{code} <ctrl ~> \END Clean trailing whitespace from all lines
\ITEM \STYLE{code} <return> \END Interpret jump location under cursor and jump to it, lock the next/prev jump commands to this jump location list (only in read only files)
\ITEM \STYLE{code} <shift return> \END Like previous command but tries to open the jump location in the view that currently holds the jump location list
\END
\END \END
\SECTION{mapid-file}
\SECTION{Code File} TODO
The following commands only apply in C/C++ files where the lexer (syntax highlighting) is turned on. \LIST
\LIST \ITEM \STYLE{code} <any character> \END Inserts whatever character was used to trigger this command.
\ITEM \STYLE{code} <left click> \END Sets the cursor position to the mouse position.
\ITEM \STYLE{code} <ctrl right> \END Seek right stop at alphanumeric or camel case \ITEM \STYLE{code} <left release> \END Sets the mark position to the mouse position.
\ITEM \STYLE{code} <ctrl left> \END Seek left stop at alphanumeric or camel case \ITEM \STYLE{code} <right click> \END Sets the mark position to the mouse position.
\ITEM \STYLE{code} <left> \END Moves the cursor one character to the left.
\ITEM \STYLE{code} <}> \END Insert character and trigger auto indentation \ITEM \STYLE{code} <right> \END Moves the cursor one character to the right.
\ITEM \STYLE{code} <)> \END Insert character and trigger auto indentation \ITEM \STYLE{code} <delete> \END Deletes the character to the right of the cursor.
\ITEM \STYLE{code} <]> \END Insert character and trigger auto indentation \ITEM \STYLE{code} <shift delete> \END Deletes the character to the right of the cursor.
\ITEM \STYLE{code} <;> \END Insert character and trigger auto indentation \ITEM \STYLE{code} <backspace> \END Deletes the character to the left of the cursor.
\ITEM \STYLE{code} <#> \END Insert character and trigger auto indentation \ITEM \STYLE{code} <shift backspace> \END Deletes the character to the left of the cursor.
\ITEM \STYLE{code} <up> \END Moves the cursor up one line.
\ITEM \STYLE{code} <tab> \END Automatically complete partial word \ITEM \STYLE{code} <down> \END Moves the cursor down one line.
\ITEM \STYLE{code} <ctrl tab> \END Auto indent the range \ITEM \STYLE{code} <end> \END Seeks the cursor to the end of the visual line.
\ITEM \STYLE{code} <shift tab> \END Auto indent the line at the cursor \ITEM \STYLE{code} <home> \END Seeks the cursor to the beginning of the visual line.
\ITEM \STYLE{code} <page up> \END Scrolls the view up one view height and moves the cursor up one view height.
\ITEM \STYLE{code} <alt h> \END Insert a HACK commment \ITEM \STYLE{code} <page down> \END Scrolls the view down one view height and moves the cursor down one view height.
\ITEM \STYLE{code} <alt r> \END Insert a block comment \ITEM \STYLE{code} <ctrl right> \END Seek right for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <alt t> \END Insert a TODO comment \ITEM \STYLE{code} <ctrl left> \END Seek left for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <alt y> \END Insert a NOTE comment \ITEM \STYLE{code} <ctrl up> \END Seeks the cursor up to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <ctrl [> \END Open a pair of braces \ITEM \STYLE{code} <ctrl down> \END Seeks the cursor down to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <ctrl {> \END Open a pair of braces ended with a semicolon \ITEM \STYLE{code} <alt up> \END Moves the cursor up ten lines.
\ITEM \STYLE{code} <ctrl }> \END Open a pair of braces ended with a break \ITEM \STYLE{code} <alt down> \END Moves the cursor down ten lines.
\ITEM \STYLE{code} <alt i> \END Surround the range with #if 0 and #endif \ITEM \STYLE{code} <ctrl backspace> \END Delete characters between the cursor position and the first alphanumeric boundary to the left.
\ITEM \STYLE{code} <alt 1> \END Try to open a file named by the string surrounded by quotes under the cursor \ITEM \STYLE{code} <ctrl delete> \END Delete characters between the cursor position and the first alphanumeric boundary to the right.
\ITEM \STYLE{code} <alt 2> \END Switch from .cpp \STYLE{code} <-> \END .h \ITEM \STYLE{code} <alt backspace> \END Delete a single, whole token on or to the left of the cursor.
\ITEM \STYLE{code} <ctrl 0> \END Insert the characters " = {0};" \ITEM \STYLE{code} <alt delete> \END Delete a single, whole token on or to the right of the cursor.
\ITEM \STYLE{code} <ctrl I> \END List all function signatures in the current buffer \ITEM \STYLE{code} <ctrl > \END Sets the mark to the current position of the cursor.
\ITEM \STYLE{code} <ctrl a> \END 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.
\END \ITEM \STYLE{code} <ctrl c> \END Copy the text in the range from the cursor to the mark onto the clipboard.
\ITEM \STYLE{code} <ctrl d> \END Deletes the text in the range between the cursor and the mark.
\ITEM \STYLE{code} <ctrl e> \END Centers the view vertically on the line on which the cursor sits.
\ITEM \STYLE{code} <ctrl E> \END Sets the left size of the view near the x position of the cursor.
\ITEM \STYLE{code} <ctrl f> \END Begins an incremental search down through the current buffer for a user specified string.
\ITEM \STYLE{code} <ctrl F> \END Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.
\ITEM \STYLE{code} <alt F> \END Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.
\ITEM \STYLE{code} <ctrl g> \END Queries the user for a number, and jumps the cursor to the corresponding line.
\ITEM \STYLE{code} <ctrl j> \END Converts all ascii text in the range between the cursor and the mark to lowercase.
\ITEM \STYLE{code} <ctrl K> \END Kills the current buffer.
\ITEM \STYLE{code} <ctrl l> \END Toggles the current buffer's line wrapping status.
\ITEM \STYLE{code} <ctrl m> \END Swaps the position of the cursor and the mark.
\ITEM \STYLE{code} <ctrl O> \END Reopen the current buffer from the hard drive.
\ITEM \STYLE{code} <ctrl q> \END Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.
\ITEM \STYLE{code} <ctrl Q> \END Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.
\ITEM \STYLE{code} <ctrl r> \END Begins an incremental search up through the current buffer for a user specified string.
\ITEM \STYLE{code} <ctrl s> \END Saves the current buffer.
\ITEM \STYLE{code} <ctrl t> \END Begins an incremental search down through the current buffer for the word or token under the cursor.
\ITEM \STYLE{code} <ctrl T> \END Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.
\ITEM \STYLE{code} <ctrl u> \END Converts all ascii text in the range between the cursor and the mark to uppercase.
\ITEM \STYLE{code} <ctrl v> \END Paste from the top of clipboard and run auto-indent on the newly pasted text.
\ITEM \STYLE{code} <alt v> \END Toggles the current buffer's virtual whitespace status.
\ITEM \STYLE{code} <ctrl V> \END Paste the next item on the clipboard and run auto-indent on the newly pasted text.
\ITEM \STYLE{code} <ctrl x> \END Cut the text in the range from the cursor to the mark onto the clipboard.
\ITEM \STYLE{code} <ctrl y> \END Advances forewards through the undo history.
\ITEM \STYLE{code} <ctrl z> \END Advances backwards through the undo history.
\ITEM \STYLE{code} <ctrl 2> \END Decrases the current buffer's width for line wrapping.
\ITEM \STYLE{code} <ctrl 3> \END Increases the current buffer's width for line wrapping.
\ITEM \STYLE{code} <ctrl ?> \END Toggles the current buffer's whitespace visibility status.
\ITEM \STYLE{code} <ctrl ~> \END Removes trailing whitespace from all lines in the current buffer.
\ITEM \STYLE{code} <return> \END description missing
\ITEM \STYLE{code} <shift return> \END description missing
\ITEM \STYLE{code} <shift > \END Inserts whatever character was used to trigger this command.
\END
\END
\SECTION{default-code-map}
TODO
\LIST
\ITEM \STYLE{code} <ctrl right> \END Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.
\ITEM \STYLE{code} <ctrl left> \END Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.
\ITEM \STYLE{code} <return> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <shift return> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <}> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <)> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <]> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <;> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <#> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <tab> \END Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.
\ITEM \STYLE{code} <ctrl tab> \END Auto-indents the range between the cursor and the mark.
\ITEM \STYLE{code} <shift tab> \END Auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <alt h> \END At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.
\ITEM \STYLE{code} <alt r> \END At the cursor, insert a block comment.
\ITEM \STYLE{code} <alt t> \END At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.
\ITEM \STYLE{code} <alt y> \END At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.
\ITEM \STYLE{code} <ctrl [> \END At the cursor, insert a '{' and '}' separated by a blank line.
\ITEM \STYLE{code} <ctrl {> \END At the cursor, insert a '{' and '};' separated by a blank line.
\ITEM \STYLE{code} <ctrl }> \END At the cursor, insert a '{' and '}break;' separated by a blank line.
\ITEM \STYLE{code} <alt i> \END Surround the range between the cursor and mark with an '#if 0' and an '#endif'
\ITEM \STYLE{code} <alt 1> \END Reads a filename from surrounding '"' characters and attempts to open the corresponding file.
\ITEM \STYLE{code} <alt 2> \END If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.
\ITEM \STYLE{code} <ctrl 0> \END At the cursor, insert a ' = {0};'.
\ITEM \STYLE{code} <ctrl I> \END Creates a jump list of lines of the current buffer that appear to define or declare functions.
\END
\END \END
\END \END
\SECTION{Map: mac-default} \SECTION{Map: mac-default}
\SECTION{mapid-global}
\SECTION{Global} TODO
The following bindings apply in all situations. \LIST
\LIST \ITEM \STYLE{code} <cmnd p> \END Create a new panel by vertically splitting the active panel.
\ITEM \STYLE{code} <cmnd p> \END Create a new panel with a vertical split \ITEM \STYLE{code} <cmnd _> \END Create a new panel by horizontally splitting the active panel.
\ITEM \STYLE{code} <cmnd _> \END Create a new panel with a horizontal split \ITEM \STYLE{code} <cmnd P> \END Closes the currently active panel if it is not the only panel open.
\ITEM \STYLE{code} <cmnd P> \END Close a panel \ITEM \STYLE{code} <cmnd ,> \END Change the currently active panel, moving to the panel with the next highest view_id.
\ITEM \STYLE{code} <cmnd ,> \END Change active panel \ITEM \STYLE{code} <cmnd <> \END Change the currently active panel, moving to the panel with the next lowest view_id.
\ITEM \STYLE{code} <cmnd <> \END change active panel backwards \ITEM \STYLE{code} <cmnd n> \END Interactively creates a new file.
\ITEM \STYLE{code} <cmnd o> \END Interactively opens or creates a new file.
\ITEM \STYLE{code} <cmnd n> \END New file dialogue \ITEM \STYLE{code} <ctrl o> \END Reads a filename from surrounding '"' characters and attempts to open the corresponding file, displaying it in the other view.
\ITEM \STYLE{code} <cmnd o> \END Open file dialogue \ITEM \STYLE{code} <cmnd k> \END Interactively kill an open buffer.
\ITEM \STYLE{code} <ctrl o> \END Open file dialogue in other panel \ITEM \STYLE{code} <cmnd i> \END Interactively switch to an open buffer.
\ITEM \STYLE{code} <cmnd k> \END Kill buffer dialogue \ITEM \STYLE{code} <cmnd h> \END Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.
\ITEM \STYLE{code} <cmnd i> \END Switch open buffer dialogue \ITEM \STYLE{code} <cmnd S> \END Saves all buffers marked dirty (showing the '*' indicator).
\ITEM \STYLE{code} <cmnd w> \END 'Save As' - save file into new name \ITEM \STYLE{code} <ctrl c> \END Opens the 4coder colors and fonts selector menu.
\ITEM \STYLE{code} <cmnd h> \END Set hot directory to projet root directory \ITEM \STYLE{code} <ctrl d> \END Opens a debug view for internal use.
\ITEM \STYLE{code} <ctrl .> \END If the special build panel is open, makes the build panel the active panel.
\ITEM \STYLE{code} <ctrl c> \END Open color and font selection GUI \ITEM \STYLE{code} <ctrl ,> \END If the special build panel is open, closes it.
\ITEM \STYLE{code} <ctrl d> \END Open a debug information GUI \ITEM \STYLE{code} <ctrl n> \END description missing
\ITEM \STYLE{code} <ctrl N> \END description missing
\ITEM \STYLE{code} <ctrl .> \END Change to footer build panel \ITEM \STYLE{code} <ctrl M> \END description missing
\ITEM \STYLE{code} <ctrl ,> \END Close footer build panel \ITEM \STYLE{code} <ctrl m> \END 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.
\ITEM \STYLE{code} <ctrl n> \END Goto next error/jump location \ITEM \STYLE{code} <ctrl z> \END Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.
\ITEM \STYLE{code} <ctrl N> \END Goto previous error/jump location \ITEM \STYLE{code} <ctrl Z> \END If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.
\ITEM \STYLE{code} <ctrl M> \END Goto first error/jump location \ITEM \STYLE{code} <ctrl x> \END Execute a 'long form' command.
\ITEM \STYLE{code} <ctrl m> \END Launch basic build (calls build.bat, build.sh, or Makefile) \ITEM \STYLE{code} <ctrl s> \END Sets the current view to show it's scrollbar.
\ITEM \STYLE{code} <ctrl w> \END Sets the current view to hide it's scrollbar.
\ITEM \STYLE{code} <ctrl z> \END Execute arbitrary shell/terminal command in arbitrary buffer \ITEM \STYLE{code} <ctrl b> \END Toggles the visibility status of the current view's filebar.
\ITEM \STYLE{code} <ctrl Z> \END Repeat previous shell/terminal command \ITEM \STYLE{code} <ctrl @> \END Toggles the mouse suppression mode, see suppress_mouse and allow_mouse.
\ITEM \STYLE{code} <cmnd page up> \END Toggle fullscreen mode on or off. The change(s) do not take effect until the next frame.
\ITEM \STYLE{code} <ctrl x> \END Execute "long command" (see long command section) \ITEM \STYLE{code} <ctrl E> \END Attempts to close 4coder.
\ITEM \STYLE{code} <f1> \END 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.
\ITEM \STYLE{code} <ctrl s> \END Show scrollbar \ITEM \STYLE{code} <f2> \END 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.
\ITEM \STYLE{code} <ctrl w> \END Hide scrollbar \ITEM \STYLE{code} <f3> \END 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.
\ITEM \STYLE{code} <ctrl b> \END Toggle filebar \ITEM \STYLE{code} <f4> \END 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.
\ITEM \STYLE{code} <f5> \END 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.
\ITEM \STYLE{code} <ctrl @> \END Toggle mouse input \ITEM \STYLE{code} <f6> \END 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.
\ITEM \STYLE{code} <cmnd page up> \END Toggle fullscreen mode \ITEM \STYLE{code} <f7> \END 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.
\ITEM \STYLE{code} <ctrl E> \END Exit 4coder \ITEM \STYLE{code} <f8> \END 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.
\ITEM \STYLE{code} <f9> \END 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.
\ITEM \STYLE{code} <f1> \END Launch shell command set in a loaded project \ITEM \STYLE{code} <f10> \END 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.
\ITEM \STYLE{code} <f2> \END Launch shell command set in a loaded project \ITEM \STYLE{code} <f11> \END 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.
\ITEM \STYLE{code} <f3> \END Launch shell command set in a loaded project \ITEM \STYLE{code} <f12> \END 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.
\ITEM \STYLE{code} <f4> \END Launch shell command set in a loaded project \ITEM \STYLE{code} <f13> \END 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.
\ITEM \STYLE{code} <f14> \END 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.
\ITEM \STYLE{code} <f5> \END Launch shell command set in a loaded project \ITEM \STYLE{code} <f15> \END 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.
\ITEM \STYLE{code} <f6> \END Launch shell command set in a loaded project \ITEM \STYLE{code} <f16> \END 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.
\ITEM \STYLE{code} <f7> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f8> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f9> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f10> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f11> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f12> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f13> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f14> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f15> \END Launch shell command set in a loaded project
\ITEM \STYLE{code} <f16> \END Launch shell command set in a loaded project
\END
\END \END
\SECTION{Text File}
The following bindings apply in general text files and most apply in code files, but some are overriden by other commands.
\LIST
\ITEM \STYLE{code} <any character> \END Insert character
\ITEM \STYLE{code} <left click> \END Set cursor position to mouse position
\ITEM \STYLE{code} <left release> \END Set mark position to mouse position
\ITEM \STYLE{code} <right click> \END Set mark position to mouse position
\ITEM \STYLE{code} <left> \END Move left
\ITEM \STYLE{code} <right> \END Move right
\ITEM \STYLE{code} <del> \END Delete character
\ITEM \STYLE{code} <shift del> \END Delete character
\ITEM \STYLE{code} <back> \END Backspace character
\ITEM \STYLE{code} <shift back> \END Backspace character
\ITEM \STYLE{code} <up> \END Move up
\ITEM \STYLE{code} <down> \END Move up
\ITEM \STYLE{code} <end> \END Move to end of line
\ITEM \STYLE{code} <home> \END Move to beginning of line
\ITEM \STYLE{code} <page up> \END Move up one whole page
\ITEM \STYLE{code} <page down> \END Move down one whole page
\ITEM \STYLE{code} <cmnd right> \END Seek right, stop at whitespace
\ITEM \STYLE{code} <cmnd left> \END Seek left, stop at whitespace
\ITEM \STYLE{code} <cmnd up> \END Seek up, stop at blank line
\ITEM \STYLE{code} <cmnd down> \END Seek down, stop at blank line
\ITEM \STYLE{code} <alt up> \END Move up ten lines
\ITEM \STYLE{code} <alt down> \END Move down ten lines
\ITEM \STYLE{code} <cmnd back> \END Delete word backwards
\ITEM \STYLE{code} <cmnd del> \END Delete word forwards
\ITEM \STYLE{code} <ctrl back> \END Snipe token (or word) left
\ITEM \STYLE{code} <ctrl del> \END Snipe token (or word) right
\ITEM Note: 'the range' in the following commands refers to the text between the mark and cursor.
\ITEM \STYLE{code} <cmnd /> \END Set mark to the cursor position
\ITEM \STYLE{code} <cmnd a> \END Replace a substring in the range
\ITEM \STYLE{code} <cmnd c> \END Copy text from the range
\ITEM \STYLE{code} <cmnd d> \END Delete the text in the range
\ITEM \STYLE{code} <cmnd e> \END Center the active view on the cursor
\ITEM \STYLE{code} <cmnd E> \END Move the view so that it's left edge is near the cursor's current x position
\ITEM \STYLE{code} <cmnd f> \END Begin an incremental search through the current buffer
\ITEM \STYLE{code} <cmnd F> \END Create a jump location list of all loaded exact matches of a string
\ITEM \STYLE{code} <ctrl F> \END Create a jump location list of all loaded substring matches of a string without case sensitivity
\ITEM \STYLE{code} <cmnd g> \END Goto a specific line number
\ITEM \STYLE{code} <cmnd j> \END Convert text in the range to lowercase
\ITEM \STYLE{code} <cmnd K> \END Kill the current buffer
\ITEM \STYLE{code} <cmnd l> \END Toggle line wrapping on the current buffer
\ITEM \STYLE{code} <cmnd m> \END Swap the cursor and mark positions
\ITEM \STYLE{code} <cmnd O> \END Reload the current buffer from the file system
\ITEM \STYLE{code} <cmnd q> \END Begin an iterative query replace
\ITEM \STYLE{code} <cmnd Q> \END Begin an iterative query replace to replace the word under the cursor
\ITEM \STYLE{code} <cmnd r> \END Begin a reversed incremental search through the current buffer
\ITEM \STYLE{code} <cmnd s> \END Save the current buffer with it's given filename
\ITEM \STYLE{code} <cmnd t> \END Begin an incremenal search through the current buffer for the word under the cursor
\ITEM \STYLE{code} <cmnd T> \END Create a jump location list of all loaded exact matches of the word under the cursor
\ITEM \STYLE{code} <cmnd u> \END Convert text in the range to uppercase
\ITEM \STYLE{code} <cmnd v> \END Paste from the clipboard
\ITEM \STYLE{code} <ctrl v> \END Toggle the virtual whitespace system
\ITEM \STYLE{code} <cmnd V> \END Paste the next item on the clipboard, 4coder keeps a finite history of past 64 copies
\ITEM \STYLE{code} <cmnd x> \END Copy text from the range and delete the range (aka cut)
\ITEM \STYLE{code} <cmnd y> \END Redo
\ITEM \STYLE{code} <cmnd z> \END Undo
\ITEM \STYLE{code} <cmnd 2> \END Decrease the line wrap width for the current buffer
\ITEM \STYLE{code} <cmnd 3> \END Increase the line wrap width for the current buffer
\ITEM \STYLE{code} <cmnd ?> \END Toggle the show whitespace option
\ITEM \STYLE{code} <cmnd ~> \END Clean trailing whitespace from all lines
\ITEM \STYLE{code} <return> \END Interpret jump location under cursor and jump to it, lock the next/prev jump commands to this jump location list (only in read only files)
\ITEM \STYLE{code} <shift return> \END Like previous command but tries to open the jump location in the view that currently holds the jump location list
\END
\END \END
\SECTION{mapid-file}
\SECTION{Code File} TODO
The following commands only apply in C/C++ files where the lexer (syntax highlighting) is turned on. \LIST
\LIST \ITEM \STYLE{code} <any character> \END Inserts whatever character was used to trigger this command.
\ITEM \STYLE{code} <alt any character> \END Inserts whatever character was used to trigger this command.
\ITEM \STYLE{code} <cmnd right> \END Seek right stop at alphanumeric or camel case \ITEM \STYLE{code} <left click> \END Sets the cursor position to the mouse position.
\ITEM \STYLE{code} <cmnd left> \END Seek left stop at alphanumeric or camel case \ITEM \STYLE{code} <left release> \END Sets the mark position to the mouse position.
\ITEM \STYLE{code} <right click> \END Sets the mark position to the mouse position.
\ITEM \STYLE{code} <}> \END Insert character and trigger auto indentation \ITEM \STYLE{code} <left> \END Moves the cursor one character to the left.
\ITEM \STYLE{code} <)> \END Insert character and trigger auto indentation \ITEM \STYLE{code} <right> \END Moves the cursor one character to the right.
\ITEM \STYLE{code} <]> \END Insert character and trigger auto indentation \ITEM \STYLE{code} <delete> \END Deletes the character to the right of the cursor.
\ITEM \STYLE{code} <;> \END Insert character and trigger auto indentation \ITEM \STYLE{code} <shift delete> \END Deletes the character to the right of the cursor.
\ITEM \STYLE{code} <#> \END Insert character and trigger auto indentation \ITEM \STYLE{code} <backspace> \END Deletes the character to the left of the cursor.
\ITEM \STYLE{code} <shift backspace> \END Deletes the character to the left of the cursor.
\ITEM \STYLE{code} <tab> \END Automatically complete partial word \ITEM \STYLE{code} <up> \END Moves the cursor up one line.
\ITEM \STYLE{code} <cmnd tab> \END Auto indent the range \ITEM \STYLE{code} <down> \END Moves the cursor down one line.
\ITEM \STYLE{code} <shift tab> \END Auto indent the line at the cursor \ITEM \STYLE{code} <end> \END Seeks the cursor to the end of the visual line.
\ITEM \STYLE{code} <home> \END Seeks the cursor to the beginning of the visual line.
\ITEM \STYLE{code} <ctrl h> \END Insert a HACK comment \ITEM \STYLE{code} <page up> \END Scrolls the view up one view height and moves the cursor up one view height.
\ITEM \STYLE{code} <ctrl r> \END Insert a block comment \ITEM \STYLE{code} <page down> \END Scrolls the view down one view height and moves the cursor down one view height.
\ITEM \STYLE{code} <ctrl t> \END Insert a TODO comment \ITEM \STYLE{code} <cmnd right> \END Seek right for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <ctrl y> \END Insert a NOTE comment \ITEM \STYLE{code} <cmnd left> \END Seek left for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <cmnd [> \END Open a pair of braces \ITEM \STYLE{code} <cmnd up> \END Seeks the cursor up to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <cmnd {> \END Open a pair of braces ended with a semicolon \ITEM \STYLE{code} <cmnd down> \END Seeks the cursor down to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <cmnd }> \END Open a pair of braces ended with a break \ITEM \STYLE{code} <cmnd backspace> \END Delete characters between the cursor position and the first alphanumeric boundary to the left.
\ITEM \STYLE{code} <ctrl i> \END Surround the range with #if 0 and #endif \ITEM \STYLE{code} <cmnd delete> \END Delete characters between the cursor position and the first alphanumeric boundary to the right.
\ITEM \STYLE{code} <ctrl 1> \END Try to open a file named by the string surrounded by quotes under the cursor \ITEM \STYLE{code} <ctrl backspace> \END Delete a single, whole token on or to the left of the cursor.
\ITEM \STYLE{code} <ctrl 2> \END Switch from .cpp \STYLE{code} <-> \END .h \ITEM \STYLE{code} <ctrl delete> \END Delete a single, whole token on or to the right of the cursor.
\ITEM \STYLE{code} <cmnd 0> \END Insert the characters " = {0};" \ITEM \STYLE{code} <cmnd /> \END Sets the mark to the current position of the cursor.
\ITEM \STYLE{code} <cmnd I> \END List all function signatures in the current buffer \ITEM \STYLE{code} <cmnd a> \END 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.
\ITEM \STYLE{code} <cmnd c> \END Copy the text in the range from the cursor to the mark onto the clipboard.
\END \ITEM \STYLE{code} <cmnd d> \END Deletes the text in the range between the cursor and the mark.
\ITEM \STYLE{code} <cmnd e> \END Centers the view vertically on the line on which the cursor sits.
\ITEM \STYLE{code} <cmnd E> \END Sets the left size of the view near the x position of the cursor.
\ITEM \STYLE{code} <cmnd f> \END Begins an incremental search down through the current buffer for a user specified string.
\ITEM \STYLE{code} <cmnd F> \END Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.
\ITEM \STYLE{code} <ctrl F> \END Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.
\ITEM \STYLE{code} <cmnd g> \END Queries the user for a number, and jumps the cursor to the corresponding line.
\ITEM \STYLE{code} <cmnd j> \END Converts all ascii text in the range between the cursor and the mark to lowercase.
\ITEM \STYLE{code} <cmnd K> \END Kills the current buffer.
\ITEM \STYLE{code} <cmnd l> \END Toggles the current buffer's line wrapping status.
\ITEM \STYLE{code} <cmnd m> \END Swaps the position of the cursor and the mark.
\ITEM \STYLE{code} <cmnd O> \END Reopen the current buffer from the hard drive.
\ITEM \STYLE{code} <cmnd q> \END Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.
\ITEM \STYLE{code} <cmnd Q> \END Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.
\ITEM \STYLE{code} <cmnd r> \END Begins an incremental search up through the current buffer for a user specified string.
\ITEM \STYLE{code} <cmnd s> \END Saves the current buffer.
\ITEM \STYLE{code} <cmnd t> \END Begins an incremental search down through the current buffer for the word or token under the cursor.
\ITEM \STYLE{code} <cmnd T> \END Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.
\ITEM \STYLE{code} <cmnd u> \END Converts all ascii text in the range between the cursor and the mark to uppercase.
\ITEM \STYLE{code} <cmnd v> \END Paste from the top of clipboard and run auto-indent on the newly pasted text.
\ITEM \STYLE{code} <ctrl v> \END Toggles the current buffer's virtual whitespace status.
\ITEM \STYLE{code} <cmnd V> \END Paste the next item on the clipboard and run auto-indent on the newly pasted text.
\ITEM \STYLE{code} <cmnd x> \END Cut the text in the range from the cursor to the mark onto the clipboard.
\ITEM \STYLE{code} <cmnd y> \END Advances forewards through the undo history.
\ITEM \STYLE{code} <cmnd z> \END Advances backwards through the undo history.
\ITEM \STYLE{code} <cmnd 2> \END Decrases the current buffer's width for line wrapping.
\ITEM \STYLE{code} <cmnd 3> \END Increases the current buffer's width for line wrapping.
\ITEM \STYLE{code} <cmnd ?> \END Toggles the current buffer's whitespace visibility status.
\ITEM \STYLE{code} <cmnd ~> \END Removes trailing whitespace from all lines in the current buffer.
\ITEM \STYLE{code} <return> \END description missing
\ITEM \STYLE{code} <shift return> \END description missing
\ITEM \STYLE{code} <shift > \END Inserts whatever character was used to trigger this command.
\END
\END
\SECTION{default-code-map}
TODO
\LIST
\ITEM \STYLE{code} <cmnd right> \END Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.
\ITEM \STYLE{code} <cmnd left> \END Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.
\ITEM \STYLE{code} <return> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <shift return> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <}> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <)> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <]> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <;> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <#> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <tab> \END Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.
\ITEM \STYLE{code} <cmnd tab> \END Auto-indents the range between the cursor and the mark.
\ITEM \STYLE{code} <shift tab> \END Auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <ctrl h> \END At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.
\ITEM \STYLE{code} <ctrl r> \END At the cursor, insert a block comment.
\ITEM \STYLE{code} <ctrl t> \END At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.
\ITEM \STYLE{code} <ctrl y> \END At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.
\ITEM \STYLE{code} <cmnd [> \END At the cursor, insert a '{' and '}' separated by a blank line.
\ITEM \STYLE{code} <cmnd {> \END At the cursor, insert a '{' and '};' separated by a blank line.
\ITEM \STYLE{code} <cmnd }> \END At the cursor, insert a '{' and '}break;' separated by a blank line.
\ITEM \STYLE{code} <ctrl i> \END Surround the range between the cursor and mark with an '#if 0' and an '#endif'
\ITEM \STYLE{code} <ctrl 1> \END Reads a filename from surrounding '"' characters and attempts to open the corresponding file.
\ITEM \STYLE{code} <ctrl 2> \END If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.
\ITEM \STYLE{code} <cmnd 0> \END At the cursor, insert a ' = {0};'.
\ITEM \STYLE{code} <cmnd I> \END Creates a jump list of lines of the current buffer that appear to define or declare functions.
\END
\END \END
\END \END