Setup basics for visible markers, fixed some stability issues

This commit is contained in:
Allen Webster 2018-09-17 11:47:06 -07:00
parent 2c20e18a8d
commit c625620950
21 changed files with 635 additions and 424 deletions

View File

@ -578,7 +578,7 @@ STRUCT Buffer_Summary{
bool32 ready;
/* DOC(If this is not a null summary this field is the id of the associated buffer. If this is a null summary then buffer_id is 0.) */
int32_t buffer_id;
/*DOC(If this is not a null summary, this field contains flags describing the protection status of the buffer.)*/
/* DOC(If this is not a null summary, this field contains flags describing the protection status of the buffer.) */
Access_Flag lock_flags;
/* DOC(If this is not a null summary, this field specifies the number of bytes in the buffer.) */
@ -609,6 +609,11 @@ STRUCT Buffer_Summary{
bool32 unwrapped_lines;
};
ENUM(int32_t, Marker_Type){
MarkerType_Standard = 0,
MarkerType_Pair = 1,
};
/*
DOC(A markers is a location in a buffer that, once placed, is effected by edits the same way characters are effected. In particular if an edit occurs in a location in the buffer before a marker, the marker is shifted forward or backward so that it remains on the same character.)
DOC_SEE(buffer_add_markers)
@ -620,6 +625,13 @@ STRUCT Marker{
bool32 lean_right;
};
STRUCT Marker_Pair{
int32_t pos1;
bool32 lean_right1;
int32_t pos2;
bool32 lean_right2;
};
/*
DOC(A four corner axis aligned rectangle, with integer coordinates.)
*/
@ -868,10 +880,10 @@ TYPEDEF void Custom_Command_Function(struct Application_Links *app);
/* DOC(Generic_Command acts as a name for a command, and can name an internal command or a custom command.) */
UNION Generic_Command{
/*DOC(If this Generic_Command represents an internal command the cmdid field will have a value less than cmdid_count, and this field is the command id for the command.)*/
/* DOC(If this Generic_Command represents an internal command the cmdid field will have a value less than cmdid_count, and this field is the command id for the command.) */
Command_ID cmdid;
/*DOC(If this Generic_Command does not represent an internal command the command
field is the pointer to the custom command..)*/
/* DOC(If this Generic_Command does not represent an internal command the command
field is the pointer to the custom command..) */
Custom_Command_Function *command;
};

View File

@ -1,6 +1,5 @@
/*
4coder_combined_write_commands.cpp - Commands for writing text specialized for particular
contexts.
4coder_combined_write_commands.cpp - Commands for writing text specialized for particular contexts.
*/
// TOP
@ -115,5 +114,90 @@ CUSTOM_DOC("At the cursor, insert a ' = {0};'.")
write_string(app, make_lit_string(" = {0};"));
}
////////////////////////////////
static Snippet snippets[] = {
// general (for Allen's style)
{"if", "if (){\n\n}\n", 4, 7},
{"ifelse", "if (){\n\n}\nelse{\n\n}", 4, 7},
{"forn", "for (;\nnode != 0;\nnode = node->next){\n\n}\n", 5, 38},
{"fori", "for (i = 0; i < ; i += 1){\n\n}\n", 5, 16},
{"for", "for (;;){\n\n}\n", 5, 10},
{"case", "case :\n{\n\n}break;\n", 5, 9},
{"///", "////////////////////////////////", 32, 32},
{"#guard", "#if !defined(Z)\n#define Z\n#endif\n", 0, 26},
{"space", "char space[256];", 0, 14},
{"op+", "Z\noperator+(Z a, Z b){\n,\n}\n", 0, 23},
{"op-", "Z\noperator-(Z a, Z b){\n,\n}\n", 0, 23},
{"op*", "Z\noperator*(Z a, Z b){\n,\n}\n", 0, 23},
{"op/", "Z\noperator/(Z a, Z b){\n,\n}\n", 0, 23},
{"op+=", "Z&\noperator+=(Z &a, Z b){\n,\n}\n", 0, 26},
{"op-=", "Z&\noperator-=(Z &a, Z b){\n,\n}\n", 0, 26},
{"op*=", "Z&\noperator*=(Z &a, Z b){\n,\n}\n", 0, 26},
{"op/=", "Z&\noperator/=(Z &a, Z b){\n,\n}\n", 0, 26},
// for 4coder development
{"4command", "CUSTOM_COMMAND_SIG()\nCUSTOM_DOC()\n{\n\n}\n", 19, 32},
{"4app", "Application_Links *app", 22, 22},
#if defined(SNIPPET_EXPANSION)
#include SNIPPET_EXPANSION
#endif
};
static void
activate_snippet(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, struct Lister_State *state,
String text_field, void *user_data, bool32 activated_by_mouse){
int32_t index = (int32_t)PtrAsInt(user_data);
Snippet_Array snippets = *(Snippet_Array*)state->lister.user_data;
if (0 <= index && index < snippets.count){
Snippet snippet = snippets.snippets[index];
lister_default(app, scratch, heap, view, state, ListerActivation_Finished);
Buffer_Summary buffer = get_buffer(app, view->buffer_id, AccessOpen);
int32_t pos = view->cursor.pos;
int32_t len = str_size(snippet.text);
buffer_replace_range(app, &buffer, pos, pos, snippet.text, len);
view_set_cursor(app, view, seek_pos(pos + snippet.cursor_offset), true);
view_set_mark(app, view, seek_pos(pos + snippet.mark_offset));
}
else{
lister_default(app, scratch, heap, view, state, ListerActivation_Finished);
}
}
static void
snippet_lister__parameterized(Application_Links *app, Snippet_Array snippet_array){
Partition *arena = &global_part;
View_Summary view = get_active_view(app, AccessAll);
view_end_ui_mode(app, &view);
Temp_Memory temp = begin_temp_memory(arena);
int32_t option_count = snippet_array.count;
Lister_Option *options = push_array(arena, Lister_Option, option_count);
for (int32_t i = 0; i < snippet_array.count; i += 1){
options[i].string = snippet_array.snippets[i].name;
options[i].status = snippet_array.snippets[i].text;
options[i].user_data = IntAsPtr(i);
}
begin_integrated_lister__basic_list(app, "Snippet:", activate_snippet,
&snippet_array, sizeof(snippet_array),
options, option_count,
0,
&view);
end_temp_memory(temp);
}
CUSTOM_COMMAND_SIG(snippet_lister)
CUSTOM_DOC("Opens a snippet lister for inserting whole pre-written snippets of text.")
{
Snippet_Array snippet_array = {0};
snippet_array.snippets = snippets;
snippet_array.count = ArrayCount(snippets);
snippet_lister__parameterized(app, snippet_array);
}
// BOTTOM

View File

@ -0,0 +1,20 @@
/*
4coder_combined_write_commands.cpp - Commands for writing text specialized for particular contexts.
*/
// TOP
struct Snippet{
char *name;
char *text;
int32_t cursor_offset;
int32_t mark_offset;
};
struct Snippet_Array{
Snippet *snippets;
int32_t count;
};
// BOTTOM

View File

@ -39,6 +39,7 @@
#include "4coder_project_commands.h"
#include "4coder_function_list.h"
#include "4coder_scope_commands.h"
#include "4coder_combined_write_commands.h"
#include "4coder_default_framework_variables.cpp"
#include "4coder_buffer_seek_constructors.cpp"

View File

@ -2,7 +2,7 @@
#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 206
#define command_one_past_last_id 208
#if defined(CUSTOM_COMMAND_SIG)
#define PROC_LINKS(x,y) x
#else
@ -143,6 +143,7 @@ CUSTOM_COMMAND_SIG(paste_and_indent);
CUSTOM_COMMAND_SIG(paste_next);
CUSTOM_COMMAND_SIG(paste_next_and_indent);
CUSTOM_COMMAND_SIG(place_in_scope);
CUSTOM_COMMAND_SIG(project_command_lister);
CUSTOM_COMMAND_SIG(project_fkey_command);
CUSTOM_COMMAND_SIG(project_go_to_root_directory);
CUSTOM_COMMAND_SIG(query_replace);
@ -193,6 +194,7 @@ CUSTOM_COMMAND_SIG(show_filebar);
CUSTOM_COMMAND_SIG(show_scrollbar);
CUSTOM_COMMAND_SIG(snipe_token_or_word);
CUSTOM_COMMAND_SIG(snipe_token_or_word_right);
CUSTOM_COMMAND_SIG(snippet_lister);
CUSTOM_COMMAND_SIG(suppress_mouse);
CUSTOM_COMMAND_SIG(swap_buffers_between_panels);
CUSTOM_COMMAND_SIG(to_lowercase);
@ -226,7 +228,7 @@ char *source_name;
int32_t source_name_len;
int32_t line_number;
};
static Command_Metadata fcoder_metacmd_table[206] = {
static Command_Metadata fcoder_metacmd_table[208] = {
{ PROC_LINKS(allow_mouse, 0), "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 240 },
{ PROC_LINKS(auto_tab_line_at_cursor, 0), "auto_tab_line_at_cursor", 23, "Auto-indents the line on which the cursor sits.", 47, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 722 },
{ PROC_LINKS(auto_tab_range, 0), "auto_tab_range", 14, "Auto-indents the range between the cursor and the mark.", 55, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 733 },
@ -243,10 +245,10 @@ static Command_Metadata fcoder_metacmd_table[206] = {
{ PROC_LINKS(clean_all_lines, 0), "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 374 },
{ PROC_LINKS(click_set_cursor, 0), "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 180 },
{ PROC_LINKS(click_set_mark, 0), "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 193 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1048 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1060 },
{ PROC_LINKS(close_build_panel, 0), "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "w:\\4ed\\code\\4coder_build_commands.cpp", 37, 203 },
{ PROC_LINKS(close_panel, 0), "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 447 },
{ PROC_LINKS(command_lister, 0), "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "w:\\4ed\\code\\4coder_lists.cpp", 28, 929 },
{ PROC_LINKS(command_lister, 0), "command_lister", 14, "Opens an interactive list of all registered commands.", 53, "w:\\4ed\\code\\4coder_lists.cpp", 28, 935 },
{ PROC_LINKS(copy, 0), "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "w:\\4ed\\code\\4coder_clipboard.cpp", 32, 26 },
{ PROC_LINKS(cursor_mark_swap, 0), "cursor_mark_swap", 16, "Swaps the position of the cursor and the mark.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 101 },
{ PROC_LINKS(cut, 0), "cut", 3, "Cut the text in the range from the cursor to the mark onto the clipboard.", 73, "w:\\4ed\\code\\4coder_clipboard.cpp", 32, 35 },
@ -287,14 +289,14 @@ static Command_Metadata fcoder_metacmd_table[206] = {
{ 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, "w:\\4ed\\code\\4coder_scope_commands.cpp", 37, 363 },
{ 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, "w:\\4ed\\code\\4coder_scope_commands.cpp", 37, 382 },
{ 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, "w:\\4ed\\code\\4coder_scope_commands.cpp", 37, 341 },
{ PROC_LINKS(if0_off, 0), "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 82 },
{ PROC_LINKS(if0_off, 0), "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 81 },
{ PROC_LINKS(increase_face_size, 0), "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 525 },
{ PROC_LINKS(increase_line_wrap, 0), "increase_line_wrap", 18, "Increases the current buffer's width for line wrapping.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 503 },
{ PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\4coder_lists.cpp", 28, 746 },
{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\4coder_lists.cpp", 28, 848 },
{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\4coder_lists.cpp", 28, 875 },
{ PROC_LINKS(interactive_open_or_new, 0), "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "w:\\4ed\\code\\4coder_lists.cpp", 28, 815 },
{ PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\4coder_lists.cpp", 28, 728 },
{ PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\4coder_lists.cpp", 28, 749 },
{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\4coder_lists.cpp", 28, 853 },
{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\4coder_lists.cpp", 28, 881 },
{ PROC_LINKS(interactive_open_or_new, 0), "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "w:\\4ed\\code\\4coder_lists.cpp", 28, 819 },
{ PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\4coder_lists.cpp", 28, 730 },
{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1450 },
{ 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, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 141 },
{ PROC_LINKS(list_all_functions_all_buffers, 0), "list_all_functions_all_buffers", 30, "Creates a jump list of lines from all buffers that appear to define or declare functions.", 89, "w:\\4ed\\code\\4coder_function_list.cpp", 36, 358 },
@ -328,7 +330,7 @@ static Command_Metadata fcoder_metacmd_table[206] = {
{ PROC_LINKS(lister__write_character__default, 0), "lister__write_character__default", 32, "A lister mode command that inserts a new character to the text field.", 69, "w:\\4ed\\code\\4coder_lists.cpp", 28, 126 },
{ PROC_LINKS(lister__write_character__file_path, 0), "lister__write_character__file_path", 34, "A lister mode command that inserts a character into the text field of a file system list.", 89, "w:\\4ed\\code\\4coder_lists.cpp", 28, 193 },
{ PROC_LINKS(lister__write_character__fixed_list, 0), "lister__write_character__fixed_list", 35, "A lister mode command that handles input for the fixed sure to kill list.", 73, "w:\\4ed\\code\\4coder_lists.cpp", 28, 253 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1071 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1083 },
{ PROC_LINKS(make_directory_query, 0), "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1138 },
{ PROC_LINKS(move_down, 0), "move_down", 9, "Moves the cursor down one line.", 31, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 256 },
{ PROC_LINKS(move_down_10, 0), "move_down_10", 12, "Moves the cursor down ten lines.", 32, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 268 },
@ -343,14 +345,14 @@ static Command_Metadata fcoder_metacmd_table[206] = {
{ 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, "w:\\4ed\\code\\4coder_jump_direct.cpp", 34, 116 },
{ 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, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 34, 562 },
{ 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, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 34, 547 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1055 },
{ PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1062 },
{ PROC_LINKS(open_color_tweaker, 0), "open_color_tweaker", 18, "Opens the 4coder theme selector list.", 37, "w:\\4ed\\code\\4coder_lists.cpp", 28, 891 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1067 },
{ PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1074 },
{ PROC_LINKS(open_color_tweaker, 0), "open_color_tweaker", 18, "Opens the 4coder theme selector list.", 37, "w:\\4ed\\code\\4coder_lists.cpp", 28, 897 },
{ 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, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1357 },
{ PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1508 },
{ PROC_LINKS(open_long_braces, 0), "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 58 },
{ 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, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 74 },
{ PROC_LINKS(open_long_braces_semicolon, 0), "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 66 },
{ PROC_LINKS(open_long_braces, 0), "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 57 },
{ 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, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 73 },
{ PROC_LINKS(open_long_braces_semicolon, 0), "open_long_braces_semicolon", 26, "At the cursor, insert a '{' and '};' separated by a blank line.", 63, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 65 },
{ 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, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1393 },
{ PROC_LINKS(open_panel_hsplit, 0), "open_panel_hsplit", 17, "Create a new panel by horizontally splitting the active panel.", 62, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 173 },
{ PROC_LINKS(open_panel_vsplit, 0), "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 164 },
@ -361,8 +363,9 @@ static Command_Metadata fcoder_metacmd_table[206] = {
{ 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, "w:\\4ed\\code\\4coder_clipboard.cpp", 32, 83 },
{ 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, "w:\\4ed\\code\\4coder_clipboard.cpp", 32, 138 },
{ 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, "w:\\4ed\\code\\4coder_scope_commands.cpp", 37, 481 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1078 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1103 },
{ PROC_LINKS(project_command_lister, 0), "project_command_lister", 22, "Open a lister of all commands in the currently loaded project.", 62, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1529 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1090 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1115 },
{ 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, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 918 },
{ 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, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 938 },
{ PROC_LINKS(query_replace_selection, 0), "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 956 },
@ -403,14 +406,15 @@ static Command_Metadata fcoder_metacmd_table[206] = {
{ PROC_LINKS(set_bindings_default, 0), "set_bindings_default", 20, "Remap keybindings using the 'default' mapping rule.", 51, "w:\\4ed\\code\\4coder_remapping_commands.cpp", 41, 61 },
{ PROC_LINKS(set_bindings_mac_default, 0), "set_bindings_mac_default", 24, "Remap keybindings using the 'mac-default' mapping rule.", 55, "w:\\4ed\\code\\4coder_remapping_commands.cpp", 41, 75 },
{ PROC_LINKS(set_mark, 0), "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 92 },
{ PROC_LINKS(setup_build_bat, 0), "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1488 },
{ PROC_LINKS(setup_build_bat_and_sh, 0), "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1500 },
{ PROC_LINKS(setup_build_sh, 0), "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1494 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1481 },
{ PROC_LINKS(setup_build_bat, 0), "setup_build_bat", 15, "Queries the user for several configuration options and initializes a new build batch script.", 92, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1500 },
{ PROC_LINKS(setup_build_bat_and_sh, 0), "setup_build_bat_and_sh", 22, "Queries the user for several configuration options and initializes a new build batch script.", 92, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1512 },
{ PROC_LINKS(setup_build_sh, 0), "setup_build_sh", 14, "Queries the user for several configuration options and initializes a new build shell script.", 92, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1506 },
{ 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, "w:\\4ed\\code\\4coder_project_commands.cpp", 39, 1493 },
{ PROC_LINKS(show_filebar, 0), "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 470 },
{ PROC_LINKS(show_scrollbar, 0), "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 456 },
{ PROC_LINKS(snipe_token_or_word, 0), "snipe_token_or_word", 19, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "w:\\4ed\\code\\4coder_seek.cpp", 27, 1259 },
{ PROC_LINKS(snipe_token_or_word_right, 0), "snipe_token_or_word_right", 25, "Delete a single, whole token on or to the right of the cursor and post it to the clipboard.", 91, "w:\\4ed\\code\\4coder_seek.cpp", 27, 1265 },
{ PROC_LINKS(snippet_lister, 0), "snippet_lister", 14, "Opens a snippet lister for inserting whole pre-written snippets of text.", 72, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 193 },
{ PROC_LINKS(suppress_mouse, 0), "suppress_mouse", 14, "Hides the mouse and causes all mosue input (clicks, position, wheel) to be ignored.", 83, "w:\\4ed\\code\\4coder_default_framework.cpp", 40, 234 },
{ PROC_LINKS(swap_buffers_between_panels, 0), "swap_buffers_between_panels", 27, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1417 },
{ PROC_LINKS(to_lowercase, 0), "to_lowercase", 12, "Converts all ascii text in the range between the cursor and the mark to lowercase.", 82, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 354 },
@ -423,16 +427,16 @@ static Command_Metadata fcoder_metacmd_table[206] = {
{ PROC_LINKS(toggle_virtual_whitespace, 0), "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 549 },
{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1459 },
{ PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 1407 },
{ PROC_LINKS(view_jump_list_with_lister, 0), "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "w:\\4ed\\code\\4coder_jump_lister.cpp", 34, 109 },
{ PROC_LINKS(view_jump_list_with_lister, 0), "view_jump_list_with_lister", 26, "When executed on a buffer with jumps, creates a persistent lister for all the jumps", 83, "w:\\4ed\\code\\4coder_jump_lister.cpp", 34, 108 },
{ 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, "w:\\4ed\\code\\4coder_search.cpp", 29, 856 },
{ 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, "w:\\4ed\\code\\4coder_auto_indent.cpp", 34, 745 },
{ PROC_LINKS(write_block, 0), "write_block", 11, "At the cursor, insert a block comment.", 38, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 106 },
{ PROC_LINKS(write_block, 0), "write_block", 11, "At the cursor, insert a block comment.", 38, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 105 },
{ PROC_LINKS(write_character, 0), "write_character", 15, "Inserts whatever character was used to trigger this command.", 60, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 39 },
{ 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, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 94 },
{ 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, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 100 },
{ 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, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 88 },
{ 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, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 93 },
{ 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, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 99 },
{ 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, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 87 },
{ PROC_LINKS(write_underscore, 0), "write_underscore", 16, "Inserts an underscore.", 22, "w:\\4ed\\code\\4coder_base_commands.cpp", 36, 48 },
{ PROC_LINKS(write_zero_struct, 0), "write_zero_struct", 17, "At the cursor, insert a ' = {0};'.", 34, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 112 },
{ PROC_LINKS(write_zero_struct, 0), "write_zero_struct", 17, "At the cursor, insert a ' = {0};'.", 34, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 46, 111 },
};
static int32_t fcoder_metacmd_ID_allow_mouse = 0;
static int32_t fcoder_metacmd_ID_auto_tab_line_at_cursor = 1;
@ -568,76 +572,78 @@ static int32_t fcoder_metacmd_ID_paste_and_indent = 130;
static int32_t fcoder_metacmd_ID_paste_next = 131;
static int32_t fcoder_metacmd_ID_paste_next_and_indent = 132;
static int32_t fcoder_metacmd_ID_place_in_scope = 133;
static int32_t fcoder_metacmd_ID_project_fkey_command = 134;
static int32_t fcoder_metacmd_ID_project_go_to_root_directory = 135;
static int32_t fcoder_metacmd_ID_query_replace = 136;
static int32_t fcoder_metacmd_ID_query_replace_identifier = 137;
static int32_t fcoder_metacmd_ID_query_replace_selection = 138;
static int32_t fcoder_metacmd_ID_redo = 139;
static int32_t fcoder_metacmd_ID_reload_themes = 140;
static int32_t fcoder_metacmd_ID_remap_interactive = 141;
static int32_t fcoder_metacmd_ID_rename_file_query = 142;
static int32_t fcoder_metacmd_ID_reopen = 143;
static int32_t fcoder_metacmd_ID_replace_in_range = 144;
static int32_t fcoder_metacmd_ID_reverse_search = 145;
static int32_t fcoder_metacmd_ID_reverse_search_identifier = 146;
static int32_t fcoder_metacmd_ID_save = 147;
static int32_t fcoder_metacmd_ID_save_all_dirty_buffers = 148;
static int32_t fcoder_metacmd_ID_save_to_query = 149;
static int32_t fcoder_metacmd_ID_scope_absorb_down = 150;
static int32_t fcoder_metacmd_ID_search = 151;
static int32_t fcoder_metacmd_ID_search_identifier = 152;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_left = 153;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_left = 154;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_right = 155;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_right = 156;
static int32_t fcoder_metacmd_ID_seek_beginning_of_line = 157;
static int32_t fcoder_metacmd_ID_seek_beginning_of_textual_line = 158;
static int32_t fcoder_metacmd_ID_seek_end_of_line = 159;
static int32_t fcoder_metacmd_ID_seek_end_of_textual_line = 160;
static int32_t fcoder_metacmd_ID_seek_token_left = 161;
static int32_t fcoder_metacmd_ID_seek_token_right = 162;
static int32_t fcoder_metacmd_ID_seek_white_or_token_left = 163;
static int32_t fcoder_metacmd_ID_seek_white_or_token_right = 164;
static int32_t fcoder_metacmd_ID_seek_whitespace_down = 165;
static int32_t fcoder_metacmd_ID_seek_whitespace_down_end_line = 166;
static int32_t fcoder_metacmd_ID_seek_whitespace_left = 167;
static int32_t fcoder_metacmd_ID_seek_whitespace_right = 168;
static int32_t fcoder_metacmd_ID_seek_whitespace_up = 169;
static int32_t fcoder_metacmd_ID_seek_whitespace_up_end_line = 170;
static int32_t fcoder_metacmd_ID_select_all = 171;
static int32_t fcoder_metacmd_ID_set_bindings_choose = 172;
static int32_t fcoder_metacmd_ID_set_bindings_default = 173;
static int32_t fcoder_metacmd_ID_set_bindings_mac_default = 174;
static int32_t fcoder_metacmd_ID_set_mark = 175;
static int32_t fcoder_metacmd_ID_setup_build_bat = 176;
static int32_t fcoder_metacmd_ID_setup_build_bat_and_sh = 177;
static int32_t fcoder_metacmd_ID_setup_build_sh = 178;
static int32_t fcoder_metacmd_ID_setup_new_project = 179;
static int32_t fcoder_metacmd_ID_show_filebar = 180;
static int32_t fcoder_metacmd_ID_show_scrollbar = 181;
static int32_t fcoder_metacmd_ID_snipe_token_or_word = 182;
static int32_t fcoder_metacmd_ID_snipe_token_or_word_right = 183;
static int32_t fcoder_metacmd_ID_suppress_mouse = 184;
static int32_t fcoder_metacmd_ID_swap_buffers_between_panels = 185;
static int32_t fcoder_metacmd_ID_to_lowercase = 186;
static int32_t fcoder_metacmd_ID_to_uppercase = 187;
static int32_t fcoder_metacmd_ID_toggle_filebar = 188;
static int32_t fcoder_metacmd_ID_toggle_fullscreen = 189;
static int32_t fcoder_metacmd_ID_toggle_line_wrap = 190;
static int32_t fcoder_metacmd_ID_toggle_mouse = 191;
static int32_t fcoder_metacmd_ID_toggle_show_whitespace = 192;
static int32_t fcoder_metacmd_ID_toggle_virtual_whitespace = 193;
static int32_t fcoder_metacmd_ID_undo = 194;
static int32_t fcoder_metacmd_ID_view_buffer_other_panel = 195;
static int32_t fcoder_metacmd_ID_view_jump_list_with_lister = 196;
static int32_t fcoder_metacmd_ID_word_complete = 197;
static int32_t fcoder_metacmd_ID_write_and_auto_tab = 198;
static int32_t fcoder_metacmd_ID_write_block = 199;
static int32_t fcoder_metacmd_ID_write_character = 200;
static int32_t fcoder_metacmd_ID_write_hack = 201;
static int32_t fcoder_metacmd_ID_write_note = 202;
static int32_t fcoder_metacmd_ID_write_todo = 203;
static int32_t fcoder_metacmd_ID_write_underscore = 204;
static int32_t fcoder_metacmd_ID_write_zero_struct = 205;
static int32_t fcoder_metacmd_ID_project_command_lister = 134;
static int32_t fcoder_metacmd_ID_project_fkey_command = 135;
static int32_t fcoder_metacmd_ID_project_go_to_root_directory = 136;
static int32_t fcoder_metacmd_ID_query_replace = 137;
static int32_t fcoder_metacmd_ID_query_replace_identifier = 138;
static int32_t fcoder_metacmd_ID_query_replace_selection = 139;
static int32_t fcoder_metacmd_ID_redo = 140;
static int32_t fcoder_metacmd_ID_reload_themes = 141;
static int32_t fcoder_metacmd_ID_remap_interactive = 142;
static int32_t fcoder_metacmd_ID_rename_file_query = 143;
static int32_t fcoder_metacmd_ID_reopen = 144;
static int32_t fcoder_metacmd_ID_replace_in_range = 145;
static int32_t fcoder_metacmd_ID_reverse_search = 146;
static int32_t fcoder_metacmd_ID_reverse_search_identifier = 147;
static int32_t fcoder_metacmd_ID_save = 148;
static int32_t fcoder_metacmd_ID_save_all_dirty_buffers = 149;
static int32_t fcoder_metacmd_ID_save_to_query = 150;
static int32_t fcoder_metacmd_ID_scope_absorb_down = 151;
static int32_t fcoder_metacmd_ID_search = 152;
static int32_t fcoder_metacmd_ID_search_identifier = 153;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_left = 154;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_left = 155;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_right = 156;
static int32_t fcoder_metacmd_ID_seek_alphanumeric_right = 157;
static int32_t fcoder_metacmd_ID_seek_beginning_of_line = 158;
static int32_t fcoder_metacmd_ID_seek_beginning_of_textual_line = 159;
static int32_t fcoder_metacmd_ID_seek_end_of_line = 160;
static int32_t fcoder_metacmd_ID_seek_end_of_textual_line = 161;
static int32_t fcoder_metacmd_ID_seek_token_left = 162;
static int32_t fcoder_metacmd_ID_seek_token_right = 163;
static int32_t fcoder_metacmd_ID_seek_white_or_token_left = 164;
static int32_t fcoder_metacmd_ID_seek_white_or_token_right = 165;
static int32_t fcoder_metacmd_ID_seek_whitespace_down = 166;
static int32_t fcoder_metacmd_ID_seek_whitespace_down_end_line = 167;
static int32_t fcoder_metacmd_ID_seek_whitespace_left = 168;
static int32_t fcoder_metacmd_ID_seek_whitespace_right = 169;
static int32_t fcoder_metacmd_ID_seek_whitespace_up = 170;
static int32_t fcoder_metacmd_ID_seek_whitespace_up_end_line = 171;
static int32_t fcoder_metacmd_ID_select_all = 172;
static int32_t fcoder_metacmd_ID_set_bindings_choose = 173;
static int32_t fcoder_metacmd_ID_set_bindings_default = 174;
static int32_t fcoder_metacmd_ID_set_bindings_mac_default = 175;
static int32_t fcoder_metacmd_ID_set_mark = 176;
static int32_t fcoder_metacmd_ID_setup_build_bat = 177;
static int32_t fcoder_metacmd_ID_setup_build_bat_and_sh = 178;
static int32_t fcoder_metacmd_ID_setup_build_sh = 179;
static int32_t fcoder_metacmd_ID_setup_new_project = 180;
static int32_t fcoder_metacmd_ID_show_filebar = 181;
static int32_t fcoder_metacmd_ID_show_scrollbar = 182;
static int32_t fcoder_metacmd_ID_snipe_token_or_word = 183;
static int32_t fcoder_metacmd_ID_snipe_token_or_word_right = 184;
static int32_t fcoder_metacmd_ID_snippet_lister = 185;
static int32_t fcoder_metacmd_ID_suppress_mouse = 186;
static int32_t fcoder_metacmd_ID_swap_buffers_between_panels = 187;
static int32_t fcoder_metacmd_ID_to_lowercase = 188;
static int32_t fcoder_metacmd_ID_to_uppercase = 189;
static int32_t fcoder_metacmd_ID_toggle_filebar = 190;
static int32_t fcoder_metacmd_ID_toggle_fullscreen = 191;
static int32_t fcoder_metacmd_ID_toggle_line_wrap = 192;
static int32_t fcoder_metacmd_ID_toggle_mouse = 193;
static int32_t fcoder_metacmd_ID_toggle_show_whitespace = 194;
static int32_t fcoder_metacmd_ID_toggle_virtual_whitespace = 195;
static int32_t fcoder_metacmd_ID_undo = 196;
static int32_t fcoder_metacmd_ID_view_buffer_other_panel = 197;
static int32_t fcoder_metacmd_ID_view_jump_list_with_lister = 198;
static int32_t fcoder_metacmd_ID_word_complete = 199;
static int32_t fcoder_metacmd_ID_write_and_auto_tab = 200;
static int32_t fcoder_metacmd_ID_write_block = 201;
static int32_t fcoder_metacmd_ID_write_character = 202;
static int32_t fcoder_metacmd_ID_write_hack = 203;
static int32_t fcoder_metacmd_ID_write_note = 204;
static int32_t fcoder_metacmd_ID_write_todo = 205;
static int32_t fcoder_metacmd_ID_write_underscore = 206;
static int32_t fcoder_metacmd_ID_write_zero_struct = 207;
#endif

View File

@ -19,7 +19,7 @@ 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, command_lister);
bind(context, 'I', MDFR_CTRL, list_all_functions_all_buffers_lister);
bind(context, 'I', MDFR_CTRL, list_all_functions_current_buffer_lister);
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);
@ -79,6 +79,7 @@ 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, 'G', MDFR_CTRL, list_all_locations_of_selection);
bind(context, 'j', MDFR_CTRL, snippet_lister);
bind(context, 'K', MDFR_CTRL, kill_buffer);
bind(context, 'L', MDFR_CTRL, duplicate_line);
bind(context, 'm', MDFR_CTRL, cursor_mark_swap);
@ -173,7 +174,7 @@ 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, command_lister);
bind(context, 'I', MDFR_CMND, list_all_functions_all_buffers_lister);
bind(context, 'I', MDFR_CMND, list_all_functions_current_buffer_lister);
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);
@ -359,7 +360,7 @@ static Meta_Key_Bind fcoder_binds_for_default_mapid_global[36] = {
{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, "command_lister", 14, LINK_PROCS(command_lister)},
{0, 73, 1, "list_all_functions_all_buffers_lister", 37, LINK_PROCS(list_all_functions_all_buffers_lister)},
{0, 73, 1, "list_all_functions_current_buffer_lister", 40, LINK_PROCS(list_all_functions_current_buffer_lister)},
{0, 69, 2, "exit_4coder", 11, LINK_PROCS(exit_4coder)},
{0, 55315, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55316, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
@ -378,7 +379,7 @@ static Meta_Key_Bind fcoder_binds_for_default_mapid_global[36] = {
{0, 55329, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55330, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
};
static Meta_Key_Bind fcoder_binds_for_default_mapid_file[62] = {
static Meta_Key_Bind fcoder_binds_for_default_mapid_file[63] = {
{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)},
@ -419,6 +420,7 @@ static Meta_Key_Bind fcoder_binds_for_default_mapid_file[62] = {
{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, 71, 1, "list_all_locations_of_selection", 31, LINK_PROCS(list_all_locations_of_selection)},
{0, 106, 1, "snippet_lister", 14, LINK_PROCS(snippet_lister)},
{0, 75, 1, "kill_buffer", 11, LINK_PROCS(kill_buffer)},
{0, 76, 1, "duplicate_line", 14, LINK_PROCS(duplicate_line)},
{0, 109, 1, "cursor_mark_swap", 16, LINK_PROCS(cursor_mark_swap)},
@ -493,7 +495,7 @@ static Meta_Key_Bind fcoder_binds_for_default_default_lister_ui_map[14] = {
};
static Meta_Sub_Map fcoder_submaps_for_default[4] = {
{"mapid_global", 12, "The following bindings apply in all situations.", 47, 0, 0, fcoder_binds_for_default_mapid_global, 36},
{"mapid_file", 10, "The following bindings apply in general text files and most apply in code files, but some are overriden by other commands specific to code files.", 145, 0, 0, fcoder_binds_for_default_mapid_file, 62},
{"mapid_file", 10, "The following bindings apply in general text files and most apply in code files, but some are overriden by other commands specific to code files.", 145, 0, 0, fcoder_binds_for_default_mapid_file, 63},
{"default_code_map", 16, "The following commands only apply in files where the lexer (syntax highlighting) is turned on.", 94, "mapid_file", 10, fcoder_binds_for_default_default_code_map, 31},
{"default_lister_ui_map", 21, "These commands apply in 'lister mode' such as when you open a file.", 67, 0, 0, fcoder_binds_for_default_default_lister_ui_map, 14},
};
@ -516,7 +518,7 @@ static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_global[36] = {
{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, "command_lister", 14, LINK_PROCS(command_lister)},
{0, 73, 4, "list_all_functions_all_buffers_lister", 37, LINK_PROCS(list_all_functions_all_buffers_lister)},
{0, 73, 4, "list_all_functions_current_buffer_lister", 40, LINK_PROCS(list_all_functions_current_buffer_lister)},
{0, 69, 1, "exit_4coder", 11, LINK_PROCS(exit_4coder)},
{0, 55315, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55316, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},

View File

@ -31,8 +31,12 @@ begin_bind_helper(void *data, int32_t size){
inline void
begin_map(Bind_Helper *helper, int32_t mapid, bool32 replace){
if (helper->group != 0 && helper->error == 0) helper->error = BH_ERR_MISSING_END;
if (!helper->error && mapid < mapid_global) ++helper->header->header.user_map_count;
if (helper->group != 0 && helper->error == 0){
helper->error = BH_ERR_MISSING_END;
}
if (!helper->error && mapid < mapid_global){
++helper->header->header.user_map_count;
}
Binding_Unit unit;
unit.type = unit_map_begin;
@ -54,14 +58,20 @@ restart_map(Bind_Helper *helper, int32_t mapid){
inline void
end_map(Bind_Helper *helper){
if (helper->group == 0 && helper->error == 0) helper->error = BH_ERR_MISSING_BEGIN;
if (helper->group == 0 && helper->error == 0){
helper->error = BH_ERR_MISSING_BEGIN;
}
helper->group = 0;
}
inline void
bind(Bind_Helper *helper, Key_Code code, uint8_t modifiers, Command_ID cmdid){
if (helper->group == 0 && helper->error == 0) helper->error = BH_ERR_MISSING_BEGIN;
if (!helper->error) ++helper->group->map_begin.bind_count;
if (helper->group == 0 && helper->error == 0){
helper->error = BH_ERR_MISSING_BEGIN;
}
if (!helper->error){
++helper->group->map_begin.bind_count;
}
Binding_Unit unit;
unit.type = unit_binding;
@ -74,8 +84,12 @@ bind(Bind_Helper *helper, Key_Code code, uint8_t modifiers, Command_ID cmdid){
inline void
bind(Bind_Helper *helper, Key_Code code, uint8_t modifiers, Custom_Command_Function *func){
if (helper->group == 0 && helper->error == 0) helper->error = BH_ERR_MISSING_BEGIN;
if (!helper->error) ++helper->group->map_begin.bind_count;
if (helper->group == 0 && helper->error == 0){
helper->error = BH_ERR_MISSING_BEGIN;
}
if (!helper->error){
++helper->group->map_begin.bind_count;
}
Binding_Unit unit;
unit.type = unit_callback;
@ -1338,27 +1352,27 @@ sort_pairs_by_key__quick(Sort_Pair_i32 *pairs, int32_t first, int32_t one_past_l
int32_t dif = one_past_last - first;
if (dif >= 2){
int32_t pivot = one_past_last - 1;
int32_t pivot_key = pairs[pivot].key;
Sort_Pair_i32 pivot_pair = pairs[pivot];
int32_t j = first;
bool32 interleave = false;
for (int32_t i = first; i < pivot; i += 1){
int32_t key = pairs[i].key;
if (key < pivot_key){
pairs[i].key = pairs[j].key;
pairs[j].key = key;
Sort_Pair_i32 pair = pairs[i];
if (pair.key < pivot_pair.key){
pairs[i] = pairs[j];
pairs[j] = pair;
j += 1;
}
else if (key == pivot_key){
else if (pair.key == pivot_pair.key){
if (interleave){
pairs[i].key = pairs[j].key;
pairs[j].key = key;
pairs[i] = pairs[j];
pairs[j] = pair;
j += 1;
}
interleave = !interleave;
}
}
pairs[pivot].key = pairs[j].key;
pairs[j].key = pivot_key;
pairs[pivot] = pairs[j];
pairs[j] = pivot_pair;
sort_pairs_by_key__quick(pairs, first, j);
sort_pairs_by_key__quick(pairs, j + 1, one_past_last);
}

View File

@ -4,15 +4,15 @@
// TOP
static Lister_Activation_Code
activate_jump(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 activated_by_mouse){
static void
activate_jump(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, struct Lister_State *state,
String text_field, void *user_data, bool32 activated_by_mouse){
Lister_Activation_Code result_code = ListerActivation_Finished;
int32_t list_index = (int32_t)PtrAsInt(user_data);
Lister_State *state = view_get_lister_state(view);
Jump_Lister_Parameters *params = (Jump_Lister_Parameters*)state->lister.user_data;
Marker_List *list = get_marker_list_for_buffer(params->list_buffer_id);
if (list != 0){
Lister_Activation_Code result_code = ListerActivation_Finished;
View_Summary target_view = {0};
switch (params->activation_rule){
case JumpListerActivation_OpenInUIView:
@ -57,9 +57,8 @@ activate_jump(Application_Links *app, View_Summary *view, String text_field,
}
}
return(result_code);
}
return(ListerActivation_Finished);
lister_default(app, scratch, heap, view, state, result_code);
}
static void

View File

@ -24,7 +24,7 @@ struct Sticky_Jump_Stored{
};
struct Sticky_Jump_Array{
struct Sticky_Jump *jumps;
Sticky_Jump *jumps;
int32_t count;
};

View File

@ -624,11 +624,11 @@ enum{
SureToKill_Save = 3,
};
static Lister_Activation_Code
activate_confirm_kill(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 clicked){
static void
activate_confirm_kill(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, Lister_State *state,
String text_field, void *user_data, bool32 clicked){
int32_t behavior = (int32_t)PtrAsInt(user_data);
Lister_State *state = view_get_lister_state(view);
Buffer_ID buffer_id = *(Buffer_ID*)(state->lister.user_data);
switch (behavior){
case SureToKill_No:
@ -655,7 +655,7 @@ activate_confirm_kill(Application_Links *app, View_Summary *view, String text_fi
}
}break;
}
return(ListerActivation_Finished);
lister_default(app, scratch, heap, view, state, ListerActivation_Finished);
}
static void
@ -673,9 +673,10 @@ do_gui_sure_to_kill(Application_Links *app, Buffer_Summary *buffer, View_Summary
view);
}
static Lister_Activation_Code
activate_confirm_close_4coder(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 clicked){
static void
activate_confirm_close_4coder(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, Lister_State *state,
String text_field, void *user_data, bool32 clicked){
int32_t behavior = (int32_t)PtrAsInt(user_data);
switch (behavior){
case SureToKill_No:
@ -694,7 +695,7 @@ activate_confirm_close_4coder(Application_Links *app, View_Summary *view, String
send_exit_signal(app);
}break;
}
return(ListerActivation_Finished);
lister_default(app, scratch, heap, view, state, ListerActivation_Finished);
}
static void
@ -715,14 +716,15 @@ do_gui_sure_to_close_4coder(Application_Links *app, View_Summary *view){
////////////////////////////////
static Lister_Activation_Code
activate_switch_buffer(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 activated_by_mouse){
static void
activate_switch_buffer(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, Lister_State *state,
String text_field, void *user_data, bool32 activated_by_mouse){
if (user_data != 0){
Buffer_ID buffer_id = (Buffer_ID)(PtrAsInt(user_data));
view_set_buffer(app, view, buffer_id, SetBuffer_KeepOriginalGUI);
}
return(ListerActivation_Finished);
lister_default(app, scratch, heap, view, state, ListerActivation_Finished);
}
CUSTOM_COMMAND_SIG(interactive_switch_buffer)
@ -733,14 +735,15 @@ CUSTOM_DOC("Interactively switch to an open buffer.")
begin_integrated_lister__buffer_list(app, "Switch:", activate_switch_buffer, 0, 0, &view);
}
static Lister_Activation_Code
activate_kill_buffer(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 activated_by_mouse){
static void
activate_kill_buffer(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, struct Lister_State *state,
String text_field, void *user_data, bool32 activated_by_mouse){
if (user_data != 0){
Buffer_ID buffer_id = (Buffer_ID)(PtrAsInt(user_data));
kill_buffer(app, buffer_identifier(buffer_id), view->view_id, 0);
}
return(ListerActivation_Finished);
lister_default(app, scratch, heap, view, state, ListerActivation_Finished);
}
CUSTOM_COMMAND_SIG(interactive_kill_buffer)
@ -790,9 +793,10 @@ activate_open_or_new__generic(Application_Links *app, View_Summary *view,
return(result);
}
static Lister_Activation_Code
activate_open_or_new(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 clicked){
static void
activate_open_or_new(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, struct Lister_State *state,
String text_field, void *user_data, bool32 clicked){
Lister_Activation_Code result = 0;
String file_name = {0};
if (user_data == 0){
@ -809,7 +813,7 @@ activate_open_or_new(Application_Links *app, View_Summary *view, String text_fie
Buffer_Create_Flag flags = 0;
result = activate_open_or_new__generic(app, view, file_name, is_folder, flags);
}
return(result);
lister_default(app, scratch, heap, view, state, result);
}
CUSTOM_COMMAND_SIG(interactive_open_or_new)
@ -820,9 +824,10 @@ CUSTOM_DOC("Interactively open a file out of the file system.")
begin_integrated_lister__file_system_list(app, "Open:", activate_open_or_new, 0, 0, &view);
}
static Lister_Activation_Code
activate_new(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 clicked){
static void
activate_new(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, struct Lister_State *state,
String text_field, void *user_data, bool32 clicked){
Lister_Activation_Code result = 0;
String file_name = front_of_directory(text_field);
if (user_data != 0){
@ -842,7 +847,7 @@ activate_new(Application_Links *app, View_Summary *view, String text_field,
Buffer_Create_Flag flags = BufferCreate_AlwaysNew;
result = activate_open_or_new__generic(app, view, file_name, is_folder, flags);
}
return(result);
lister_default(app, scratch, heap, view, state, result);
}
CUSTOM_COMMAND_SIG(interactive_new)
@ -853,9 +858,10 @@ CUSTOM_DOC("Interactively creates a new file.")
begin_integrated_lister__file_system_list(app, "New:", activate_new, 0, 0, &view);
}
static Lister_Activation_Code
activate_open(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 clicked){
static void
activate_open(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, struct Lister_State *state,
String text_field, void *user_data, bool32 clicked){
Lister_Activation_Code result = 0;
String file_name = {0};
if (user_data != 0){
@ -869,7 +875,7 @@ activate_open(Application_Links *app, View_Summary *view, String text_field,
Buffer_Create_Flag flags = BufferCreate_NeverNew;
result = activate_open_or_new__generic(app, view, file_name, is_folder, flags);
}
return(result);
lister_default(app, scratch, heap, view, state, result);
}
CUSTOM_COMMAND_SIG(interactive_open)
@ -880,12 +886,12 @@ CUSTOM_DOC("Interactively opens a file.")
begin_integrated_lister__file_system_list(app, "Open:", activate_open, 0, 0, &view);
}
static Lister_Activation_Code
activate_select_theme(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 clicked){
Lister_Activation_Code result = ListerActivation_Finished;
static void
activate_select_theme(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, struct Lister_State *state,
String text_field, void *user_data, bool32 clicked){
change_theme_by_index(app, (int32_t)PtrAsInt(user_data));
return(result);
lister_default(app, scratch, heap, view, state, ListerActivation_Finished);
}
CUSTOM_COMMAND_SIG(open_color_tweaker)
@ -915,15 +921,15 @@ CUSTOM_DOC("Opens the 4coder theme selector list.")
////////////////////////////////
static Lister_Activation_Code
activate_command(Application_Links *app, View_Summary *view, String text_field,
void *user_data, bool32 activated_by_mouse){
static void
activate_command(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, Lister_State *state,
String text_field, void *user_data, bool32 activated_by_mouse){
lister_default(app, scratch, heap, view, state, ListerActivation_Finished);
if (user_data != 0){
Custom_Command_Function *command = (Custom_Command_Function*)user_data;
view_end_ui_mode(app, view);
command(app);
}
return(ListerActivation_Finished);
}
CUSTOM_COMMAND_SIG(command_lister)

View File

@ -1011,6 +1011,18 @@ exec_project_command(Application_Links *app, Project_Command *command){
}
}
static void
exec_project_command_by_index(Application_Links *app, int32_t command_index){
if (!current_project.loaded){
return;
}
if (command_index < 0 || command_index >= current_project.command_array.count){
return;
}
Project_Command *command = &current_project.command_array.commands[command_index];
exec_project_command(app, command);
}
static void
exec_project_fkey_command(Application_Links *app, int32_t fkey_index){
if (!current_project.loaded){
@ -1020,8 +1032,8 @@ exec_project_fkey_command(Application_Links *app, int32_t fkey_index){
if (command_index < 0 || command_index >= current_project.command_array.count){
return;
}
Project_Command *fkey = &current_project.command_array.commands[command_index];
exec_project_command(app, fkey);
Project_Command *command = &current_project.command_array.commands[command_index];
exec_project_command(app, command);
}
static void
@ -1503,5 +1515,44 @@ CUSTOM_DOC("Queries the user for several configuration options and initializes a
project_setup_scripts__generic(app, &global_part, false, true, true);
}
///////////////////////////////
static void
activate_project_command(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, Lister_State *state,
String text_field, void *user_data, bool32 activated_by_mouse){
int32_t command_index = (int32_t)PtrAsInt(user_data);
exec_project_command_by_index(app, command_index);
lister_default(app, scratch, heap, view, state, ListerActivation_Finished);
}
CUSTOM_COMMAND_SIG(project_command_lister)
CUSTOM_DOC("Open a lister of all commands in the currently loaded project.")
{
if (!current_project.loaded){
return;
}
Partition *arena = &global_part;
View_Summary view = get_active_view(app, AccessAll);
view_end_ui_mode(app, &view);
Temp_Memory temp = begin_temp_memory(arena);
int32_t option_count = current_project.command_array.count;
Lister_Option *options = push_array(arena, Lister_Option, option_count);
for (int32_t i = 0; i < current_project.command_array.count; i += 1){
String string = push_string_copy(arena, current_project.command_array.commands[i].name);
String status = push_string_copy(arena, current_project.command_array.commands[i].cmd);
options[i].string = string.str;
options[i].status = status.str;
options[i].user_data = IntAsPtr(i);
}
begin_integrated_lister__basic_list(app, "Command:", activate_project_command, 0, 0,
options, option_count,
0,
&view);
end_temp_memory(temp);
}
// BOTTOM

View File

@ -272,15 +272,21 @@ lister_update_ui(Application_Links *app, Partition *scratch, View_Summary *view,
before_extension_matches.node_ptrs = push_array(scratch, Lister_Node*, node_count);
Lister_Node_Ptr_Array substring_matches = {0};
substring_matches.node_ptrs = push_array(scratch, Lister_Node*, node_count);
Absolutes absolutes = {0};
get_absolutes(state->lister.key_string, &absolutes, true, true);
for (Lister_Node *node = state->lister.options.first;
node != 0;
node = node->next){
if (state->lister.key_string.size == 0 ||
has_substr(node->string, state->lister.key_string)){
wildcard_match_s(&absolutes, node->string, false)){
bool32 has_wildcard = (absolutes.count > 2);
if (match_insensitive(node->string, state->lister.key_string) && exact_matches.count == 0){
exact_matches.node_ptrs[exact_matches.count++] = node;
}
else if (match_part_insensitive(node->string, state->lister.key_string) &&
else if (!has_wildcard &&
match_part_insensitive(node->string, state->lister.key_string) &&
node->string.size > state->lister.key_string.size &&
node->string.str[state->lister.key_string.size] == '.'){
before_extension_matches.node_ptrs[before_extension_matches.count++] = node;
@ -516,14 +522,9 @@ lister_call_refresh_handler(Application_Links *app, Partition *arena, Lister *li
}
static void
lister_call_activate_handler(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, Lister_State *state,
void *user_data, bool32 activated_by_mouse){
Lister *lister = &state->lister;
Lister_Activation_Code code = ListerActivation_Finished;
if (lister->handlers.activate != 0){
code = lister->handlers.activate(app, view, lister->text_field, user_data, activated_by_mouse);
}
lister_default(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, Lister_State *state,
Lister_Activation_Code code){
switch (code){
case ListerActivation_Finished:
{
@ -544,12 +545,26 @@ lister_call_activate_handler(Application_Links *app, Partition *scratch, Heap *h
{
view_start_ui_mode(app, view);
state->item_index = 0;
lister_call_refresh_handler(app, &state->arena, lister);
lister_call_refresh_handler(app, &state->arena, &state->lister);
lister_update_ui(app, scratch, view, state);
}break;
}
}
static void
lister_call_activate_handler(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, Lister_State *state,
void *user_data, bool32 activated_by_mouse){
Lister *lister = &state->lister;
if (lister->handlers.activate != 0){
lister->handlers.activate(app, scratch, heap, view, state,
lister->text_field, user_data, activated_by_mouse);
}
else{
lister_default(app, scratch, heap, view, state, ListerActivation_Finished);
}
}
static void
lister_set_query_string(Lister *lister, char *string){
copy(&lister->query, string);

View File

@ -14,8 +14,9 @@ enum{
ListerActivation_ContinueAndRefresh = 2,
};
typedef Lister_Activation_Code Lister_Activation_Function_Type(Application_Links *app, View_Summary *view,
String text_field, void *user_data, bool32 activated_by_mouse);
typedef void Lister_Activation_Function_Type(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, struct Lister_State *state,
String text_field, void *user_data, bool32 activated_by_mouse);
typedef void Lister_Regenerate_List_Function_Type(Application_Links *app, Partition *arena, struct Lister *lister);

31
4ed.cpp
View File

@ -315,37 +315,6 @@ COMMAND_DECL(save){
}
}
internal void
case_change_range(System_Functions *system, Models *models, View *view, Editing_File *file, u8 a, u8 z, u8 char_delta){
Range range = {0};
range.min = Min(view->transient.edit_pos->cursor.pos, view->transient.edit_pos->mark);
range.max = Max(view->transient.edit_pos->cursor.pos, view->transient.edit_pos->mark);
if (range.start < range.end){
Edit_Step step = {};
step.type = ED_NORMAL;
step.edit.start = range.start;
step.edit.end = range.end;
step.edit.len = range.end - range.start;
if (file->state.still_lexing){
system->cancel_job(BACKGROUND_THREADS, file->state.lex_job);
}
file_update_history_before_edit(&models->mem, file, step, 0, hist_normal);
u8 *data = (u8*)file->state.buffer.data;
for (i32 i = range.start; i < range.end; ++i){
if (data[i] >= a && data[i] <= z){
data[i] += char_delta;
}
}
if (file->state.token_array.tokens){
file_relex_parallel(system, models, file, range.start, range.end, 0);
}
}
}
COMMAND_DECL(user_callback){
USE_MODELS(models);
if (binding.custom != 0){

View File

@ -377,7 +377,8 @@ lifetime__free_key(Heap *heap, Lifetime_Allocator *lifetime_allocator,
Assert(delete_point_node != 0);
Lifetime_Key_Ref_Node *last_node = object->key_node_last;
Lifetime_Key *last_key = last_node->keys[object->key_count % lifetime_key_reference_per_node];
Lifetime_Key *last_key = last_node->keys[(object->key_count - 1) % ArrayCount(last_node->keys)];
Assert(last_key != 0);
delete_point_node->keys[delete_point_i] = last_key;
object->key_count -= 1;

View File

@ -31,16 +31,44 @@ edit_fix_marks__write_workspace_marks(Dynamic_Workspace *workspace, Buffer_ID bu
node != 0;
node = node->next){
if (node->buffer_id == buffer_id){
Marker *markers = (Marker*)(node + 1);
Assert(sizeof(Marker) == node->std_header.item_size);
i32 count = node->std_header.count;
for (i32 i = 0; i < count; i += 1){
if (markers[i].lean_right){
write_cursor_with_index(r_cursors, r_cursor_count, markers[i].pos);
}
else{
write_cursor_with_index(cursors , cursor_count , markers[i].pos);
}
Marker_Type marker_type = MarkerType_Standard;
switch (marker_type){
case MarkerType_Standard:
{
Marker *markers = (Marker*)(node + 1);
Assert(sizeof(*markers) == node->std_header.item_size);
i32 count = node->std_header.count;
for (i32 i = 0; i < count; i += 1){
if (markers[i].lean_right){
write_cursor_with_index(r_cursors, r_cursor_count, markers[i].pos);
}
else{
write_cursor_with_index(cursors , cursor_count , markers[i].pos);
}
}
}break;
case MarkerType_Pair:
{
Marker_Pair *markers = (Marker_Pair*)(node + 1);
Assert(sizeof(*markers) == node->std_header.item_size);
i32 count = node->std_header.count;
for (i32 i = 0; i < count; i += 1){
if (markers[i].lean_right1){
write_cursor_with_index(r_cursors, r_cursor_count, markers[i].pos1);
}
else{
write_cursor_with_index(cursors , cursor_count , markers[i].pos1);
}
if (markers[i].lean_right2){
write_cursor_with_index(r_cursors, r_cursor_count, markers[i].pos2);
}
else{
write_cursor_with_index(cursors , cursor_count , markers[i].pos2);
}
}
}break;
}
}
}
@ -53,16 +81,44 @@ edit_fix_marks__read_workspace_marks(Dynamic_Workspace *workspace, Buffer_ID buf
node != 0;
node = node->next){
if (node->buffer_id == buffer_id){
Marker *markers = (Marker*)(node + 1);
Assert(sizeof(Marker) == node->std_header.item_size);
i32 count = node->std_header.count;
for (i32 i = 0; i < count; i += 1){
if (markers[i].lean_right){
markers[i].pos = r_cursors[(*r_cursor_count)++].pos;
}
else{
markers[i].pos = cursors[(*cursor_count)++].pos;
}
Marker_Type marker_type = MarkerType_Standard;
switch (marker_type){
case MarkerType_Standard:
{
Marker *markers = (Marker*)(node + 1);
Assert(sizeof(*markers) == node->std_header.item_size);
i32 count = node->std_header.count;
for (i32 i = 0; i < count; i += 1){
if (markers[i].lean_right){
markers[i].pos = r_cursors[(*r_cursor_count)++].pos;
}
else{
markers[i].pos = cursors[(*cursor_count)++].pos;
}
}
}break;
case MarkerType_Pair:
{
Marker_Pair *markers = (Marker_Pair*)(node + 1);
Assert(sizeof(*markers) == node->std_header.item_size);
i32 count = node->std_header.count;
for (i32 i = 0; i < count; i += 1){
if (markers[i].lean_right1){
markers[i].pos1 = r_cursors[(*r_cursor_count)++].pos;
}
else{
markers[i].pos1 = cursors[(*cursor_count)++].pos;
}
if (markers[i].lean_right2){
markers[i].pos2 = r_cursors[(*r_cursor_count)++].pos;
}
else{
markers[i].pos2 = cursors[(*cursor_count)++].pos;
}
}
}break;
}
}
}

View File

@ -26,7 +26,7 @@ ABS(f32 x){
#if C_MATH
#include <math.h>
inline f32
internal f32
MOD(f32 x, i32 m){
f32 whole;
f32 frac = modff(x, &whole);
@ -34,19 +34,19 @@ MOD(f32 x, i32 m){
return(r);
}
inline f32
internal f32
SQRT(f32 x){
f32 r = sqrtf(x);
return(r);
}
inline f32
internal f32
SIN(f32 x_degrees){
f32 r = sinf(x_degrees * DEG_TO_RAD);
return(r);
}
inline f32
internal f32
COS(f32 x_degrees){
f32 r = cosf(x_degrees * DEG_TO_RAD);
return(r);
@ -120,7 +120,7 @@ struct Vec4{
};
};
inline internal Vec2
internal Vec2
V2(f32 x, f32 y){
Vec2 result;
result.x = x;
@ -128,7 +128,7 @@ V2(f32 x, f32 y){
return result;
}
inline internal Vec3
internal Vec3
V3(f32 x, f32 y, f32 z){
Vec3 result;
result.x = x;
@ -137,7 +137,7 @@ V3(f32 x, f32 y, f32 z){
return result;
}
inline internal Vec4
internal Vec4
V4(f32 x, f32 y, f32 z, f32 w){
Vec4 result;
result.x = x;
@ -147,190 +147,189 @@ V4(f32 x, f32 y, f32 z, f32 w){
return result;
}
inline internal Vec2
internal Vec2
operator+(Vec2 a, Vec2 b){
Vec2 result;
result.x = a.x + b.x;
result.y = a.y + b.y;
return result;
return(a + b);
}
inline internal Vec3
internal Vec3
operator+(Vec3 a, Vec3 b){
Vec3 result;
result.x = a.x + b.x;
result.y = a.y + b.y;
result.z = a.z + b.z;
return result;
return(a + b);
}
inline internal Vec4
internal Vec4
operator+(Vec4 a, Vec4 b){
Vec4 result;
result.x = a.x + b.x;
result.y = a.y + b.y;
result.z = a.z + b.z;
result.w = a.w + b.w;
return result;
return(a + b);
}
inline internal Vec2
internal Vec2
operator-(Vec2 a, Vec2 b){
Vec2 result;
result.x = a.x - b.x;
result.y = a.y - b.y;
return result;
return(result);
}
inline internal Vec3
internal Vec3
operator-(Vec3 a, Vec3 b){
Vec3 result;
result.x = a.x - b.x;
result.y = a.y - b.y;
result.z = a.z - b.z;
return result;
return(result);
}
inline internal Vec4
internal Vec4
operator-(Vec4 a, Vec4 b){
Vec4 result;
result.x = a.x - b.x;
result.y = a.y - b.y;
result.z = a.z - b.z;
result.w = a.w - b.w;
return result;
return(result);
}
inline internal Vec2
internal Vec2
operator*(Vec2 a, f32 k){
Vec2 result;
result.x = a.x * k;
result.y = a.y * k;
return result;
return(result);
}
inline internal Vec3
internal Vec3
operator*(Vec3 a, f32 k){
Vec3 result;
result.x = a.x * k;
result.y = a.y * k;
result.z = a.z * k;
return result;
return(result);
}
inline internal Vec4
internal Vec4
operator*(Vec4 a, f32 k){
Vec4 result;
result.x = a.x * k;
result.y = a.y * k;
result.z = a.z * k;
result.w = a.w * k;
return result;
return(result);
}
inline internal Vec2
internal Vec2
operator*(f32 k, Vec2 a){
Vec2 result;
result.x = a.x * k;
result.y = a.y * k;
return result;
return(result);
}
inline internal Vec3
internal Vec3
operator*(f32 k, Vec3 a){
Vec3 result;
result.x = a.x * k;
result.y = a.y * k;
result.z = a.z * k;
return result;
return(result);
}
inline internal Vec4
internal Vec4
operator*(f32 k, Vec4 a){
Vec4 result;
result.x = a.x * k;
result.y = a.y * k;
result.z = a.z * k;
result.w = a.w * k;
return result;
}
return(result);}
inline internal Vec2&
internal Vec2&
operator+=(Vec2 &a, Vec2 b){
a = (a + b);
return a;
}
inline internal Vec3&
internal Vec3&
operator+=(Vec3 &a, Vec3 b){
a = (a + b);
return a;
}
inline internal Vec4&
internal Vec4&
operator+=(Vec4 &a, Vec4 b){
a = (a + b);
return a;
}
inline internal Vec2&
internal Vec2&
operator-=(Vec2 &a, Vec2 b){
a = (a - b);
return a;
}
inline internal Vec3&
internal Vec3&
operator-=(Vec3 &a, Vec3 b){
a = (a - b);
return a;
}
inline internal Vec4&
internal Vec4&
operator-=(Vec4 &a, Vec4 b){
a = (a - b);
return a;
}
inline internal Vec2&
internal Vec2&
operator*=(Vec2 &a, f32 k){
a = (a * k);
a = (a*k);
return a;
}
inline internal Vec3&
internal Vec3&
operator*=(Vec3 &a, f32 k){
a = (a * k);
a = (a*k);
return a;
}
inline internal Vec4&
internal Vec4&
operator*=(Vec4 &a, f32 k){
a = (a * k);
a = (a*k);
return a;
}
inline internal f32
internal f32
dot(Vec2 a, Vec2 b){
f32 result;
result = a.x*b.x + a.y*b.y;
return result;
}
inline internal f32
internal f32
dot(Vec3 a, Vec3 b){
f32 result;
result = a.x*b.x + a.y*b.y + a.z*b.z;
return result;
}
inline internal f32
internal f32
dot(Vec4 a, Vec4 b){
f32 result;
result = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w;
return result;
}
inline internal Vec3
internal Vec3
cross(Vec3 a, Vec3 b){
Vec3 result;
result.x = a.y*b.z - b.y*a.z;
@ -339,90 +338,78 @@ cross(Vec3 a, Vec3 b){
return result;
}
inline internal Vec2
internal Vec2
hadamard(Vec2 a, Vec2 b){
Vec2 result;
result.x = a.x*b.x;
result.y = a.y*b.y;
return result;
a.x *= b.x;
a.y *= b.y;
return(a);
}
inline internal Vec3
internal Vec3
hadamard(Vec3 a, Vec3 b){
Vec3 result;
result.x = a.x*b.x;
result.y = a.y*b.y;
result.z = a.z*b.z;
return result;
a.x *= b.x;
a.y *= b.y;
a.z *= b.z;
return(a);
}
inline internal Vec4
internal Vec4
hadamard(Vec4 a, Vec4 b){
Vec4 result;
result.x = a.x*b.x;
result.y = a.y*b.y;
result.z = a.z*b.z;
result.w = a.w*b.w;
return result;
a.x *= b.x;
a.y *= b.y;
a.z *= b.z;
a.w *= b.w;
return(a);
}
inline internal Vec2
internal Vec2
perp(Vec2 v){
Vec2 result;
result.x = -v.y;
result.y = v.x;
return result;
return(V2(-v.y, v.x));
}
inline Vec2
internal Vec2
polar_to_cartesian(f32 theta_degrees, f32 length){
Vec2 result;
result.x = COS(theta_degrees)*length;
result.y = SIN(theta_degrees)*length;
return result;
return(V2(COS(theta_degrees), SIN(theta_degrees))*length);
}
inline Vec2
internal Vec2
rotate(Vec2 v, f32 theta_degrees){
Vec2 result;
f32 c, s;
c = COS(theta_degrees);
s = SIN(theta_degrees);
result.x = v.x*c - v.y*s;
result.y = v.x*s + v.y*c;
return result;
f32 c = COS(theta_degrees);
f32 s = SIN(theta_degrees);
return(V2(v.x*c - v.y*s,
v.x*s + v.y*c));
}
/*
* Lerps, Clamps, Thresholds, Etc
*Lerps, Clamps, Thresholds, Etc
*/
inline f32
internal f32
lerp(f32 a, f32 t, f32 b){
return(a + (b-a)*t);
}
inline i32
internal i32
lerp(i32 a, f32 t, i32 b){
return ((i32)(lerp((f32)a, t, (f32)b)));
return((i32)(lerp((f32)a, t, (f32)b)));
}
inline Vec2
internal Vec2
lerp(Vec2 a, f32 t, Vec2 b){
return(a + (b-a)*t);
}
inline Vec3
internal Vec3
lerp(Vec3 a, f32 t, Vec3 b){
return(a + (b-a)*t);
}
inline Vec4
internal Vec4
lerp(Vec4 a, f32 t, Vec4 b){
return(a + (b-a)*t);
}
inline f32
internal f32
unlerp(f32 a, f32 x, f32 b){
f32 r = x;
if (b > a){
@ -431,36 +418,48 @@ unlerp(f32 a, f32 x, f32 b){
return(r);
}
inline f32
internal f32
clamp(f32 a, f32 n, f32 z){
if (n < a) n = a;
else if (n > z) n = z;
return (n);
if (n < a){
n = a;
}
else if (n > z){
n = z;
}
return(n);
}
inline i32
internal i32
clamp(i32 a, i32 n, i32 z){
if (n < a) n = a;
else if (n > z) n = z;
return (n);
if (n < a){
n = a;
}
else if (n > z){
n = z;
}
return(n);
}
inline u32
internal u32
clamp(u32 a, u32 n, u32 z){
if (n < a) n = a;
else if (n > z) n = z;
return (n);
if (n < a){
n = a;
}
else if (n > z){
n = z;
}
return(n);
}
#define clamp_top(a,b) Min(a,b)
#define clamp_bottom(a,b) Max(a,b)
/*
* Color
*Color
*/
// TODO(allen): Convert colors to Vec4
inline u32
internal u32
color_blend(u32 a, f32 t, u32 b){
union{
u8 byte[4];
@ -478,7 +477,7 @@ color_blend(u32 a, f32 t, u32 b){
return R.comp;
}
inline Vec3
internal Vec3
unpack_color3(u32 color){
Vec3 result;
result.r = ((color >> 16) & 0xFF) / 255.f;
@ -487,7 +486,7 @@ unpack_color3(u32 color){
return result;
}
inline Vec4
internal Vec4
unpack_color4(u32 color){
Vec4 result;
result.a = ((color >> 24) & 0xFF) / 255.f;
@ -497,13 +496,13 @@ unpack_color4(u32 color){
return result;
}
inline u32
internal u32
pack_color4(Vec4 color){
u32 result =
((u8)(color.a * 255) << 24) |
((u8)(color.r * 255) << 16) |
((u8)(color.g * 255) << 8) |
((u8)(color.b * 255) << 0);
((u8)(color.a*255) << 24) |
((u8)(color.r*255) << 16) |
((u8)(color.g*255) << 8) |
((u8)(color.b*255) << 0);
return result;
}
@ -531,7 +530,7 @@ rgba_to_hsla(Vec4 rgba){
}
delta = max - min;
hsla.z = (max + min) * .5f;
hsla.z = (max + min)*.5f;
if (delta == 0){
hsla.x = 0.f;
hsla.y = 0.f;
@ -541,7 +540,7 @@ rgba_to_hsla(Vec4 rgba){
case 0:
{
hsla.x = (rgba.g - rgba.b) / delta;
hsla.x += (rgba.g < rgba.b) * 6.f;
hsla.x += (rgba.g < rgba.b)*6.f;
}break;
case 1:
@ -556,7 +555,7 @@ rgba_to_hsla(Vec4 rgba){
hsla.x += 4.f;
}break;
}
hsla.x *= (1/6.f); // * 60 / 360
hsla.x *= (1/6.f); //*60 / 360
hsla.y = delta / (1.f - ABS(2.f*hsla.z - 1.f));
}
@ -567,10 +566,10 @@ internal Vec4
hsla_to_rgba(Vec4 hsla){
if (hsla.h >= 1.f) hsla.h = 0.f;
Vec4 rgba = {0};
f32 C = (1.f - ABS(2*hsla.z - 1.f)) * hsla.y;
f32 X = C * (1.f-ABS(MOD(hsla.x*6.f, 2)-1.f));
f32 C = (1.f - ABS(2*hsla.z - 1.f))*hsla.y;
f32 X = C*(1.f-ABS(MOD(hsla.x*6.f, 2)-1.f));
f32 m = hsla.z - C*.5f;
i32 H = floor32(hsla.x * 6.f);
i32 H = floor32(hsla.x*6.f);
rgba.a = hsla.a;
switch (H){
case 0: rgba.r = C; rgba.g = X; rgba.b = 0; break;
@ -590,7 +589,7 @@ hsla_to_rgba(Vec4 hsla){
// Rectangle Operations
//
inline i32_Rect
internal i32_Rect
i32R(int32_t l, int32_t t, int32_t r, int32_t b){
i32_Rect rect;
rect.x0 = l; rect.y0 = t;
@ -598,7 +597,7 @@ i32R(int32_t l, int32_t t, int32_t r, int32_t b){
return(rect);
}
inline i32_Rect
internal i32_Rect
i32R(f32_Rect r){
i32_Rect rect;
rect.x0 = (int32_t)r.x0;
@ -608,7 +607,7 @@ i32R(f32_Rect r){
return(rect);
}
inline f32_Rect
internal f32_Rect
f32R(float l, float t, float r, float b){
f32_Rect rect;
rect.x0 = l; rect.y0 = t;
@ -616,7 +615,7 @@ f32R(float l, float t, float r, float b){
return(rect);
}
inline f32_Rect
internal f32_Rect
f32R(i32_Rect r){
f32_Rect rect;
rect.x0 = (float)r.x0;
@ -626,23 +625,23 @@ f32R(i32_Rect r){
return(rect);
}
inline int32_t
internal int32_t
rect_equal(i32_Rect r1, i32_Rect r2){
int32_t result = (r1.x0 == r2.x0 && r1.y0 == r2.y0 && r1.x1 == r2.x1 && r1.y1 == r2.y1);
return(result);
}
inline int32_t
internal int32_t
hit_check(int32_t x, int32_t y, int32_t x0, int32_t y0, int32_t x1, int32_t y1){
return(x >= x0 && x < x1 && y >= y0 && y < y1);
}
inline int32_t
internal int32_t
hit_check(int32_t x, int32_t y, i32_Rect rect){
return(hit_check(x, y, rect.x0, rect.y0, rect.x1, rect.y1));
}
inline i32_Rect
internal i32_Rect
get_inner_rect(i32_Rect outer, i32 margin){
i32_Rect r;
r.x0 = outer.x0 + margin;
@ -652,7 +651,7 @@ get_inner_rect(i32_Rect outer, i32 margin){
return(r);
}
inline f32_Rect
internal f32_Rect
get_inner_rect(f32_Rect outer, f32 margin){
f32_Rect r;
r.x0 = outer.x0 + margin;
@ -662,7 +661,7 @@ get_inner_rect(f32_Rect outer, f32 margin){
return(r);
}
inline int32_t
internal int32_t
fits_inside(i32_Rect rect, i32_Rect outer){
return(rect.x0 >= outer.x0 && rect.x1 <= outer.x1 && rect.y0 >= outer.y0 && rect.y1 <= outer.y1);
}

View File

@ -99,24 +99,6 @@ view_get_cursor_xy(View *view){
return(result);
}
#if 0
internal f32
view_get_scroll_y(View *view){
f32 v = 0;
if (!view->transient.ui_mode){
File_Edit_Positions *edit_pos = view->transient.edit_pos;
TentativeAssert(edit_pos != 0);
if (edit_pos != 0){
v = edit_pos->scroll.scroll_y;
}
}
else{
// TODO(allen): // TODO(allen): // TODO(allen): // TODO(allen):
}
return(v);
}
#endif
inline Cursor_Limits
view_cursor_limits(View *view){
Cursor_Limits limits = {0};

View File

@ -319,12 +319,12 @@ do_render_file_view(System_Functions *system, View *view, Models *models, GUI_Sc
u32 pop_color = style->main.file_info_style.pop2_color;
f32_Rect inner = get_inner_rect(item_rect, 3);
draw_rectangle(target, inner, back);
draw_margin(target, item_rect, inner, margin_color);
i32 x = (i32)inner.x0 + 3;
i32 y = (i32)inner.y0 + line_height/2 - 1;
x = ceil32(draw_string(system, target, font_id, item->option.string, x, y, text_color));
x += (i32)font_string_width(system, target, font_id, " ");
draw_string(system, target, font_id, item->option.status, x, y, pop_color);
draw_margin(target, item_rect, inner, margin_color);
}break;
case UIType_TextField:

View File

@ -89,9 +89,9 @@ generate_keycode_enum(){
append(&out, "enum{\n");
#define DefKeyEnum(n) append(&out, "key_" #n " = "); append_int_to_str(&out, key_##n); append(&out, ",\n");
KEY_LIST(DefKeyEnum)
KEY_LIST(DefKeyEnum);
#undef DefKeyEnum
append(&out, "};\n");
append(&out, "};\n");
append(&out,
"static char*\n"
@ -100,13 +100,13 @@ generate_keycode_enum(){
"switch(key_code){\n");
#define KeyCase(n) append(&out, "case key_" #n ": result = \"key_" #n "\"; *size = sizeof(\"key_" #n "\")-1; break;\n");
KEY_LIST(KeyCase)
KEY_LIST(KeyCase);
#undef KeyCase
append(&out,
"}\n"
"return(result);\n"
"}\n");
append(&out,
"}\n"
"return(result);\n"
"}\n");
fm_write_file(filename_keycodes, out.str, out.size);
out.size = 0;
@ -119,18 +119,18 @@ internal void
struct_begin(String *str, char *name){
append(str, "struct ");
append(str, name);
append(str, "{\n"); //}
append(str, "{\n");
}
internal void
enum_begin(String *str, char *name){
append(str, "enum ");
append(str, name);
append(str, "{\n"); //}
append(str, "{\n");
}
internal void
struct_end(String *str){ //{
struct_end(String *str){
append(str, "};\n\n");
}
@ -773,6 +773,7 @@ generate_remapping_code_and_data(){
bind(mappings, 'F', MDFR_ALT , list_all_substring_locations_case_insensitive);
bind(mappings, 'g', MDFR_CTRL, goto_line);
bind(mappings, 'G', MDFR_CTRL, list_all_locations_of_selection);
bind(mappings, 'j', MDFR_CTRL, snippet_lister);
bind(mappings, 'K', MDFR_CTRL, kill_buffer);
bind(mappings, 'L', MDFR_CTRL, duplicate_line);
bind(mappings, 'm', MDFR_CTRL, cursor_mark_swap);

View File

@ -3,34 +3,16 @@
{
Features
{
[] fix the thing with thing in the lister thing with lister command things.
[] Cool Listers
{
[x] Command Lister
[x] Convert Jump List to Lister
[x] Function Lister
{
[x] Automatically Make Lister for Function List
[x] Make List For All Buffers
}
[] Snippet Lister
[] Turbo-Word-Complete Lister
[] Project Command Lister
[] Project FKey Remapper
[] Project Mode Lister
}
[] Clip-Box inside UI rects (or at least stop the string before it overflows.)
[] Automatically insert a space after the main name
[] Color Pallette Expansion For Keywords
[] Color Pallette Expansion For Paren/Brace Matching
[] Visible Markers
{
[] Line Highlight
[] Cursor Block
[] Cursor Bar
[] Wire Cursor Block
[] Cursor Line
[] Highlight Range
}
[] Color Pallette Expansion For Keywords
[] Color Pallette Expansion For Paren/Brace Matching
[] Reload all out of sync files
[] Doubly Linked List Node Managed Object
}
@ -56,6 +38,9 @@ Long Term
{
Features
{
[] Project FKey Remapper
[] Project Mode Lister
[] Turbo-Word-Complete Lister
[] Renderer Modularity
[] Software Renderer
[] Undo Upgrade
@ -81,7 +66,14 @@ Change Log
[x] Separate distinct buffer groups by newline
[x] If no results put message explaining that fact (search buffer)
[x] Quit UI events
[x] Exact Matches Sort to Top Always ALWAYS ALWAYS ALWAYS
[x] Exact Matches Sort to Top Always ALWAYS ALWAYS ALWAYS[x] Cool Listers
{
[x] Command Lister
[x] Convert Jump List to Lister
[x] Function Lister
[x] Snippet Lister
[x] Project Command Lister
}
}
}