finished up the dangling todo items: fixed the click position bug, setup auto-indent-on-save, and finished the project fkey system
parent
cd6bed08e5
commit
9f8a00169c
|
@ -46,6 +46,7 @@ enum Special_Hook_ID{
|
||||||
_hook_scroll_rule = hook_type_count,
|
_hook_scroll_rule = hook_type_count,
|
||||||
_hook_new_file,
|
_hook_new_file,
|
||||||
_hook_open_file,
|
_hook_open_file,
|
||||||
|
_hook_save_file,
|
||||||
_hook_command_caller,
|
_hook_command_caller,
|
||||||
_hook_input_filter,
|
_hook_input_filter,
|
||||||
};
|
};
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#define BUFFER_REPLACE_RANGE_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len)
|
#define BUFFER_REPLACE_RANGE_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len)
|
||||||
#define BUFFER_COMPUTE_CURSOR_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out)
|
#define BUFFER_COMPUTE_CURSOR_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out)
|
||||||
#define BUFFER_BATCH_EDIT_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type)
|
#define BUFFER_BATCH_EDIT_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type)
|
||||||
#define BUFFER_GET_SETTING_SIG(n) int32_t n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out)
|
#define BUFFER_GET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out)
|
||||||
#define BUFFER_SET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value)
|
#define BUFFER_SET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value)
|
||||||
#define BUFFER_TOKEN_COUNT_SIG(n) int32_t n(Application_Links *app, Buffer_Summary *buffer)
|
#define BUFFER_TOKEN_COUNT_SIG(n) int32_t n(Application_Links *app, Buffer_Summary *buffer)
|
||||||
#define BUFFER_READ_TOKENS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out)
|
#define BUFFER_READ_TOKENS_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out)
|
||||||
|
@ -360,7 +360,7 @@ static inline bool32 buffer_read_range(Application_Links *app, Buffer_Summary *b
|
||||||
static inline bool32 buffer_replace_range(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len){return(app->buffer_replace_range(app, buffer, start, end, str, len));}
|
static inline bool32 buffer_replace_range(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len){return(app->buffer_replace_range(app, buffer, start, end, str, len));}
|
||||||
static inline bool32 buffer_compute_cursor(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out){return(app->buffer_compute_cursor(app, buffer, seek, cursor_out));}
|
static inline bool32 buffer_compute_cursor(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out){return(app->buffer_compute_cursor(app, buffer, seek, cursor_out));}
|
||||||
static inline bool32 buffer_batch_edit(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type){return(app->buffer_batch_edit(app, buffer, str, str_len, edits, edit_count, type));}
|
static inline bool32 buffer_batch_edit(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type){return(app->buffer_batch_edit(app, buffer, str, str_len, edits, edit_count, type));}
|
||||||
static inline int32_t buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting(app, buffer, setting, value_out));}
|
static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting(app, buffer, setting, value_out));}
|
||||||
static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting(app, buffer, setting, value));}
|
static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting(app, buffer, setting, value));}
|
||||||
static inline int32_t buffer_token_count(Application_Links *app, Buffer_Summary *buffer){return(app->buffer_token_count(app, buffer));}
|
static inline int32_t buffer_token_count(Application_Links *app, Buffer_Summary *buffer){return(app->buffer_token_count(app, buffer));}
|
||||||
static inline bool32 buffer_read_tokens(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out){return(app->buffer_read_tokens(app, buffer, start_token, end_token, tokens_out));}
|
static inline bool32 buffer_read_tokens(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out){return(app->buffer_read_tokens(app, buffer, start_token, end_token, tokens_out));}
|
||||||
|
@ -428,7 +428,7 @@ static inline bool32 buffer_read_range(Application_Links *app, Buffer_Summary *b
|
||||||
static inline bool32 buffer_replace_range(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len){return(app->buffer_replace_range_(app, buffer, start, end, str, len));}
|
static inline bool32 buffer_replace_range(Application_Links *app, Buffer_Summary *buffer, int32_t start, int32_t end, char *str, int32_t len){return(app->buffer_replace_range_(app, buffer, start, end, str, len));}
|
||||||
static inline bool32 buffer_compute_cursor(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out){return(app->buffer_compute_cursor_(app, buffer, seek, cursor_out));}
|
static inline bool32 buffer_compute_cursor(Application_Links *app, Buffer_Summary *buffer, Buffer_Seek seek, Partial_Cursor *cursor_out){return(app->buffer_compute_cursor_(app, buffer, seek, cursor_out));}
|
||||||
static inline bool32 buffer_batch_edit(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type){return(app->buffer_batch_edit_(app, buffer, str, str_len, edits, edit_count, type));}
|
static inline bool32 buffer_batch_edit(Application_Links *app, Buffer_Summary *buffer, char *str, int32_t str_len, Buffer_Edit *edits, int32_t edit_count, Buffer_Batch_Edit_Type type){return(app->buffer_batch_edit_(app, buffer, str, str_len, edits, edit_count, type));}
|
||||||
static inline int32_t buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting_(app, buffer, setting, value_out));}
|
static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting_(app, buffer, setting, value_out));}
|
||||||
static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting_(app, buffer, setting, value));}
|
static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting_(app, buffer, setting, value));}
|
||||||
static inline int32_t buffer_token_count(Application_Links *app, Buffer_Summary *buffer){return(app->buffer_token_count_(app, buffer));}
|
static inline int32_t buffer_token_count(Application_Links *app, Buffer_Summary *buffer){return(app->buffer_token_count_(app, buffer));}
|
||||||
static inline bool32 buffer_read_tokens(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out){return(app->buffer_read_tokens_(app, buffer, start_token, end_token, tokens_out));}
|
static inline bool32 buffer_read_tokens(Application_Links *app, Buffer_Summary *buffer, int32_t start_token, int32_t end_token, Cpp_Token *tokens_out){return(app->buffer_read_tokens_(app, buffer, start_token, end_token, tokens_out));}
|
||||||
|
|
|
@ -160,7 +160,7 @@ HOOK_SIG(my_view_adjust){
|
||||||
for (View_Summary view = get_view_first(app, AccessAll);
|
for (View_Summary view = get_view_first(app, AccessAll);
|
||||||
view.exists;
|
view.exists;
|
||||||
get_view_next(app, &view, AccessAll)){
|
get_view_next(app, &view, AccessAll)){
|
||||||
new_wrap_width += view.file_region.x1 - view.file_region.x0;
|
new_wrap_width += view.view_region.x1 - view.view_region.x0;
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,7 +237,7 @@ OPEN_FILE_HOOK_SIG(my_file_settings){
|
||||||
if (treat_as_code && enable_code_wrapping && buffer.size < (1 << 18)){
|
if (treat_as_code && enable_code_wrapping && buffer.size < (1 << 18)){
|
||||||
// NOTE(allen|a4.0.12): There is a little bit of grossness going on here.
|
// NOTE(allen|a4.0.12): There is a little bit of grossness going on here.
|
||||||
// If we set BufferSetting_Lex to true, it will launch a lexing job.
|
// If we set BufferSetting_Lex to true, it will launch a lexing job.
|
||||||
// If a lexing job is active when we set BufferSetting_VirtualWhitespace on that call can fail.
|
// If a lexing job is active when we set BufferSetting_VirtualWhitespace, the call can fail.
|
||||||
// Unfortunantely without tokens virtual whitespace doesn't really make sense.
|
// Unfortunantely without tokens virtual whitespace doesn't really make sense.
|
||||||
// So for now I have it automatically turning on lexing when virtual whitespace is turned on.
|
// So for now I have it automatically turning on lexing when virtual whitespace is turned on.
|
||||||
// Cleaning some of that up is a goal for future versions.
|
// Cleaning some of that up is a goal for future versions.
|
||||||
|
@ -253,6 +253,22 @@ OPEN_FILE_HOOK_SIG(my_file_settings){
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OPEN_FILE_HOOK_SIG(my_file_save){
|
||||||
|
uint32_t access = AccessAll;
|
||||||
|
Buffer_Summary buffer = get_buffer(app, buffer_id, access);
|
||||||
|
assert(buffer.exists);
|
||||||
|
|
||||||
|
int32_t is_virtual = 0;
|
||||||
|
if (automatically_indent_text_on_save && buffer_get_setting(app, &buffer, BufferSetting_VirtualWhitespace, &is_virtual)){
|
||||||
|
if (is_virtual){
|
||||||
|
auto_tab_whole_file_by_summary(app, &buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no meaning for return
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE(allen|a4.0.9): The input filter allows you to modify the input
|
// NOTE(allen|a4.0.9): The input filter allows you to modify the input
|
||||||
// to a frame before 4coder starts processing it at all.
|
// to a frame before 4coder starts processing it at all.
|
||||||
//
|
//
|
||||||
|
@ -292,6 +308,47 @@ CUSTOM_COMMAND_SIG(toggle_mouse){
|
||||||
set_mouse_suppression(app, !suppressing_mouse);
|
set_mouse_suppression(app, !suppressing_mouse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CUSTOM_COMMAND_SIG(execute_arbitrary_command){
|
||||||
|
// NOTE(allen): This isn't a super powerful version of this command, I will expand
|
||||||
|
// upon it so that it has all the cmdid_* commands by default. However, with this
|
||||||
|
// as an example you have everything you need to make it work already. You could
|
||||||
|
// even use app->memory to create a hash table in the start hook.
|
||||||
|
Query_Bar bar;
|
||||||
|
char space[1024];
|
||||||
|
bar.prompt = make_lit_string("Command: ");
|
||||||
|
bar.string = make_fixed_width_string(space);
|
||||||
|
|
||||||
|
if (!query_user_string(app, &bar)) return;
|
||||||
|
|
||||||
|
// NOTE(allen): Here I chose to end this query bar because when I call another
|
||||||
|
// command it might ALSO have query bars and I don't want this one hanging
|
||||||
|
// around at that point. Since the bar exists on my stack the result of the query
|
||||||
|
// is still available in bar.string though.
|
||||||
|
end_query_bar(app, &bar, 0);
|
||||||
|
|
||||||
|
if (match_ss(bar.string, make_lit_string("load project"))){
|
||||||
|
exec_command(app, load_project);
|
||||||
|
}
|
||||||
|
else if (match_ss(bar.string, make_lit_string("open all code"))){
|
||||||
|
exec_command(app, open_all_code);
|
||||||
|
}
|
||||||
|
else if(match_ss(bar.string, make_lit_string("close all code"))){
|
||||||
|
exec_command(app, close_all_code);
|
||||||
|
}
|
||||||
|
else if (match_ss(bar.string, make_lit_string("open menu"))){
|
||||||
|
exec_command(app, cmdid_open_menu);
|
||||||
|
}
|
||||||
|
else if (match_ss(bar.string, make_lit_string("dos lines"))){
|
||||||
|
exec_command(app, eol_dosify);
|
||||||
|
}
|
||||||
|
else if (match_ss(bar.string, make_lit_string("nix lines"))){
|
||||||
|
exec_command(app, eol_nixify);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
print_message(app, literal("unrecognized command\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
default_keys(Bind_Helper *context){
|
default_keys(Bind_Helper *context){
|
||||||
begin_map(context, mapid_global);
|
begin_map(context, mapid_global);
|
||||||
|
@ -326,10 +383,30 @@ default_keys(Bind_Helper *context){
|
||||||
bind(context, 's', MDFR_ALT, show_scrollbar);
|
bind(context, 's', MDFR_ALT, show_scrollbar);
|
||||||
bind(context, 'w', MDFR_ALT, hide_scrollbar);
|
bind(context, 'w', MDFR_ALT, hide_scrollbar);
|
||||||
|
|
||||||
bind(context, key_f2, MDFR_NONE, toggle_mouse);
|
bind(context, key_f2, MDFR_CTRL, toggle_mouse);
|
||||||
bind(context, key_page_up, MDFR_CTRL, toggle_fullscreen);
|
bind(context, key_page_up, MDFR_CTRL, toggle_fullscreen);
|
||||||
bind(context, 'E', MDFR_ALT, exit_4coder);
|
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);
|
end_map(context);
|
||||||
|
|
||||||
begin_map(context, my_code_map);
|
begin_map(context, my_code_map);
|
||||||
|
@ -481,6 +558,7 @@ get_bindings(void *data, int32_t size){
|
||||||
set_hook(context, hook_view_size_change, my_view_adjust);
|
set_hook(context, hook_view_size_change, my_view_adjust);
|
||||||
|
|
||||||
set_open_file_hook(context, my_file_settings);
|
set_open_file_hook(context, my_file_settings);
|
||||||
|
set_save_file_hook(context, my_file_save);
|
||||||
set_command_caller(context, default_command_caller);
|
set_command_caller(context, default_command_caller);
|
||||||
set_input_filter(context, my_suppress_mouse_filter);
|
set_input_filter(context, my_suppress_mouse_filter);
|
||||||
set_scroll_rule(context, smooth_scroll_rule);
|
set_scroll_rule(context, smooth_scroll_rule);
|
||||||
|
|
|
@ -1036,15 +1036,17 @@ CUSTOM_COMMAND_SIG(auto_tab_line_at_cursor){
|
||||||
move_past_lead_whitespace(app, &view, &buffer);
|
move_past_lead_whitespace(app, &view, &buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
auto_tab_whole_file_by_summary(Application_Links *app, Buffer_Summary *buffer){
|
||||||
|
buffer_auto_indent(app, buffer, 0, buffer->size, DEF_TAB_WIDTH, DEFAULT_INDENT_FLAGS | AutoIndent_FullTokens);
|
||||||
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(auto_tab_whole_file){
|
CUSTOM_COMMAND_SIG(auto_tab_whole_file){
|
||||||
uint32_t access = AccessOpen;
|
uint32_t access = AccessOpen;
|
||||||
View_Summary view = get_active_view(app, access);
|
View_Summary view = get_active_view(app, access);
|
||||||
Buffer_Summary buffer = get_buffer(app, view.buffer_id, access);
|
Buffer_Summary buffer = get_buffer(app, view.buffer_id, access);
|
||||||
|
|
||||||
buffer_auto_indent(app, &buffer,
|
auto_tab_whole_file_by_summary(app, &buffer);
|
||||||
0, buffer.size,
|
|
||||||
DEF_TAB_WIDTH,
|
|
||||||
DEFAULT_INDENT_FLAGS | AutoIndent_FullTokens);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(auto_tab_range){
|
CUSTOM_COMMAND_SIG(auto_tab_range){
|
||||||
|
@ -2501,77 +2503,9 @@ CUSTOM_COMMAND_SIG(query_replace){
|
||||||
// Fast Buffer Management
|
// Fast Buffer Management
|
||||||
//
|
//
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(close_all_code){
|
static char out_buffer_space[1024];
|
||||||
String extension;
|
static char command_space[1024];
|
||||||
Buffer_Summary buffer;
|
static char hot_directory_space[1024];
|
||||||
|
|
||||||
// TODO(allen): Get better memory constructs to the custom layer
|
|
||||||
// so that it doesn't have to rely on arbitrary limits like this one.
|
|
||||||
int32_t buffers_to_close[2048];
|
|
||||||
int32_t buffers_to_close_count = 0;
|
|
||||||
|
|
||||||
uint32_t access = AccessAll;
|
|
||||||
for (buffer = get_buffer_first(app, access);
|
|
||||||
buffer.exists;
|
|
||||||
get_buffer_next(app, &buffer, access)){
|
|
||||||
|
|
||||||
extension = file_extension(make_string(buffer.file_name, buffer.file_name_len));
|
|
||||||
if (match_ss(extension, make_lit_string("cpp")) ||
|
|
||||||
match_ss(extension, make_lit_string("hpp")) ||
|
|
||||||
match_ss(extension, make_lit_string("c")) ||
|
|
||||||
match_ss(extension, make_lit_string("h")) ||
|
|
||||||
match_ss(extension, make_lit_string("cc"))){
|
|
||||||
|
|
||||||
buffers_to_close[buffers_to_close_count++] = buffer.buffer_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < buffers_to_close_count; ++i){
|
|
||||||
kill_buffer(app, buffer_identifier(buffers_to_close[i]), true, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(open_all_code){
|
|
||||||
// NOTE(allen|a3.4.4): This method of getting the hot directory works
|
|
||||||
// because this custom.cpp gives no special meaning to app->memory
|
|
||||||
// and doesn't set up a persistent allocation system within app->memory.
|
|
||||||
// push_directory isn't a very good option since it's tied to the parameter
|
|
||||||
// stack, so I am phasing that idea out now.
|
|
||||||
String dir = make_string_cap(app->memory, 0, app->memory_size);
|
|
||||||
dir.size = directory_get_hot(app, dir.str, dir.memory_size);
|
|
||||||
int32_t dir_size = dir.size;
|
|
||||||
|
|
||||||
// NOTE(allen|a3.4.4): Here we get the list of files in this directory.
|
|
||||||
// Notice that we free_file_list at the end.
|
|
||||||
File_List list = get_file_list(app, dir.str, dir.size);
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < list.count; ++i){
|
|
||||||
File_Info *info = list.infos + i;
|
|
||||||
if (!info->folder){
|
|
||||||
String extension = make_string_cap(info->filename, info->filename_len, info->filename_len+1);
|
|
||||||
extension = file_extension(extension);
|
|
||||||
if (match_ss(extension, make_lit_string("cpp")) ||
|
|
||||||
match_ss(extension, make_lit_string("hpp")) ||
|
|
||||||
match_ss(extension, make_lit_string("c")) ||
|
|
||||||
match_ss(extension, make_lit_string("h")) ||
|
|
||||||
match_ss(extension, make_lit_string("cc"))){
|
|
||||||
// NOTE(allen): There's no way in the 4coder API to use relative
|
|
||||||
// paths at the moment, so everything should be full paths. Which is
|
|
||||||
// managable. Here simply set the dir string size back to where it
|
|
||||||
// was originally, so that new appends overwrite old ones.
|
|
||||||
dir.size = dir_size;
|
|
||||||
append_sc(&dir, info->filename);
|
|
||||||
create_buffer(app, dir.str, dir.size, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free_file_list(app, list);
|
|
||||||
}
|
|
||||||
|
|
||||||
char out_buffer_space[1024];
|
|
||||||
char command_space[1024];
|
|
||||||
char hot_directory_space[1024];
|
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(execute_any_cli){
|
CUSTOM_COMMAND_SIG(execute_any_cli){
|
||||||
Query_Bar bar_out = {0};
|
Query_Bar bar_out = {0};
|
||||||
|
@ -2591,11 +2525,7 @@ CUSTOM_COMMAND_SIG(execute_any_cli){
|
||||||
uint32_t access = AccessAll;
|
uint32_t access = AccessAll;
|
||||||
View_Summary view = get_active_view(app, access);
|
View_Summary view = get_active_view(app, access);
|
||||||
|
|
||||||
exec_system_command(app, &view,
|
exec_system_command(app, &view, buffer_identifier(bar_out.string.str, bar_out.string.size), hot_directory.str, hot_directory.size, bar_cmd.string.str, bar_cmd.string.size, CLI_OverlapWithConflict | CLI_CursorAtEnd);
|
||||||
buffer_identifier(bar_out.string.str, bar_out.string.size),
|
|
||||||
hot_directory.str, hot_directory.size,
|
|
||||||
bar_cmd.string.str, bar_cmd.string.size,
|
|
||||||
CLI_OverlapWithConflict | CLI_CursorAtEnd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(execute_previous_cli){
|
CUSTOM_COMMAND_SIG(execute_previous_cli){
|
||||||
|
@ -2607,11 +2537,7 @@ CUSTOM_COMMAND_SIG(execute_previous_cli){
|
||||||
uint32_t access = AccessAll;
|
uint32_t access = AccessAll;
|
||||||
View_Summary view = get_active_view(app, access);
|
View_Summary view = get_active_view(app, access);
|
||||||
|
|
||||||
exec_system_command(app, &view,
|
exec_system_command(app, &view, buffer_identifier(out_buffer.str, out_buffer.size), hot_directory.str, hot_directory.size, cmd.str, cmd.size, CLI_OverlapWithConflict | CLI_CursorAtEnd);
|
||||||
buffer_identifier(out_buffer.str, out_buffer.size),
|
|
||||||
hot_directory.str, hot_directory.size,
|
|
||||||
cmd.str, cmd.size,
|
|
||||||
CLI_OverlapWithConflict | CLI_CursorAtEnd);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2698,8 +2624,7 @@ get_search_all_string(Application_Links *app, Query_Bar *bar){
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
generic_search_all_buffers(Application_Links *app, General_Memory *general, Partition *part,
|
generic_search_all_buffers(Application_Links *app, General_Memory *general, Partition *part, String string, uint32_t match_flags){
|
||||||
String string, uint32_t match_flags){
|
|
||||||
Search_Set set = {0};
|
Search_Set set = {0};
|
||||||
Search_Iter iter = {0};
|
Search_Iter iter = {0};
|
||||||
|
|
||||||
|
@ -2828,32 +2753,28 @@ CUSTOM_COMMAND_SIG(list_all_locations){
|
||||||
Query_Bar bar;
|
Query_Bar bar;
|
||||||
get_search_all_string(app, &bar);
|
get_search_all_string(app, &bar);
|
||||||
if (bar.string.size == 0) return;
|
if (bar.string.size == 0) return;
|
||||||
generic_search_all_buffers(app, &global_general, &global_part,
|
generic_search_all_buffers(app, &global_general, &global_part, bar.string, SearchFlag_MatchWholeWord);
|
||||||
bar.string, SearchFlag_MatchWholeWord);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(list_all_substring_locations){
|
CUSTOM_COMMAND_SIG(list_all_substring_locations){
|
||||||
Query_Bar bar;
|
Query_Bar bar;
|
||||||
get_search_all_string(app, &bar);
|
get_search_all_string(app, &bar);
|
||||||
if (bar.string.size == 0) return;
|
if (bar.string.size == 0) return;
|
||||||
generic_search_all_buffers(app, &global_general, &global_part,
|
generic_search_all_buffers(app, &global_general, &global_part, bar.string, SearchFlag_MatchSubstring);
|
||||||
bar.string, SearchFlag_MatchSubstring);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(list_all_locations_case_insensitive){
|
CUSTOM_COMMAND_SIG(list_all_locations_case_insensitive){
|
||||||
Query_Bar bar;
|
Query_Bar bar;
|
||||||
get_search_all_string(app, &bar);
|
get_search_all_string(app, &bar);
|
||||||
if (bar.string.size == 0) return;
|
if (bar.string.size == 0) return;
|
||||||
generic_search_all_buffers(app, &global_general, &global_part,
|
generic_search_all_buffers(app, &global_general, &global_part, bar.string, SearchFlag_CaseInsensitive | SearchFlag_MatchWholeWord);
|
||||||
bar.string, SearchFlag_CaseInsensitive | SearchFlag_MatchWholeWord);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(list_all_substring_locations_case_insensitive){
|
CUSTOM_COMMAND_SIG(list_all_substring_locations_case_insensitive){
|
||||||
Query_Bar bar;
|
Query_Bar bar;
|
||||||
get_search_all_string(app, &bar);
|
get_search_all_string(app, &bar);
|
||||||
if (bar.string.size == 0) return;
|
if (bar.string.size == 0) return;
|
||||||
generic_search_all_buffers(app, &global_general, &global_part,
|
generic_search_all_buffers(app, &global_general, &global_part, bar.string, SearchFlag_CaseInsensitive | SearchFlag_MatchSubstring);
|
||||||
bar.string, SearchFlag_CaseInsensitive | SearchFlag_MatchSubstring);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(list_all_locations_of_identifier){
|
CUSTOM_COMMAND_SIG(list_all_locations_of_identifier){
|
||||||
|
@ -3132,12 +3053,7 @@ standard_build_search(Application_Links *app, View_Summary *view, Buffer_Summary
|
||||||
append_s_char(&message, '\n');
|
append_s_char(&message, '\n');
|
||||||
print_message(app, message.str, message.size);
|
print_message(app, message.str, message.size);
|
||||||
|
|
||||||
|
exec_system_command(app, view, buffer_identifier(literal("*compilation*")), dir->str, dir->size, command->str, command->size, CLI_OverlapWithConflict);
|
||||||
exec_system_command(app, view,
|
|
||||||
buffer_identifier(literal("*compilation*")),
|
|
||||||
dir->str, dir->size,
|
|
||||||
command->str, command->size,
|
|
||||||
CLI_OverlapWithConflict);
|
|
||||||
result = true;
|
result = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3150,11 +3066,7 @@ standard_build_search(Application_Links *app, View_Summary *view, Buffer_Summary
|
||||||
String backup_command = make_fixed_width_string(backup_space);
|
String backup_command = make_fixed_width_string(backup_space);
|
||||||
append_ss(&backup_command, make_lit_string("echo could not find "));
|
append_ss(&backup_command, make_lit_string("echo could not find "));
|
||||||
append_ss(&backup_command, filename);
|
append_ss(&backup_command, filename);
|
||||||
exec_system_command(app, view,
|
exec_system_command(app, view, buffer_identifier(literal("*compilation*")), dir->str, dir->size, backup_command.str, backup_command.size, CLI_OverlapWithConflict);
|
||||||
buffer_identifier(literal("*compilation*")),
|
|
||||||
dir->str, dir->size,
|
|
||||||
backup_command.str, backup_command.size,
|
|
||||||
CLI_OverlapWithConflict);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3170,11 +3082,7 @@ static int32_t
|
||||||
execute_standard_build_search(Application_Links *app, View_Summary *view,
|
execute_standard_build_search(Application_Links *app, View_Summary *view,
|
||||||
Buffer_Summary *active_buffer,
|
Buffer_Summary *active_buffer,
|
||||||
String *dir, String *command, int32_t perform_backup){
|
String *dir, String *command, int32_t perform_backup){
|
||||||
int32_t result = standard_build_search(app, view,
|
int32_t result = standard_build_search(app, view, active_buffer, dir, command, perform_backup, true, make_lit_string("build.bat"), make_lit_string("build"));
|
||||||
active_buffer,
|
|
||||||
dir, command, perform_backup, true,
|
|
||||||
make_lit_string("build.bat"),
|
|
||||||
make_lit_string("build"));
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3183,7 +3091,6 @@ execute_standard_build_search(Application_Links *app, View_Summary *view,
|
||||||
// NOTE(allen): Build search rule for linux.
|
// NOTE(allen): Build search rule for linux.
|
||||||
static int32_t
|
static int32_t
|
||||||
execute_standard_build_search(Application_Links *app, View_Summary *view, Buffer_Summary *active_buffer, String *dir, String *command, bool32 perform_backup){
|
execute_standard_build_search(Application_Links *app, View_Summary *view, Buffer_Summary *active_buffer, String *dir, String *command, bool32 perform_backup){
|
||||||
|
|
||||||
char dir_space[512];
|
char dir_space[512];
|
||||||
String dir_copy = make_fixed_width_string(dir_space);
|
String dir_copy = make_fixed_width_string(dir_space);
|
||||||
copy(&dir_copy, *dir);
|
copy(&dir_copy, *dir);
|
||||||
|
@ -3205,8 +3112,7 @@ execute_standard_build_search(Application_Links *app, View_Summary *view, Buffer
|
||||||
// NOTE(allen): This searches first using the active file's directory,
|
// NOTE(allen): This searches first using the active file's directory,
|
||||||
// then if no build script is found, it searches from 4coders hot directory.
|
// then if no build script is found, it searches from 4coders hot directory.
|
||||||
static void
|
static void
|
||||||
execute_standard_build(Application_Links *app, View_Summary *view,
|
execute_standard_build(Application_Links *app, View_Summary *view, Buffer_Summary *active_buffer){
|
||||||
Buffer_Summary *active_buffer){
|
|
||||||
char dir_space[512];
|
char dir_space[512];
|
||||||
String dir = make_fixed_width_string(dir_space);
|
String dir = make_fixed_width_string(dir_space);
|
||||||
|
|
||||||
|
@ -3216,8 +3122,7 @@ execute_standard_build(Application_Links *app, View_Summary *view,
|
||||||
int32_t build_dir_type = get_build_directory(app, active_buffer, &dir);
|
int32_t build_dir_type = get_build_directory(app, active_buffer, &dir);
|
||||||
|
|
||||||
if (build_dir_type == BuildDir_AtFile){
|
if (build_dir_type == BuildDir_AtFile){
|
||||||
if (!execute_standard_build_search(app, view, active_buffer,
|
if (!execute_standard_build_search(app, view, active_buffer, &dir, &command, false)){
|
||||||
&dir, &command, false)){
|
|
||||||
dir.size = 0;
|
dir.size = 0;
|
||||||
command.size = 0;
|
command.size = 0;
|
||||||
build_dir_type = get_build_directory(app, 0, &dir);
|
build_dir_type = get_build_directory(app, 0, &dir);
|
||||||
|
@ -3225,8 +3130,7 @@ execute_standard_build(Application_Links *app, View_Summary *view,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (build_dir_type == BuildDir_AtHot){
|
if (build_dir_type == BuildDir_AtHot){
|
||||||
execute_standard_build_search(app, view, active_buffer,
|
execute_standard_build_search(app, view, active_buffer, &dir, &command, true);
|
||||||
&dir, &command, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3296,48 +3200,6 @@ CUSTOM_COMMAND_SIG(change_to_build_panel){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Other
|
|
||||||
//
|
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(execute_arbitrary_command){
|
|
||||||
// NOTE(allen): This isn't a super powerful version of this command, I will expand
|
|
||||||
// upon it so that it has all the cmdid_* commands by default. However, with this
|
|
||||||
// as an example you have everything you need to make it work already. You could
|
|
||||||
// even use app->memory to create a hash table in the start hook.
|
|
||||||
Query_Bar bar;
|
|
||||||
char space[1024];
|
|
||||||
bar.prompt = make_lit_string("Command: ");
|
|
||||||
bar.string = make_fixed_width_string(space);
|
|
||||||
|
|
||||||
if (!query_user_string(app, &bar)) return;
|
|
||||||
|
|
||||||
// NOTE(allen): Here I chose to end this query bar because when I call another
|
|
||||||
// command it might ALSO have query bars and I don't want this one hanging
|
|
||||||
// around at that point. Since the bar exists on my stack the result of the query
|
|
||||||
// is still available in bar.string though.
|
|
||||||
end_query_bar(app, &bar, 0);
|
|
||||||
|
|
||||||
if (match_ss(bar.string, make_lit_string("open all code"))){
|
|
||||||
exec_command(app, open_all_code);
|
|
||||||
}
|
|
||||||
else if(match_ss(bar.string, make_lit_string("close all code"))){
|
|
||||||
exec_command(app, close_all_code);
|
|
||||||
}
|
|
||||||
else if (match_ss(bar.string, make_lit_string("open menu"))){
|
|
||||||
exec_command(app, cmdid_open_menu);
|
|
||||||
}
|
|
||||||
else if (match_ss(bar.string, make_lit_string("dos lines"))){
|
|
||||||
exec_command(app, eol_dosify);
|
|
||||||
}
|
|
||||||
else if (match_ss(bar.string, make_lit_string("nix lines"))){
|
|
||||||
exec_command(app, eol_nixify);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
print_message(app, literal("unrecognized command\n"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(allen|a4): scroll rule information
|
// NOTE(allen|a4): scroll rule information
|
||||||
//
|
//
|
||||||
// The parameters:
|
// The parameters:
|
||||||
|
@ -3454,6 +3316,7 @@ struct Config_Line{
|
||||||
|
|
||||||
struct Config_Item{
|
struct Config_Item{
|
||||||
Config_Line line;
|
Config_Line line;
|
||||||
|
Cpp_Token_Array array;
|
||||||
char *mem;
|
char *mem;
|
||||||
String id;
|
String id;
|
||||||
int32_t subscript_index;
|
int32_t subscript_index;
|
||||||
|
@ -3461,6 +3324,7 @@ struct Config_Item{
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Config_Array_Reader{
|
struct Config_Array_Reader{
|
||||||
|
Cpp_Token_Array array;
|
||||||
char *mem;
|
char *mem;
|
||||||
int32_t i;
|
int32_t i;
|
||||||
int32_t val_array_end;
|
int32_t val_array_end;
|
||||||
|
@ -3484,7 +3348,7 @@ read_config_token(Cpp_Token_Array array, int32_t *i_ptr){
|
||||||
token = array.tokens[i];
|
token = array.tokens[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
i = *i_ptr;
|
*i_ptr = i;
|
||||||
|
|
||||||
return(token);
|
return(token);
|
||||||
}
|
}
|
||||||
|
@ -3502,7 +3366,7 @@ read_config_line(Cpp_Token_Array array, int32_t *i_ptr){
|
||||||
Cpp_Token token = read_config_token(array, &i);
|
Cpp_Token token = read_config_token(array, &i);
|
||||||
|
|
||||||
bool32 subscript_success = 1;
|
bool32 subscript_success = 1;
|
||||||
if (token.type == CPP_TOKEN_BRACE_OPEN){
|
if (token.type == CPP_TOKEN_BRACKET_OPEN){
|
||||||
subscript_success = 0;
|
subscript_success = 0;
|
||||||
++i;
|
++i;
|
||||||
if (i < array.count){
|
if (i < array.count){
|
||||||
|
@ -3511,7 +3375,7 @@ read_config_line(Cpp_Token_Array array, int32_t *i_ptr){
|
||||||
++i;
|
++i;
|
||||||
if (i < array.count){
|
if (i < array.count){
|
||||||
token = read_config_token(array, &i);
|
token = read_config_token(array, &i);
|
||||||
if (token.type == CPP_TOKEN_BRACE_CLOSE){
|
if (token.type == CPP_TOKEN_BRACKET_CLOSE){
|
||||||
++i;
|
++i;
|
||||||
if (i < array.count){
|
if (i < array.count){
|
||||||
token = read_config_token(array, &i);
|
token = read_config_token(array, &i);
|
||||||
|
@ -3540,7 +3404,10 @@ read_config_line(Cpp_Token_Array array, int32_t *i_ptr){
|
||||||
bool32 expecting_array_item = 1;
|
bool32 expecting_array_item = 1;
|
||||||
for (; i < array.count; ++i){
|
for (; i < array.count; ++i){
|
||||||
Cpp_Token array_token = read_config_token(array, &i);
|
Cpp_Token array_token = read_config_token(array, &i);
|
||||||
if (array_token.type != CPP_TOKEN_BRACE_CLOSE){
|
if (array_token.size == 0){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (array_token.type == CPP_TOKEN_BRACE_CLOSE){
|
||||||
config_line.val_array_end = i;
|
config_line.val_array_end = i;
|
||||||
array_success = 1;
|
array_success = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -3596,11 +3463,14 @@ read_config_line(Cpp_Token_Array array, int32_t *i_ptr){
|
||||||
}
|
}
|
||||||
|
|
||||||
static Config_Item
|
static Config_Item
|
||||||
get_config_item(Config_Line line, char *mem){
|
get_config_item(Config_Line line, char *mem, Cpp_Token_Array array){
|
||||||
Config_Item item = {0};
|
Config_Item item = {0};
|
||||||
item.line = line;
|
item.line = line;
|
||||||
|
item.array = array;
|
||||||
item.mem = mem;
|
item.mem = mem;
|
||||||
item.id = make_string(mem + line.id_token.start,line.id_token.size);
|
if (line.id_token.size != 0){
|
||||||
|
item.id = make_string(mem + line.id_token.start, line.id_token.size);
|
||||||
|
}
|
||||||
|
|
||||||
if (line.subscript_token.size != 0){
|
if (line.subscript_token.size != 0){
|
||||||
String subscript_str = make_string(mem + line.subscript_token.start,line.subscript_token.size);
|
String subscript_str = make_string(mem + line.subscript_token.start,line.subscript_token.size);
|
||||||
|
@ -3625,6 +3495,7 @@ config_var(Config_Item item, char *var_name, int32_t *subscript, uint32_t token_
|
||||||
subscript_succes = 0;
|
subscript_succes = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subscript_succes){
|
if (subscript_succes){
|
||||||
if (var_out){
|
if (var_out){
|
||||||
switch (token_type){
|
switch (token_type){
|
||||||
|
@ -3647,6 +3518,7 @@ config_var(Config_Item item, char *var_name, int32_t *subscript, uint32_t token_
|
||||||
case CPP_TOKEN_BRACE_OPEN:
|
case CPP_TOKEN_BRACE_OPEN:
|
||||||
{
|
{
|
||||||
Config_Array_Reader *array_reader = (Config_Array_Reader*)var_out;
|
Config_Array_Reader *array_reader = (Config_Array_Reader*)var_out;
|
||||||
|
array_reader->array = item.array;
|
||||||
array_reader->mem = item.mem;
|
array_reader->mem = item.mem;
|
||||||
array_reader->i = item.line.val_array_start;
|
array_reader->i = item.line.val_array_start;
|
||||||
array_reader->val_array_end = item.line.val_array_end;
|
array_reader->val_array_end = item.line.val_array_end;
|
||||||
|
@ -3687,9 +3559,37 @@ config_array_var(Config_Item item, char *var_name, int32_t *subscript, Config_Ar
|
||||||
|
|
||||||
static bool32
|
static bool32
|
||||||
config_array_next_item(Config_Array_Reader *array_reader, Config_Item *item){
|
config_array_next_item(Config_Array_Reader *array_reader, Config_Item *item){
|
||||||
|
bool32 result = 0;
|
||||||
|
|
||||||
|
for (;array_reader->i < array_reader->val_array_end;
|
||||||
|
++array_reader->i){
|
||||||
|
Cpp_Token array_token = read_config_token(array_reader->array, &array_reader->i);
|
||||||
|
if (array_token.size == 0 || array_reader->i >= array_reader->val_array_end){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_token.type == CPP_TOKEN_BRACE_CLOSE){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (array_token.type){
|
||||||
|
case CPP_TOKEN_BOOLEAN_CONSTANT:
|
||||||
|
case CPP_TOKEN_INTEGER_CONSTANT:
|
||||||
|
case CPP_TOKEN_STRING_CONSTANT:
|
||||||
|
{
|
||||||
|
Config_Line line = {0};
|
||||||
|
line.val_token = array_token;
|
||||||
|
line.read_success = 1;
|
||||||
|
*item = get_config_item(line, array_reader->mem, array_reader->array);
|
||||||
|
result = 1;
|
||||||
|
++array_reader->i;
|
||||||
|
goto doublebreak;
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
doublebreak:;
|
||||||
|
|
||||||
bool32 result = (array_reader->good);
|
array_reader->good = result;
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3705,6 +3605,8 @@ static bool32 enable_code_wrapping = 1;
|
||||||
static bool32 automatically_adjust_wrapping = 1;
|
static bool32 automatically_adjust_wrapping = 1;
|
||||||
static int32_t default_wrap_width = 672;
|
static int32_t default_wrap_width = 672;
|
||||||
static int32_t default_min_base_width = 550;
|
static int32_t default_min_base_width = 550;
|
||||||
|
static bool32 automatically_indent_text_on_save = 1;
|
||||||
|
|
||||||
static String default_theme_name = make_lit_string("4coder");
|
static String default_theme_name = make_lit_string("4coder");
|
||||||
static String default_font_name = make_lit_string("Liberation Sans");
|
static String default_font_name = make_lit_string("Liberation Sans");
|
||||||
|
|
||||||
|
@ -3782,10 +3684,11 @@ process_config_file(Application_Links *app){
|
||||||
Config_Line config_line = read_config_line(array, &i);
|
Config_Line config_line = read_config_line(array, &i);
|
||||||
|
|
||||||
if (config_line.read_success){
|
if (config_line.read_success){
|
||||||
Config_Item item = get_config_item(config_line, mem);
|
Config_Item item = get_config_item(config_line, mem, array);
|
||||||
|
|
||||||
config_bool_var(item, "enable_code_wrapping", 0, &enable_code_wrapping);
|
config_bool_var(item, "enable_code_wrapping", 0, &enable_code_wrapping);
|
||||||
config_bool_var(item, "automatically_adjust_wrapping", 0, &automatically_adjust_wrapping);
|
config_bool_var(item, "automatically_adjust_wrapping", 0, &automatically_adjust_wrapping);
|
||||||
|
config_bool_var(item, "automatically_indent_text_on_save", 0, &automatically_indent_text_on_save);
|
||||||
|
|
||||||
config_int_var(item, "default_wrap_width", 0, &new_wrap_width);
|
config_int_var(item, "default_wrap_width", 0, &new_wrap_width);
|
||||||
config_int_var(item, "default_min_base_width", 0, &new_min_base_width);
|
config_int_var(item, "default_min_base_width", 0, &new_min_base_width);
|
||||||
|
@ -3807,7 +3710,223 @@ process_config_file(Application_Links *app){
|
||||||
|
|
||||||
// NOTE(allen): Project system setup
|
// NOTE(allen): Project system setup
|
||||||
|
|
||||||
static char *loaded_project = 0;
|
static char *default_extensions[] = {
|
||||||
|
"cpp",
|
||||||
|
"hpp",
|
||||||
|
"c",
|
||||||
|
"h",
|
||||||
|
"cc"
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Fkey_Command{
|
||||||
|
char command[128];
|
||||||
|
char out[128];
|
||||||
|
bool32 use_build_panel;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Project{
|
||||||
|
char dir_space[256];
|
||||||
|
char *dir;
|
||||||
|
int32_t dir_len;
|
||||||
|
|
||||||
|
char extension_space[256];
|
||||||
|
char *extensions[94];
|
||||||
|
int32_t extension_count;
|
||||||
|
|
||||||
|
Fkey_Command fkey_commands[16];
|
||||||
|
|
||||||
|
bool32 close_all_code_when_this_project_closes;
|
||||||
|
bool32 close_all_files_when_project_opens;
|
||||||
|
};
|
||||||
|
|
||||||
|
static Project null_project = {};
|
||||||
|
static Project current_project = {};
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_project_extensions(Project *project, String src){
|
||||||
|
int32_t mode = 0;
|
||||||
|
int32_t j = 0, k = 0;
|
||||||
|
for (int32_t i = 0; i < src.size; ++i){
|
||||||
|
switch (mode){
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
if (src.str[i] == '.'){
|
||||||
|
mode = 1;
|
||||||
|
project->extensions[k++] = &project->extension_space[j];
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
if (src.str[i] == '.'){
|
||||||
|
project->extension_space[j++] = 0;
|
||||||
|
project->extensions[k++] = &project->extension_space[j];
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
project->extension_space[j++] = src.str[i];
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
project->extension_space[j++] = 0;
|
||||||
|
project->extension_count = k;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(allen): make this a string operation or a lexer operation or something
|
||||||
|
static void
|
||||||
|
interpret_escaped_string(char *dst, String src){
|
||||||
|
int32_t mode = 0;
|
||||||
|
int32_t j = 0;
|
||||||
|
for (int32_t i = 0; i < src.size; ++i){
|
||||||
|
switch (mode){
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
if (src.str[i] == '\\'){
|
||||||
|
mode = 1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
dst[j++] = src.str[i];
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
switch (src.str[i]){
|
||||||
|
case '\\':{dst[j++] = '\\'; mode = 0;}break;
|
||||||
|
case 'n': {dst[j++] = '\n'; mode = 0;}break;
|
||||||
|
case 't': {dst[j++] = '\t'; mode = 0;}break;
|
||||||
|
case '"': {dst[j++] = '"'; mode = 0;}break;
|
||||||
|
case '0': {dst[j++] = '\0'; mode = 0;}break;
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dst[j] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
close_all_files_with_extension(Application_Links *app, Partition *scratch_part, char **extension_list, int32_t extension_count){
|
||||||
|
Temp_Memory temp = begin_temp_memory(scratch_part);
|
||||||
|
|
||||||
|
int32_t buffers_to_close_max = partition_remaining(scratch_part)/sizeof(int32_t);
|
||||||
|
int32_t *buffers_to_close = push_array(scratch_part, int32_t, buffers_to_close_max);
|
||||||
|
|
||||||
|
int32_t buffers_to_close_count = 0;
|
||||||
|
bool32 do_repeat = 0;
|
||||||
|
do{
|
||||||
|
buffers_to_close_count = 0;
|
||||||
|
do_repeat = 0;
|
||||||
|
|
||||||
|
uint32_t access = AccessAll;
|
||||||
|
Buffer_Summary buffer = {0};
|
||||||
|
for (buffer = get_buffer_first(app, access);
|
||||||
|
buffer.exists;
|
||||||
|
get_buffer_next(app, &buffer, access)){
|
||||||
|
|
||||||
|
bool32 is_match = 1;
|
||||||
|
if (extension_count > 0){
|
||||||
|
String extension = file_extension(make_string(buffer.file_name, buffer.file_name_len));
|
||||||
|
is_match = 0;
|
||||||
|
for (int32_t i = 0; i < extension_count; ++i){
|
||||||
|
if (match(extension, extension_list[i])){
|
||||||
|
is_match = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_match){
|
||||||
|
if (buffers_to_close_count >= buffers_to_close_max){
|
||||||
|
do_repeat = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
buffers_to_close[buffers_to_close_count++] = buffer.buffer_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < buffers_to_close_count; ++i){
|
||||||
|
kill_buffer(app, buffer_identifier(buffers_to_close[i]), true, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(do_repeat);
|
||||||
|
|
||||||
|
end_temp_memory(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
open_all_files_with_extension(Application_Links *app, Partition *scratch_part, char **extension_list, int32_t extension_count){
|
||||||
|
Temp_Memory temp = begin_temp_memory(scratch_part);
|
||||||
|
|
||||||
|
int32_t max_size = partition_remaining(scratch_part);
|
||||||
|
char *memory = push_array(scratch_part, char, max_size);
|
||||||
|
|
||||||
|
String dir = make_string_cap(memory, 0, max_size);
|
||||||
|
dir.size = directory_get_hot(app, dir.str, dir.memory_size);
|
||||||
|
int32_t dir_size = dir.size;
|
||||||
|
|
||||||
|
// NOTE(allen|a3.4.4): Here we get the list of files in this directory.
|
||||||
|
// Notice that we free_file_list at the end.
|
||||||
|
File_List list = get_file_list(app, dir.str, dir.size);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < list.count; ++i){
|
||||||
|
File_Info *info = list.infos + i;
|
||||||
|
if (!info->folder){
|
||||||
|
bool32 is_match = 1;
|
||||||
|
|
||||||
|
if (extension_count > 0){
|
||||||
|
is_match = 0;
|
||||||
|
|
||||||
|
String extension = make_string_cap(info->filename, info->filename_len, info->filename_len+1);
|
||||||
|
extension = file_extension(extension);
|
||||||
|
for (int32_t j = 0; j < extension_count; ++j){
|
||||||
|
if (match(extension, extension_list[j])){
|
||||||
|
is_match = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_match){
|
||||||
|
// NOTE(allen): There's no way in the 4coder API to use relative
|
||||||
|
// paths at the moment, so everything should be full paths. Which is
|
||||||
|
// managable. Here simply set the dir string size back to where it
|
||||||
|
// was originally, so that new appends overwrite old ones.
|
||||||
|
dir.size = dir_size;
|
||||||
|
append_sc(&dir, info->filename);
|
||||||
|
create_buffer(app, dir.str, dir.size, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free_file_list(app, list);
|
||||||
|
|
||||||
|
end_temp_memory(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char**
|
||||||
|
get_standard_code_extensions(int32_t *extension_count_out){
|
||||||
|
char **extension_list = default_extensions;
|
||||||
|
int32_t extension_count = ArrayCount(default_extensions);
|
||||||
|
if (current_project.dir != 0){
|
||||||
|
extension_list = current_project.extensions;
|
||||||
|
extension_count = current_project.extension_count;
|
||||||
|
}
|
||||||
|
*extension_count_out = extension_count;
|
||||||
|
return(extension_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE(allen|a4.0.14): open_all_code and close_all_code now use the extensions set in the loaded project. If there is no project loaded the extensions ".cpp.hpp.c.h.cc" are used.
|
||||||
|
CUSTOM_COMMAND_SIG(open_all_code){
|
||||||
|
int32_t extension_count = 0;
|
||||||
|
char **extension_list = get_standard_code_extensions(&extension_count);
|
||||||
|
open_all_files_with_extension(app, &global_part, extension_list, extension_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
CUSTOM_COMMAND_SIG(close_all_code){
|
||||||
|
int32_t extension_count = 0;
|
||||||
|
char **extension_list = get_standard_code_extensions(&extension_count);
|
||||||
|
close_all_files_with_extension(app, &global_part, extension_list, extension_count);
|
||||||
|
}
|
||||||
|
|
||||||
CUSTOM_COMMAND_SIG(load_project){
|
CUSTOM_COMMAND_SIG(load_project){
|
||||||
Partition *part = &global_part;
|
Partition *part = &global_part;
|
||||||
|
@ -3820,114 +3939,255 @@ CUSTOM_COMMAND_SIG(load_project){
|
||||||
}
|
}
|
||||||
|
|
||||||
if (project_name.size != 0){
|
if (project_name.size != 0){
|
||||||
append_sc(&project_name, "/project.4coder");
|
int32_t original_size = project_name.size;
|
||||||
terminate_with_null(&project_name);
|
append_sc(&project_name, "project.4coder");
|
||||||
|
terminate_with_null(&project_name);
|
||||||
FILE *file = fopen(project_name.str, "rb");
|
|
||||||
if (file){
|
|
||||||
Temp_Memory temp = begin_temp_memory(part);
|
|
||||||
|
|
||||||
char *mem = 0;
|
// TODO(allen): make sure we do nothing when this project is already open
|
||||||
int32_t size = 0;
|
|
||||||
bool32 file_read_success = file_handle_dump(part, file, &mem, &size);
|
FILE *file = fopen(project_name.str, "rb");
|
||||||
if (file_read_success){
|
if (file){
|
||||||
fclose(file);
|
project_name.size = original_size;
|
||||||
|
terminate_with_null(&project_name);
|
||||||
|
|
||||||
Cpp_Token_Array array;
|
Temp_Memory temp = begin_temp_memory(part);
|
||||||
array.count = 0;
|
|
||||||
array.max_count = (1 << 20)/sizeof(Cpp_Token);
|
char *mem = 0;
|
||||||
array.tokens = push_array(&global_part, Cpp_Token, array.max_count);
|
int32_t size = 0;
|
||||||
|
bool32 file_read_success = file_handle_dump(part, file, &mem, &size);
|
||||||
Cpp_Lex_Data S = cpp_lex_data_init();
|
if (file_read_success){
|
||||||
Cpp_Lex_Result result = cpp_lex_step(&S, mem, size+1, HAS_NULL_TERM, &array, NO_OUT_LIMIT);
|
fclose(file);
|
||||||
|
|
||||||
if (result == LexResult_Finished){
|
|
||||||
for (int32_t i = 0; i < array.count; ++i){
|
|
||||||
Config_Line config_line = read_config_line(array, &i);
|
|
||||||
if (config_line.read_success){
|
|
||||||
Config_Item item = get_config_item(config_line, mem);
|
|
||||||
|
|
||||||
{
|
|
||||||
String str = {0};
|
|
||||||
if (config_string_var(item, "extensions", 0, &str)){
|
|
||||||
// TODO(allen)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
Cpp_Token_Array array;
|
||||||
#if WIN
|
array.count = 0;
|
||||||
#define FKEY_COMMAND "fkey_command_wnd"
|
array.max_count = (1 << 20)/sizeof(Cpp_Token);
|
||||||
#else
|
array.tokens = push_array(&global_part, Cpp_Token, array.max_count);
|
||||||
#define FKEY_COMMAND "fkey_command_linux"
|
|
||||||
#endif
|
Cpp_Lex_Data S = cpp_lex_data_init();
|
||||||
|
Cpp_Lex_Result result = cpp_lex_step(&S, mem, size+1, HAS_NULL_TERM, &array, NO_OUT_LIMIT);
|
||||||
|
|
||||||
|
if (result == LexResult_Finished){
|
||||||
|
// Clear out current project
|
||||||
|
if (current_project.close_all_code_when_this_project_closes){
|
||||||
|
exec_command(app, close_all_code);
|
||||||
|
}
|
||||||
|
current_project = null_project;
|
||||||
|
|
||||||
int32_t index = 0;
|
// Set new project directory
|
||||||
Config_Array_Reader array_reader = {0};
|
{
|
||||||
if (config_array_var(item, FKEY_COMMAND, &index, &array_reader)){
|
current_project.dir = current_project.dir_space;
|
||||||
if (index >= 1 && index <= 16){
|
String str = make_fixed_width_string(current_project.dir_space);
|
||||||
Config_Item array_item = {0};
|
copy(&str, project_name);
|
||||||
int32_t item_index = 0;
|
terminate_with_null(&str);
|
||||||
|
current_project.dir_len = str.size;
|
||||||
for (config_array_next_item(&array_reader, &array_item);
|
}
|
||||||
config_array_good(&array_reader);
|
|
||||||
config_array_next_item(&array_reader, &array_item)){
|
// Read the settings from project.4coder
|
||||||
if (item_index >= 2){
|
for (int32_t i = 0; i < array.count; ++i){
|
||||||
break;
|
Config_Line config_line = read_config_line(array, &i);
|
||||||
|
if (config_line.read_success){
|
||||||
|
Config_Item item = get_config_item(config_line, mem, array);
|
||||||
|
|
||||||
|
{
|
||||||
|
String str = {0};
|
||||||
|
if (config_string_var(item, "extensions", 0, &str)){
|
||||||
|
if (str.size < sizeof(current_project.extension_space)){
|
||||||
|
set_project_extensions(¤t_project, str);
|
||||||
|
print_message(app, str.str, str.size);
|
||||||
|
print_message(app, "\n", 1);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
print_message(app, literal("STRING TOO LONG!\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (item_index){
|
{
|
||||||
case 0:
|
#if defined(_WIN32)
|
||||||
{
|
#define FKEY_COMMAND "fkey_command_win"
|
||||||
if (config_int_var(array_item, 0, 0, 0)){
|
#elif defined(__linux__)
|
||||||
// TODO(allen)
|
#define FKEY_COMMAND "fkey_command_linux"
|
||||||
}
|
#else
|
||||||
String str = {0};
|
#error no project configuration names for this platform
|
||||||
if (config_string_var(array_item, 0, 0, &str)){
|
#endif
|
||||||
// TODO(allen)
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
|
|
||||||
case 1:
|
int32_t index = 0;
|
||||||
{
|
Config_Array_Reader array_reader = {0};
|
||||||
if (config_int_var(array_item, 0, 0, 0)){
|
if (config_array_var(item, FKEY_COMMAND, &index, &array_reader)){
|
||||||
// TODO(allen)
|
if (index >= 1 && index <= 16){
|
||||||
|
Config_Item array_item = {0};
|
||||||
|
int32_t item_index = 0;
|
||||||
|
|
||||||
|
char space[256];
|
||||||
|
String msg = make_fixed_width_string(space);
|
||||||
|
append(&msg, FKEY_COMMAND"[");
|
||||||
|
append_int_to_str(&msg, index);
|
||||||
|
append(&msg, "] = {");
|
||||||
|
|
||||||
|
for (config_array_next_item(&array_reader, &array_item);
|
||||||
|
config_array_good(&array_reader);
|
||||||
|
config_array_next_item(&array_reader, &array_item)){
|
||||||
|
|
||||||
|
if (item_index >= 3){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
append(&msg, "[");
|
||||||
|
append_int_to_str(&msg, item_index);
|
||||||
|
append(&msg, "] = ");
|
||||||
|
|
||||||
|
bool32 read_string = 0;
|
||||||
|
bool32 read_bool = 0;
|
||||||
|
|
||||||
|
char *dest_str = 0;
|
||||||
|
int32_t dest_str_size = 0;
|
||||||
|
|
||||||
|
bool32 *dest_bool = 0;
|
||||||
|
|
||||||
|
switch (item_index){
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
dest_str = current_project.fkey_commands[index-1].command;
|
||||||
|
dest_str_size = sizeof(current_project.fkey_commands[index-1].command);
|
||||||
|
read_string = 1;
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
dest_str = current_project.fkey_commands[index-1].out;
|
||||||
|
dest_str_size = sizeof(current_project.fkey_commands[index-1].out);
|
||||||
|
read_string = 1;
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
dest_bool = ¤t_project.fkey_commands[index-1].use_build_panel;
|
||||||
|
read_bool = 1;
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (read_string){
|
||||||
|
if (config_int_var(array_item, 0, 0, 0)){
|
||||||
|
append(&msg, "NULL, ");
|
||||||
|
dest_str[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
String str = {0};
|
||||||
|
if (config_string_var(array_item, 0, 0, &str)){
|
||||||
|
if (str.size < dest_str_size){
|
||||||
|
interpret_escaped_string(dest_str, str);
|
||||||
|
append(&msg, dest_str);
|
||||||
|
append(&msg, ", ");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
append(&msg, "STRING TOO LONG!, ");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
String str = {0};
|
|
||||||
if (config_string_var(array_item, 0, 0, &str)){
|
if (read_bool){
|
||||||
// TODO(allen)
|
if (config_bool_var(array_item, 0, 0, dest_bool)){
|
||||||
|
if (dest_bool){
|
||||||
|
append(&msg, "true, ");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
append(&msg, "false, ");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}break;
|
|
||||||
|
item_index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
append(&msg, "}\n");
|
||||||
|
print_message(app, msg.str, msg.size);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
item_index++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (current_project.close_all_files_when_project_opens){
|
||||||
|
close_all_files_with_extension(app, &global_part, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Open all project files
|
||||||
|
exec_command(app, open_all_code);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end_temp_memory(temp);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
char message_space[512];
|
||||||
|
String message = make_fixed_width_string(message_space);
|
||||||
|
append_sc(&message, "Did not find project.4coder. ");
|
||||||
|
if (current_project.dir != 0){
|
||||||
|
append_sc(&message, "Continuing with: ");
|
||||||
|
append_sc(&message, current_project.dir);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
append_sc(&message, "Continuing without a project");
|
||||||
|
}
|
||||||
|
print_message(app, message.str, message.size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
print_message(app, literal("Failed trying to get project file name"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CUSTOM_COMMAND_SIG(project_fkey_command){
|
||||||
|
User_Input input = get_command_input(app);
|
||||||
|
if (input.type == UserInputKey){
|
||||||
|
if (input.key.keycode >= key_f1 && input.key.keycode <= key_f16){
|
||||||
|
int32_t ind = (input.key.keycode - key_f1);
|
||||||
|
|
||||||
|
char *command = current_project.fkey_commands[ind].command;
|
||||||
|
char *out = current_project.fkey_commands[ind].out;
|
||||||
|
bool32 use_build_panel = current_project.fkey_commands[ind].use_build_panel;
|
||||||
|
|
||||||
|
if (command[0] != 0){
|
||||||
|
int32_t command_len = str_size(command);
|
||||||
|
|
||||||
|
View_Summary view_ = {0};
|
||||||
|
View_Summary *view = 0;
|
||||||
|
Buffer_Identifier buffer_id = {0};
|
||||||
|
uint32_t flags = 0;
|
||||||
|
|
||||||
|
bool32 set_fancy_font = 0;
|
||||||
|
|
||||||
|
if (out[0] != 0){
|
||||||
|
int32_t out_len = str_size(out);
|
||||||
|
buffer_id = buffer_identifier(out, out_len);
|
||||||
|
|
||||||
|
view = &view_;
|
||||||
|
|
||||||
|
if (use_build_panel){
|
||||||
|
view_ = get_or_open_build_panel(app);
|
||||||
|
if (match(out, "*compilation*")){
|
||||||
|
set_fancy_font = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
view_ = get_active_view(app, AccessAll);
|
||||||
|
}
|
||||||
|
|
||||||
|
prev_location = null_location;
|
||||||
|
lock_jump_buffer(out, out_len);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// TODO(allen): fix the exec_system_command call so it can take a null buffer_id.
|
||||||
|
buffer_id = buffer_identifier(literal("*dump*"));
|
||||||
|
}
|
||||||
|
|
||||||
|
exec_system_command(app, view, buffer_id, current_project.dir, current_project.dir_len, command, command_len, flags);
|
||||||
|
if (set_fancy_font){
|
||||||
|
set_fancy_compilation_buffer_font(app);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
end_temp_memory(temp);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
char message_space[512];
|
|
||||||
String message = make_fixed_width_string(message_space);
|
|
||||||
append_sc(&message, "Did not find project.4coder. ");
|
|
||||||
if (loaded_project != 0){
|
|
||||||
append_sc(&message, "Continuing with: ");
|
|
||||||
append_sc(&message, loaded_project);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
append_sc(&message, "Continuing without a project");
|
|
||||||
}
|
|
||||||
print_message(app, message.str, message.size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
print_message(app, literal("Failed trying to get project file name"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -179,6 +179,16 @@ set_open_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){
|
||||||
write_unit(helper, unit);
|
write_unit(helper, unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
set_save_file_hook(Bind_Helper *helper, Open_File_Hook_Function *func){
|
||||||
|
Binding_Unit unit;
|
||||||
|
unit.type = unit_hook;
|
||||||
|
unit.hook.hook_id = _hook_save_file;
|
||||||
|
unit.hook.func = (void*) func;
|
||||||
|
|
||||||
|
write_unit(helper, unit);
|
||||||
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
set_command_caller(Bind_Helper *helper, Command_Caller_Hook_Function *func){
|
set_command_caller(Bind_Helper *helper, Command_Caller_Hook_Function *func){
|
||||||
Binding_Unit unit;
|
Binding_Unit unit;
|
||||||
|
|
|
@ -668,7 +668,11 @@ STRUCT View_Summary{
|
||||||
bool32 show_whitespace;
|
bool32 show_whitespace;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
DOC(If this is not a null summary, this describes the screen position in which this view's buffer is displayed.)
|
DOC(If this is not a null summary, this describes the screen position in which this view's is displayed.)
|
||||||
|
*/
|
||||||
|
i32_Rect view_region;
|
||||||
|
/*
|
||||||
|
DOC(If this is not a null summary, this describes the screen position in which this view's buffer is displayed. This is different from view_region, because it does not include any fixed height GUI at the top of the view.)
|
||||||
*/
|
*/
|
||||||
i32_Rect file_region;
|
i32_Rect file_region;
|
||||||
/* DOC(If this is not a null summary, this describes the scrolling position inside the view.) */
|
/* DOC(If this is not a null summary, this describes the scrolling position inside the view.) */
|
||||||
|
|
13
4ed.cpp
13
4ed.cpp
|
@ -414,7 +414,7 @@ COMMAND_DECL(save){
|
||||||
REQ_FILE(file, view);
|
REQ_FILE(file, view);
|
||||||
|
|
||||||
if (!file->is_dummy && file_is_ready(file) && buffer_can_save(file)){
|
if (!file->is_dummy && file_is_ready(file) && buffer_can_save(file)){
|
||||||
save_file(system, &models->mem, file);
|
save_file(system, models, file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,9 +422,7 @@ COMMAND_DECL(save_as){
|
||||||
USE_VIEW(view);
|
USE_VIEW(view);
|
||||||
REQ_FILE(file, view);
|
REQ_FILE(file, view);
|
||||||
|
|
||||||
view_show_interactive(system, view,
|
view_show_interactive(system, view, IAct_Save_As, IInt_Sys_File_List, make_lit_string("Save As: "));
|
||||||
IAct_Save_As, IInt_Sys_File_List,
|
|
||||||
make_lit_string("Save As: "));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
COMMAND_DECL(change_active_panel){
|
COMMAND_DECL(change_active_panel){
|
||||||
|
@ -1439,6 +1437,7 @@ App_Init_Sig(app_init){
|
||||||
models->scroll_rule = fallback_scroll_rule;
|
models->scroll_rule = fallback_scroll_rule;
|
||||||
models->hook_open_file = 0;
|
models->hook_open_file = 0;
|
||||||
models->hook_new_file = 0;
|
models->hook_new_file = 0;
|
||||||
|
models->hook_save_file = 0;
|
||||||
|
|
||||||
setup_command_table();
|
setup_command_table();
|
||||||
|
|
||||||
|
@ -1578,6 +1577,10 @@ App_Init_Sig(app_init){
|
||||||
models->hook_new_file = (Open_File_Hook_Function*)unit->hook.func;
|
models->hook_new_file = (Open_File_Hook_Function*)unit->hook.func;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case _hook_save_file:
|
||||||
|
models->hook_save_file = (Open_File_Hook_Function*)unit->hook.func;
|
||||||
|
break;
|
||||||
|
|
||||||
case _hook_command_caller:
|
case _hook_command_caller:
|
||||||
models->command_caller = (Command_Caller_Hook_Function*)unit->hook.func;
|
models->command_caller = (Command_Caller_Hook_Function*)unit->hook.func;
|
||||||
break;
|
break;
|
||||||
|
@ -2564,6 +2567,8 @@ App_Step_Sig(app_step){
|
||||||
"-The 'config.4coder' file can now be placed with the 4ed executable file\n"
|
"-The 'config.4coder' file can now be placed with the 4ed executable file\n"
|
||||||
"-New options in 'config.4coder' to specify the font and color theme\n"
|
"-New options in 'config.4coder' to specify the font and color theme\n"
|
||||||
"-New built in project configuration system\n"
|
"-New built in project configuration system\n"
|
||||||
|
"-New on-save hooks allows custom behavior in the custom layer whenever a file is saved\n"
|
||||||
|
"-When using code wrapping, any saved file is automatically indented in the text format, this option can be turned off in config.4coder\n"
|
||||||
"\n"
|
"\n"
|
||||||
"New in alpha 4.0.12 and 4.0.13:\n"
|
"New in alpha 4.0.12 and 4.0.13:\n"
|
||||||
"-Text files wrap lines at whitespace when possible\n"
|
"-Text files wrap lines at whitespace when possible\n"
|
||||||
|
|
|
@ -87,7 +87,8 @@ fill_view_summary(View_Summary *view, View *vptr, Live_Views *live_set, Working_
|
||||||
view->cursor = vptr->edit_pos->cursor;
|
view->cursor = vptr->edit_pos->cursor;
|
||||||
view->preferred_x = vptr->edit_pos->preferred_x;
|
view->preferred_x = vptr->edit_pos->preferred_x;
|
||||||
|
|
||||||
view->file_region = vptr->panel->inner;
|
view->view_region = vptr->panel->inner;
|
||||||
|
view->file_region = vptr->file_region;
|
||||||
view->scroll_vars = vptr->edit_pos->scroll;
|
view->scroll_vars = vptr->edit_pos->scroll;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,7 +119,7 @@ imp_get_file(Command_Data *cmd, Buffer_Summary *buffer){
|
||||||
Editing_File *file = 0;
|
Editing_File *file = 0;
|
||||||
Working_Set *working_set = &cmd->models->working_set;;
|
Working_Set *working_set = &cmd->models->working_set;;
|
||||||
|
|
||||||
if (buffer->exists){
|
if (buffer && buffer->exists){
|
||||||
file = working_set_get_active_file(working_set, buffer->buffer_id);
|
file = working_set_get_active_file(working_set, buffer->buffer_id);
|
||||||
if (file != 0 && !file_is_ready(file)){
|
if (file != 0 && !file_is_ready(file)){
|
||||||
file = 0;
|
file = 0;
|
||||||
|
@ -148,7 +149,7 @@ internal View*
|
||||||
imp_get_view(Command_Data *cmd, View_Summary *view){
|
imp_get_view(Command_Data *cmd, View_Summary *view){
|
||||||
View *vptr = 0;
|
View *vptr = 0;
|
||||||
|
|
||||||
if (view->exists){
|
if (view && view->exists){
|
||||||
vptr = imp_get_view(cmd, view->view_id);
|
vptr = imp_get_view(cmd, view->view_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,28 +186,24 @@ DOC_SEE(Command_ID)
|
||||||
API_EXPORT bool32
|
API_EXPORT bool32
|
||||||
Exec_System_Command(Application_Links *app, View_Summary *view, Buffer_Identifier buffer, char *path, int32_t path_len, char *command, int32_t command_len, Command_Line_Interface_Flag flags)
|
Exec_System_Command(Application_Links *app, View_Summary *view, Buffer_Identifier buffer, char *path, int32_t path_len, char *command, int32_t command_len, Command_Line_Interface_Flag flags)
|
||||||
/*
|
/*
|
||||||
DOC_PARAM(view, If the view parameter is non-null it specifies a view to display the command's output buffer.)
|
DOC_PARAM(view, If the view parameter is non-null it specifies a view to display the command's output buffer, otherwise the command will still work but if there is a buffer capturing the output it will not automatically be displayed.)
|
||||||
DOC_PARAM(buffer, The buffer the command will output to is specified by the buffer parameter.
|
DOC_PARAM(buffer, The buffer the command will output to is specified by the buffer parameter.
|
||||||
See Buffer_Identifier for information on how this type specifies a buffer.)
|
See Buffer_Identifier for information on how this type specifies a buffer. The command will cause a crash if no file is specified.)
|
||||||
DOC_PARAM(path, The path parameter specifies the path in which the command shall be executed. The string need not be null terminated.)
|
DOC_PARAM(path, The path parameter specifies the path in which the command shall be executed. The string need not be null terminated.)
|
||||||
DOC_PARAM(path_len, The parameter path_len specifies the length of the path string.)
|
DOC_PARAM(path_len, The parameter path_len specifies the length of the path string.)
|
||||||
DOC_PARAM(command, The command parameter specifies the command that shall be executed. The string need not be null terminated.)
|
DOC_PARAM(command, The command parameter specifies the command that shall be executed. The string need not be null terminated.)
|
||||||
DOC_PARAM(command_len, The parameter command_len specifies the length of the command string.)
|
DOC_PARAM(command_len, The parameter command_len specifies the length of the command string.)
|
||||||
DOC_PARAM(flags, Flags for the behavior of the call are specified in the flags parameter.)
|
DOC_PARAM(flags, Flags for the behavior of the call are specified in the flags parameter.)
|
||||||
DOC_RETURN(This call returns non-zero on success.)
|
DOC_RETURN(This call returns non-zero on success.)
|
||||||
DOC
|
DOC(
|
||||||
(
|
A call to exec_system_command executes a command as if called from the command line, and sends the output to a buffer. The buffer identifier can name a new buffer that does not exist, name a buffer that does exist, or provide the id of a buffer that does exist.
|
||||||
A call to exec_system_command executes a command as if called from the command line, and sends the output to
|
|
||||||
a buffer. The buffer identifier can either name a new buffer that does not exist, name a buffer that does
|
|
||||||
exist, or provide the id of a buffer that does exist.
|
|
||||||
|
|
||||||
If the buffer is not already in an open view and the view parameter is not NULL,
|
If the buffer is not already in an open view and the view parameter is not NULL,
|
||||||
then the provided view will display the output buffer.
|
then the provided view will display the output buffer.
|
||||||
|
|
||||||
If the view parameter is NULL, no view will switch to the output.
|
If the view parameter is NULL, no view will switch to the output.)
|
||||||
)
|
|
||||||
DOC_SEE(Buffer_Identifier)
|
DOC_SEE(Buffer_Identifier)
|
||||||
DOC_SEE(Command_Line_Input_Flag)
|
DOC_SEE(Command_Line_Interface_Flag)
|
||||||
*/{
|
*/{
|
||||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||||
System_Functions *system = cmd->system;
|
System_Functions *system = cmd->system;
|
||||||
|
@ -231,6 +228,7 @@ DOC_SEE(Command_Line_Input_Flag)
|
||||||
|
|
||||||
if (vars->cli_processes.count < vars->cli_processes.max){
|
if (vars->cli_processes.count < vars->cli_processes.max){
|
||||||
file = get_file_from_identifier(system, working_set, buffer);
|
file = get_file_from_identifier(system, working_set, buffer);
|
||||||
|
|
||||||
if (file){
|
if (file){
|
||||||
if (file->settings.read_only == 0){
|
if (file->settings.read_only == 0){
|
||||||
append_ss(&feedback_str, make_lit_string("ERROR: "));
|
append_ss(&feedback_str, make_lit_string("ERROR: "));
|
||||||
|
@ -252,13 +250,11 @@ DOC_SEE(Command_Line_Input_Flag)
|
||||||
else if (buffer.name){
|
else if (buffer.name){
|
||||||
file = working_set_alloc_always(system, working_set, general);
|
file = working_set_alloc_always(system, working_set, general);
|
||||||
if (file == 0){
|
if (file == 0){
|
||||||
append_ss(&feedback_str,
|
append_ss(&feedback_str, make_lit_string("ERROR: unable to allocate a new buffer\n"));
|
||||||
make_lit_string("ERROR: unable to allocate a new buffer\n"));
|
|
||||||
do_feedback_message(system, models, feedback_str);
|
do_feedback_message(system, models, feedback_str);
|
||||||
result = false;
|
result = false;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
String name = make_string_terminated(part, buffer.name, buffer.name_len);
|
String name = make_string_terminated(part, buffer.name, buffer.name_len);
|
||||||
buffer_bind_name(system, general, working_set, file, name);
|
buffer_bind_name(system, general, working_set, file, name);
|
||||||
init_read_only_file(system, models, file);
|
init_read_only_file(system, models, file);
|
||||||
|
@ -707,7 +703,7 @@ DOC_SEE(Buffer_Batch_Edit_Type)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
API_EXPORT int32_t
|
API_EXPORT bool32
|
||||||
Buffer_Get_Setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out)
|
Buffer_Get_Setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out)
|
||||||
/*
|
/*
|
||||||
DOC_PARAM(buffer, the buffer from which to read a setting)
|
DOC_PARAM(buffer, the buffer from which to read a setting)
|
||||||
|
@ -717,7 +713,7 @@ DOC_RETURN(returns non-zero on success)
|
||||||
*/{
|
*/{
|
||||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||||
Editing_File *file = imp_get_file(cmd, buffer);
|
Editing_File *file = imp_get_file(cmd, buffer);
|
||||||
int32_t result = 0;
|
bool32 result = 0;
|
||||||
|
|
||||||
if (file){
|
if (file){
|
||||||
result = 1;
|
result = 1;
|
||||||
|
@ -1141,17 +1137,17 @@ DOC_RETURN(This call returns non-zero on success.)
|
||||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||||
System_Functions *system = cmd->system;
|
System_Functions *system = cmd->system;
|
||||||
Models *models = cmd->models;
|
Models *models = cmd->models;
|
||||||
bool32 result = false;
|
bool32 result = 0;
|
||||||
|
|
||||||
Editing_File *file = imp_get_file(cmd, buffer);
|
Editing_File *file = imp_get_file(cmd, buffer);
|
||||||
if (file){
|
if (file){
|
||||||
if (file_get_sync(file) != DirtyState_UpToDate){
|
if (file_get_sync(file) != DirtyState_UpToDate){
|
||||||
result = true;
|
result = 1;
|
||||||
|
|
||||||
Partition *part = &models->mem.part;
|
Partition *part = &models->mem.part;
|
||||||
Temp_Memory temp = begin_temp_memory(part);
|
Temp_Memory temp = begin_temp_memory(part);
|
||||||
String name = make_string_terminated(part, filename, filename_len);
|
String name = make_string_terminated(part, filename, filename_len);
|
||||||
save_file_to_name(system, &models->mem, file, name.str);
|
save_file_to_name(system, models, file, name.str);
|
||||||
end_temp_memory(temp);
|
end_temp_memory(temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,6 +65,7 @@ struct Models{
|
||||||
|
|
||||||
Open_File_Hook_Function *hook_open_file;
|
Open_File_Hook_Function *hook_open_file;
|
||||||
Open_File_Hook_Function *hook_new_file;
|
Open_File_Hook_Function *hook_new_file;
|
||||||
|
Open_File_Hook_Function *hook_save_file;
|
||||||
Command_Caller_Hook_Function *command_caller;
|
Command_Caller_Hook_Function *command_caller;
|
||||||
Input_Filter_Function *input_filter;
|
Input_Filter_Function *input_filter;
|
||||||
Scroll_Rule_Function *scroll_rule;
|
Scroll_Rule_Function *scroll_rule;
|
||||||
|
|
|
@ -744,7 +744,7 @@ file_synchronize_times(System_Functions *system, Editing_File *file){
|
||||||
}
|
}
|
||||||
|
|
||||||
internal b32
|
internal b32
|
||||||
save_file_to_name(System_Functions *system, Mem_Options *mem, Editing_File *file, char *filename){
|
save_file_to_name(System_Functions *system, Models *models, Editing_File *file, char *filename){
|
||||||
b32 result = 0;
|
b32 result = 0;
|
||||||
b32 using_actual_filename = 0;
|
b32 using_actual_filename = 0;
|
||||||
|
|
||||||
|
@ -755,6 +755,11 @@ save_file_to_name(System_Functions *system, Mem_Options *mem, Editing_File *file
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filename){
|
if (filename){
|
||||||
|
Mem_Options *mem = &models->mem;
|
||||||
|
if (models->hook_save_file){
|
||||||
|
models->hook_save_file(&models->app_links, file->id.id);
|
||||||
|
}
|
||||||
|
|
||||||
i32 max = 0, size = 0;
|
i32 max = 0, size = 0;
|
||||||
b32 dos_write_mode = file->settings.dos_write_mode;
|
b32 dos_write_mode = file->settings.dos_write_mode;
|
||||||
char *data = 0;
|
char *data = 0;
|
||||||
|
@ -810,8 +815,8 @@ save_file_to_name(System_Functions *system, Mem_Options *mem, Editing_File *file
|
||||||
}
|
}
|
||||||
|
|
||||||
inline b32
|
inline b32
|
||||||
save_file(System_Functions *system, Mem_Options *mem, Editing_File *file){
|
save_file(System_Functions *system, Models *models, Editing_File *file){
|
||||||
b32 result = save_file_to_name(system, mem, file, 0);
|
b32 result = save_file_to_name(system, models, file, 0);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -835,12 +840,10 @@ buffer_link_to_new_file(System_Functions *system, General_Memory *general, Worki
|
||||||
}
|
}
|
||||||
|
|
||||||
inline b32
|
inline b32
|
||||||
file_save_and_set_names(System_Functions *system, Mem_Options *mem,
|
file_save_and_set_names(System_Functions *system, Models *models, Editing_File *file, String filename){
|
||||||
Working_Set *working_set, Editing_File *file,
|
b32 result = buffer_link_to_new_file(system, &models->mem.general, &models->working_set, file, filename);
|
||||||
String filename){
|
|
||||||
b32 result = buffer_link_to_new_file(system, &mem->general, working_set, file, filename);
|
|
||||||
if (result){
|
if (result){
|
||||||
result = save_file(system, mem, file);
|
result = save_file(system, models, file);
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
@ -1960,9 +1963,8 @@ file_create_from_string(System_Functions *system, Models *models,
|
||||||
file->state.undo.current_block_normal = 1;
|
file->state.undo.current_block_normal = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Open_File_Hook_Function *open_hook = models->hook_open_file;
|
if (models->hook_open_file){
|
||||||
if (open_hook){
|
models->hook_open_file(&models->app_links, file->id.id);
|
||||||
open_hook(&models->app_links, file->id.id);
|
|
||||||
}
|
}
|
||||||
file->settings.is_initialized = 1;
|
file->settings.is_initialized = 1;
|
||||||
}
|
}
|
||||||
|
@ -3833,7 +3835,7 @@ view_open_file(System_Functions *system, Models *models, View *view, String file
|
||||||
internal void
|
internal void
|
||||||
view_interactive_save_as(System_Functions *system, Models *models, Editing_File *file, String filename){
|
view_interactive_save_as(System_Functions *system, Models *models, Editing_File *file, String filename){
|
||||||
if (terminate_with_null(&filename)){
|
if (terminate_with_null(&filename)){
|
||||||
file_save_and_set_names(system, &models->mem, &models->working_set, file, filename);
|
file_save_and_set_names(system, models, file, filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3913,7 +3915,7 @@ internal void
|
||||||
save_file_by_name(System_Functions *system, Models *models, String name){
|
save_file_by_name(System_Functions *system, Models *models, String name){
|
||||||
Editing_File *file = working_set_name_contains(&models->working_set, name);
|
Editing_File *file = working_set_name_contains(&models->working_set, name);
|
||||||
if (file){
|
if (file){
|
||||||
save_file(system, &models->mem, file);
|
save_file(system, models, file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
TODO.txt
10
TODO.txt
|
@ -81,8 +81,6 @@
|
||||||
;
|
;
|
||||||
; [] indication on failure to save
|
; [] indication on failure to save
|
||||||
; [] history is broken, revist the entire system
|
; [] history is broken, revist the entire system
|
||||||
; [] 8.0\Include\um\dsound.h (not reproduced, get more info)
|
|
||||||
; [] paste external text from bug report (in email) (not reproduced, get more info)
|
|
||||||
;
|
;
|
||||||
; [] view fails to follow cursor when the view is shrunk
|
; [] view fails to follow cursor when the view is shrunk
|
||||||
; [] view fails to follow cursor after deleting long line
|
; [] view fails to follow cursor after deleting long line
|
||||||
|
@ -91,10 +89,6 @@
|
||||||
|
|
||||||
; BEFORE I SHIP
|
; BEFORE I SHIP
|
||||||
;
|
;
|
||||||
; [] decent options for indentation rules for text & presentation
|
|
||||||
; [] code file outlining
|
|
||||||
; [] alternate code completion plan
|
|
||||||
;
|
|
||||||
|
|
||||||
; TODOS
|
; TODOS
|
||||||
; [X] success message when compiler works
|
; [X] success message when compiler works
|
||||||
|
@ -181,12 +175,16 @@
|
||||||
; [X] handle comments
|
; [X] handle comments
|
||||||
; [X] additional width for nesting?
|
; [X] additional width for nesting?
|
||||||
; [X] fix issues when relexing happens in parallel
|
; [X] fix issues when relexing happens in parallel
|
||||||
|
; [X] improve code display mode so that it can auto-indent the text on save
|
||||||
; [] command for setting wrap positions in views directly
|
; [] command for setting wrap positions in views directly
|
||||||
; [] ability to see the wrap position as a number/line and adjust graphically
|
; [] ability to see the wrap position as a number/line and adjust graphically
|
||||||
; [] code level wrapping level 2
|
; [] code level wrapping level 2
|
||||||
; [] comment lead whitespace problem
|
; [] comment lead whitespace problem
|
||||||
; [] remeasure version of measure_wraps
|
; [] remeasure version of measure_wraps
|
||||||
|
|
||||||
|
; [] code file outlining
|
||||||
|
; [] alternate code completion plan
|
||||||
|
|
||||||
; Buffer behavior cleanup
|
; Buffer behavior cleanup
|
||||||
; [X] show all characters as \# if they can't be rendered
|
; [X] show all characters as \# if they can't be rendered
|
||||||
; [X] get the navigation working correctly around multi-glyph characters
|
; [X] get the navigation working correctly around multi-glyph characters
|
||||||
|
|
|
@ -620,6 +620,7 @@ get_bindings(void *data, int size){
|
||||||
set_hook(context, hook_view_size_change, my_view_adjust);
|
set_hook(context, hook_view_size_change, my_view_adjust);
|
||||||
|
|
||||||
set_open_file_hook(context, my_file_settings);
|
set_open_file_hook(context, my_file_settings);
|
||||||
|
set_save_file_hook(context, my_file_save);
|
||||||
set_input_filter(context, my_suppress_mouse_filter);
|
set_input_filter(context, my_suppress_mouse_filter);
|
||||||
set_command_caller(context, default_command_caller);
|
set_command_caller(context, default_command_caller);
|
||||||
|
|
||||||
|
|
|
@ -1,34 +1,35 @@
|
||||||
extensions=".c.cpp.h.hpp";
|
extensions=".c.cpp.h.hpp.bat.sh";
|
||||||
|
|
||||||
fkey_command_wnd[1] = {"build.bat", "*compilation*"};
|
// NOTE(allen): There is some kind of bug where hitting f12 causes a crash. It looks like there is a special meaning placed on some fkeys by windows, which I have not found how to disable yet.
|
||||||
fkey_command_wnd[2] = {"..\\misc\\run.bat", 0};
|
fkey_command_win[1] = {"build.bat", "*compilation*", true};
|
||||||
fkey_command_wnd[3] = {"site\\build.bat", "*compilation*"};
|
fkey_command_win[2] = {"..\\misc\\run.bat", "*run*"};
|
||||||
fkey_command_wnd[4] = {0, 0};
|
fkey_command_win[3] = {"site\\build.bat", "*compilation*", true};
|
||||||
fkey_command_wnd[5] = {0, 0};
|
fkey_command_win[4] = {0, 0};
|
||||||
fkey_command_wnd[6] = {0, 0};
|
fkey_command_win[5] = {0, 0};
|
||||||
fkey_command_wnd[7] = {0, 0};
|
fkey_command_win[6] = {0, 0};
|
||||||
fkey_command_wnd[8] = {0, 0};
|
fkey_command_win[7] = {0, 0};
|
||||||
fkey_command_wnd[9] = {0, 0};
|
fkey_command_win[8] = {"package.bat", "*compilation*", true};
|
||||||
fkey_command_wnd[10] = {0, 0};
|
fkey_command_win[9] = {0, 0};
|
||||||
fkey_command_wnd[11] = {0, 0};
|
fkey_command_win[10] = {0, 0};
|
||||||
fkey_command_wnd[12] = {"package.bat", "*compilation*"};
|
fkey_command_win[11] = {0, 0};
|
||||||
fkey_command_wnd[13] = {0, 0};
|
fkey_command_win[12] = {0, 0};
|
||||||
fkey_command_wnd[14] = {0, 0};
|
fkey_command_win[13] = {0, 0};
|
||||||
fkey_command_wnd[15] = {0, 0};
|
fkey_command_win[14] = {0, 0};
|
||||||
fkey_command_wnd[16] = {0, 0};
|
fkey_command_win[15] = {0, 0};
|
||||||
|
fkey_command_win[16] = {0, 0};
|
||||||
|
|
||||||
fkey_command_linux[1] = {"make", "*compilation*"};
|
fkey_command_linux[1] = {"make", "*compilation*", true};
|
||||||
fkey_command_linux[2] = {"../build/4ed", 0};
|
fkey_command_linux[2] = {"../build/4ed", "*run*"};
|
||||||
fkey_command_linux[3] = {"site/build.sh", "*compilation*"};
|
fkey_command_linux[3] = {"site/build.sh", "*compilation*", true};
|
||||||
fkey_command_linux[4] = {0, 0};
|
fkey_command_linux[4] = {0, 0};
|
||||||
fkey_command_linux[5] = {0, 0};
|
fkey_command_linux[5] = {0, 0};
|
||||||
fkey_command_linux[6] = {0, 0};
|
fkey_command_linux[6] = {0, 0};
|
||||||
fkey_command_linux[7] = {0, 0};
|
fkey_command_linux[7] = {0, 0};
|
||||||
fkey_command_linux[8] = {0, 0};
|
fkey_command_linux[8] = {"package.sh", "*compilation*", true};
|
||||||
fkey_command_linux[9] = {0, 0};
|
fkey_command_linux[9] = {0, 0};
|
||||||
fkey_command_linux[10] = {0, 0};
|
fkey_command_linux[10] = {0, 0};
|
||||||
fkey_command_linux[11] = {0, 0};
|
fkey_command_linux[11] = {0, 0};
|
||||||
fkey_command_linux[12] = {"package.sh", "*compilation*"};
|
fkey_command_linux[12] = {0, 0};
|
||||||
fkey_command_linux[13] = {0, 0};
|
fkey_command_linux[13] = {0, 0};
|
||||||
fkey_command_linux[14] = {0, 0};
|
fkey_command_linux[14] = {0, 0};
|
||||||
fkey_command_linux[15] = {0, 0};
|
fkey_command_linux[15] = {0, 0};
|
||||||
|
|
Loading…
Reference in New Issue