File Attributes thingy, command line file crash investigated

This commit is contained in:
Allen Webster 2019-02-13 15:15:22 -08:00
parent 77df5349b7
commit 9cfffe6bb6
13 changed files with 121 additions and 535 deletions

View File

@ -562,6 +562,11 @@ STRUCT Partial_Cursor{
TYPEDEF_FUNC bool32 Buffer_Edit_Handler(struct Application_Links *app, Buffer_ID buffer_id, int32_t start, int32_t one_past_last, String str);
// TODO(allen): what to do with batches???
STRUCT File_Attributes{
uint64_t size;
uint64_t last_write_time;
};
/* DOC(Buffer_Summary acts as a handle to a buffer and describes the state of the buffer.)
DOC_SEE(Access_Flag)
DOC_SEE(Dirty_State) */

View File

@ -29,6 +29,7 @@ struct Application_Links;
#define BUFFER_SAVE_SIG(n) bool32 n(Application_Links *app, Buffer_ID buffer_id, String file_name, uint32_t flags)
#define BUFFER_KILL_SIG(n) bool32 n(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags, Buffer_Kill_Result *result)
#define BUFFER_REOPEN_SIG(n) bool32 n(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag flags, Buffer_Reopen_Result *result)
#define BUFFER_GET_FILE_ATTRIBUTES_SIG(n) bool32 n(Application_Links *app, Buffer_ID buffer_id, File_Attributes *attributes_out)
#define GET_VIEW_FIRST_SIG(n) bool32 n(Application_Links *app, Access_Flag access, View_ID *view_id_out)
#define GET_VIEW_NEXT_SIG(n) bool32 n(Application_Links *app, View_ID view_id, Access_Flag access, View_ID *view_id_out)
#define GET_VIEW_SUMMARY_SIG(n) bool32 n(Application_Links *app, View_ID view_id, Access_Flag access, View_Summary *view_summary_out)
@ -165,6 +166,7 @@ typedef CREATE_BUFFER_SIG(Create_Buffer_Function);
typedef BUFFER_SAVE_SIG(Buffer_Save_Function);
typedef BUFFER_KILL_SIG(Buffer_Kill_Function);
typedef BUFFER_REOPEN_SIG(Buffer_Reopen_Function);
typedef BUFFER_GET_FILE_ATTRIBUTES_SIG(Buffer_Get_File_Attributes_Function);
typedef GET_VIEW_FIRST_SIG(Get_View_First_Function);
typedef GET_VIEW_NEXT_SIG(Get_View_Next_Function);
typedef GET_VIEW_SUMMARY_SIG(Get_View_Summary_Function);
@ -303,6 +305,7 @@ Create_Buffer_Function *create_buffer;
Buffer_Save_Function *buffer_save;
Buffer_Kill_Function *buffer_kill;
Buffer_Reopen_Function *buffer_reopen;
Buffer_Get_File_Attributes_Function *buffer_get_file_attributes;
Get_View_First_Function *get_view_first;
Get_View_Next_Function *get_view_next;
Get_View_Summary_Function *get_view_summary;
@ -440,6 +443,7 @@ Create_Buffer_Function *create_buffer_;
Buffer_Save_Function *buffer_save_;
Buffer_Kill_Function *buffer_kill_;
Buffer_Reopen_Function *buffer_reopen_;
Buffer_Get_File_Attributes_Function *buffer_get_file_attributes_;
Get_View_First_Function *get_view_first_;
Get_View_Next_Function *get_view_next_;
Get_View_Summary_Function *get_view_summary_;
@ -585,6 +589,7 @@ app_links->create_buffer_ = Create_Buffer;\
app_links->buffer_save_ = Buffer_Save;\
app_links->buffer_kill_ = Buffer_Kill;\
app_links->buffer_reopen_ = Buffer_Reopen;\
app_links->buffer_get_file_attributes_ = Buffer_Get_File_Attributes;\
app_links->get_view_first_ = Get_View_First;\
app_links->get_view_next_ = Get_View_Next;\
app_links->get_view_summary_ = Get_View_Summary;\
@ -722,6 +727,7 @@ static bool32 create_buffer(Application_Links *app, String file_name, Buffer_Cre
static bool32 buffer_save(Application_Links *app, Buffer_ID buffer_id, String file_name, uint32_t flags){return(app->buffer_save(app, buffer_id, file_name, flags));}
static bool32 buffer_kill(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags, Buffer_Kill_Result *result){return(app->buffer_kill(app, buffer_id, flags, result));}
static bool32 buffer_reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag flags, Buffer_Reopen_Result *result){return(app->buffer_reopen(app, buffer_id, flags, result));}
static bool32 buffer_get_file_attributes(Application_Links *app, Buffer_ID buffer_id, File_Attributes *attributes_out){return(app->buffer_get_file_attributes(app, buffer_id, attributes_out));}
static bool32 get_view_first(Application_Links *app, Access_Flag access, View_ID *view_id_out){return(app->get_view_first(app, access, view_id_out));}
static bool32 get_view_next(Application_Links *app, View_ID view_id, Access_Flag access, View_ID *view_id_out){return(app->get_view_next(app, view_id, access, view_id_out));}
static bool32 get_view_summary(Application_Links *app, View_ID view_id, Access_Flag access, View_Summary *view_summary_out){return(app->get_view_summary(app, view_id, access, view_summary_out));}
@ -859,6 +865,7 @@ static bool32 create_buffer(Application_Links *app, String file_name, Buffer_Cre
static bool32 buffer_save(Application_Links *app, Buffer_ID buffer_id, String file_name, uint32_t flags){return(app->buffer_save_(app, buffer_id, file_name, flags));}
static bool32 buffer_kill(Application_Links *app, Buffer_ID buffer_id, Buffer_Kill_Flag flags, Buffer_Kill_Result *result){return(app->buffer_kill_(app, buffer_id, flags, result));}
static bool32 buffer_reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag flags, Buffer_Reopen_Result *result){return(app->buffer_reopen_(app, buffer_id, flags, result));}
static bool32 buffer_get_file_attributes(Application_Links *app, Buffer_ID buffer_id, File_Attributes *attributes_out){return(app->buffer_get_file_attributes_(app, buffer_id, attributes_out));}
static bool32 get_view_first(Application_Links *app, Access_Flag access, View_ID *view_id_out){return(app->get_view_first_(app, access, view_id_out));}
static bool32 get_view_next(Application_Links *app, View_ID view_id, Access_Flag access, View_ID *view_id_out){return(app->get_view_next_(app, view_id, access, view_id_out));}
static bool32 get_view_summary(Application_Links *app, View_ID view_id, Access_Flag access, View_Summary *view_summary_out){return(app->get_view_summary_(app, view_id, access, view_summary_out));}

View File

@ -10,7 +10,6 @@ bind(context, 'k', MDFR_CTRL, interactive_kill_buffer);
bind(context, 'i', MDFR_CTRL, interactive_switch_buffer);
bind(context, 'h', MDFR_CTRL, project_go_to_root_directory);
bind(context, 'S', MDFR_CTRL, save_all_dirty_buffers);
bind(context, key_print_screen, MDFR_NONE, toggle_filebar);
bind(context, key_scroll_lock, MDFR_NONE, toggle_filebar);
bind(context, key_pause, MDFR_NONE, toggle_filebar);
bind(context, key_caps, MDFR_NONE, toggle_filebar);
@ -385,7 +384,7 @@ Meta_Sub_Map *sub_maps;
int32_t sub_map_count;
LINK_PROCS(void (*fill_keys_proc)(Bind_Helper *context);)
};
static Meta_Key_Bind fcoder_binds_for_default_mapid_global[44] = {
static Meta_Key_Bind fcoder_binds_for_default_mapid_global[43] = {
{0, 44, 1, "change_active_panel", 19, LINK_PROCS(change_active_panel)},
{0, 60, 1, "change_active_panel_backwards", 29, LINK_PROCS(change_active_panel_backwards)},
{0, 110, 1, "interactive_new", 15, LINK_PROCS(interactive_new)},
@ -395,7 +394,6 @@ static Meta_Key_Bind fcoder_binds_for_default_mapid_global[44] = {
{0, 105, 1, "interactive_switch_buffer", 25, LINK_PROCS(interactive_switch_buffer)},
{0, 104, 1, "project_go_to_root_directory", 28, LINK_PROCS(project_go_to_root_directory)},
{0, 83, 1, "save_all_dirty_buffers", 22, LINK_PROCS(save_all_dirty_buffers)},
{0, 55316, 0, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
{0, 55315, 0, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
{0, 55308, 0, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
{0, 55313, 0, "toggle_filebar", 14, LINK_PROCS(toggle_filebar)},
@ -412,6 +410,7 @@ static Meta_Key_Bind fcoder_binds_for_default_mapid_global[44] = {
{0, 88, 2, "project_command_lister", 22, LINK_PROCS(project_command_lister)},
{0, 73, 1, "list_all_functions_all_buffers_lister", 37, LINK_PROCS(list_all_functions_all_buffers_lister)},
{0, 69, 2, "exit_4coder", 11, LINK_PROCS(exit_4coder)},
{0, 55325, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55326, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55327, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55328, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
@ -427,16 +426,15 @@ static Meta_Key_Bind fcoder_binds_for_default_mapid_global[44] = {
{0, 55338, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55339, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55340, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55341, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55321, 0, "mouse_wheel_scroll", 18, LINK_PROCS(mouse_wheel_scroll)},
{0, 55321, 1, "mouse_wheel_change_face_size", 28, LINK_PROCS(mouse_wheel_change_face_size)},
{0, 55320, 0, "mouse_wheel_scroll", 18, LINK_PROCS(mouse_wheel_scroll)},
{0, 55320, 1, "mouse_wheel_change_face_size", 28, LINK_PROCS(mouse_wheel_change_face_size)},
};
static Meta_Key_Bind fcoder_binds_for_default_mapid_file[78] = {
{1, 0, 0, "write_character", 15, LINK_PROCS(write_character)},
{0, 55317, 0, "click_set_cursor_and_mark", 25, LINK_PROCS(click_set_cursor_and_mark)},
{0, 55324, 0, "click_set_cursor_and_mark", 25, LINK_PROCS(click_set_cursor_and_mark)},
{0, 55319, 0, "click_set_cursor", 16, LINK_PROCS(click_set_cursor)},
{0, 55322, 0, "click_set_cursor_if_lbutton", 27, LINK_PROCS(click_set_cursor_if_lbutton)},
{0, 55316, 0, "click_set_cursor_and_mark", 25, LINK_PROCS(click_set_cursor_and_mark)},
{0, 55323, 0, "click_set_cursor_and_mark", 25, LINK_PROCS(click_set_cursor_and_mark)},
{0, 55318, 0, "click_set_cursor", 16, LINK_PROCS(click_set_cursor)},
{0, 55321, 0, "click_set_cursor_if_lbutton", 27, LINK_PROCS(click_set_cursor_if_lbutton)},
{0, 55301, 0, "delete_char", 11, LINK_PROCS(delete_char)},
{0, 55301, 8, "delete_char", 11, LINK_PROCS(delete_char)},
{0, 55296, 0, "backspace_char", 14, LINK_PROCS(backspace_char)},
@ -556,14 +554,14 @@ static Meta_Key_Bind fcoder_binds_for_default_default_lister_ui_map[16] = {
{0, 55298, 0, "lister__move_down", 17, LINK_PROCS(lister__move_down)},
{0, 106, 2, "lister__move_down", 17, LINK_PROCS(lister__move_down)},
{0, 55306, 0, "lister__move_down", 17, LINK_PROCS(lister__move_down)},
{0, 55321, 0, "lister__wheel_scroll", 20, LINK_PROCS(lister__wheel_scroll)},
{0, 55317, 0, "lister__mouse_press", 19, LINK_PROCS(lister__mouse_press)},
{0, 55319, 0, "lister__mouse_release", 21, LINK_PROCS(lister__mouse_release)},
{0, 55320, 0, "lister__wheel_scroll", 20, LINK_PROCS(lister__wheel_scroll)},
{0, 55316, 0, "lister__mouse_press", 19, LINK_PROCS(lister__mouse_press)},
{0, 55318, 0, "lister__mouse_release", 21, LINK_PROCS(lister__mouse_release)},
{0, 55321, 0, "lister__repaint", 15, LINK_PROCS(lister__repaint)},
{0, 55322, 0, "lister__repaint", 15, LINK_PROCS(lister__repaint)},
{0, 55323, 0, "lister__repaint", 15, LINK_PROCS(lister__repaint)},
};
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, 44},
{"mapid_global", 12, "The following bindings apply in all situations.", 47, 0, 0, fcoder_binds_for_default_mapid_global, 43},
{"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, 78},
{"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, 16},
@ -591,6 +589,7 @@ static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_global[40] = {
{0, 88, 1, "project_command_lister", 22, LINK_PROCS(project_command_lister)},
{0, 73, 4, "list_all_functions_all_buffers_lister", 37, LINK_PROCS(list_all_functions_all_buffers_lister)},
{0, 69, 1, "exit_4coder", 11, LINK_PROCS(exit_4coder)},
{0, 55325, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55326, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55327, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55328, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
@ -606,17 +605,16 @@ static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_global[40] = {
{0, 55338, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55339, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55340, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55341, 0, "project_fkey_command", 20, LINK_PROCS(project_fkey_command)},
{0, 55321, 0, "mouse_wheel_scroll", 18, LINK_PROCS(mouse_wheel_scroll)},
{0, 55321, 4, "mouse_wheel_change_face_size", 28, LINK_PROCS(mouse_wheel_change_face_size)},
{0, 55320, 0, "mouse_wheel_scroll", 18, LINK_PROCS(mouse_wheel_scroll)},
{0, 55320, 4, "mouse_wheel_change_face_size", 28, LINK_PROCS(mouse_wheel_change_face_size)},
};
static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_file[77] = {
{1, 0, 0, "write_character", 15, LINK_PROCS(write_character)},
{1, 0, 2, "write_character", 15, LINK_PROCS(write_character)},
{0, 55317, 0, "click_set_cursor_and_mark", 25, LINK_PROCS(click_set_cursor_and_mark)},
{0, 55324, 0, "click_set_cursor_and_mark", 25, LINK_PROCS(click_set_cursor_and_mark)},
{0, 55319, 0, "click_set_cursor", 16, LINK_PROCS(click_set_cursor)},
{0, 55322, 0, "click_set_cursor_if_lbutton", 27, LINK_PROCS(click_set_cursor_if_lbutton)},
{0, 55316, 0, "click_set_cursor_and_mark", 25, LINK_PROCS(click_set_cursor_and_mark)},
{0, 55323, 0, "click_set_cursor_and_mark", 25, LINK_PROCS(click_set_cursor_and_mark)},
{0, 55318, 0, "click_set_cursor", 16, LINK_PROCS(click_set_cursor)},
{0, 55321, 0, "click_set_cursor_if_lbutton", 27, LINK_PROCS(click_set_cursor_if_lbutton)},
{0, 55301, 0, "delete_char", 11, LINK_PROCS(delete_char)},
{0, 55301, 8, "delete_char", 11, LINK_PROCS(delete_char)},
{0, 55296, 0, "backspace_char", 14, LINK_PROCS(backspace_char)},
@ -732,11 +730,11 @@ static Meta_Key_Bind fcoder_binds_for_mac_default_default_lister_ui_map[14] = {
{0, 55305, 0, "lister__move_up", 15, LINK_PROCS(lister__move_up)},
{0, 55298, 0, "lister__move_down", 17, LINK_PROCS(lister__move_down)},
{0, 55306, 0, "lister__move_down", 17, LINK_PROCS(lister__move_down)},
{0, 55321, 0, "lister__wheel_scroll", 20, LINK_PROCS(lister__wheel_scroll)},
{0, 55317, 0, "lister__mouse_press", 19, LINK_PROCS(lister__mouse_press)},
{0, 55319, 0, "lister__mouse_release", 21, LINK_PROCS(lister__mouse_release)},
{0, 55320, 0, "lister__wheel_scroll", 20, LINK_PROCS(lister__wheel_scroll)},
{0, 55316, 0, "lister__mouse_press", 19, LINK_PROCS(lister__mouse_press)},
{0, 55318, 0, "lister__mouse_release", 21, LINK_PROCS(lister__mouse_release)},
{0, 55321, 0, "lister__repaint", 15, LINK_PROCS(lister__repaint)},
{0, 55322, 0, "lister__repaint", 15, LINK_PROCS(lister__repaint)},
{0, 55323, 0, "lister__repaint", 15, LINK_PROCS(lister__repaint)},
};
static Meta_Sub_Map fcoder_submaps_for_mac_default[4] = {
{"mapid_global", 12, "The following bindings apply in all situations.", 47, 0, 0, fcoder_binds_for_mac_default_mapid_global, 40},

23
4ed.cpp
View File

@ -891,7 +891,8 @@ App_Init_Sig(app_init){
init_read_only_file(system, models, file);
}
else{
init_normal_file(system, models, 0, 0, file);
File_Attributes attributes = {};
init_normal_file(system, models, 0, 0, attributes, file);
}
file->settings.never_kill = true;
@ -988,24 +989,26 @@ App_Step_Sig(app_step){
if (input->first_step){
// Open command line files.
char space[512];
String cl_filename = make_fixed_width_string(space);
copy_ss(&cl_filename, models->hot_directory.string);
i32 cl_filename_len = cl_filename.size;
String cl_file_name = make_fixed_width_string(space);
copy_ss(&cl_file_name, models->hot_directory.string);
i32 cl_file_name_len = cl_file_name.size;
for (i32 i = 0; i < models->settings.init_files_count; ++i){
cl_filename.size = cl_filename_len;
cl_file_name.size = cl_file_name_len;
String filename = {};
String file_name = {};
Editing_File_Name canon_name = {};
if (get_canon_name(system, make_string_slowly(models->settings.init_files[i]),
&canon_name)){
filename = canon_name.name;
file_name = canon_name.name;
}
else{
append_sc(&cl_filename, models->settings.init_files[i]);
filename = cl_filename;
append_sc(&cl_file_name, models->settings.init_files[i]);
file_name = cl_file_name;
}
open_file(system, models, filename);
//open_file(system, models, file_name);
Buffer_ID id = 0;
create_buffer(&models->app_links, file_name, 0, &id);
}
if (models->hook_start != 0){

View File

@ -1255,32 +1255,31 @@ DOC_SEE(Buffer_Create_Flag)
file_bind_file_name(system, heap, working_set, file, canon.name);
}
buffer_bind_name(models, heap, part, working_set, file, front_of_directory(file_name));
init_normal_file(system, models, 0, 0, file);
File_Attributes attributes = {};
init_normal_file(system, models, 0, 0, attributes, file);
*new_buffer_id_out = file->id.id;
result = true;
}
}
}
else{
Assert(!handle_equal(handle, null_plat_handle));
i32 size = system->load_size(handle);
File_Attributes attributes = system->load_attributes(handle);
b32 in_heap_mem = false;
char *buffer = push_array(part, char, size);
char *buffer = push_array(part, char, (i32)attributes.size);
if (buffer == 0){
buffer = heap_array(heap, char, size);
buffer = heap_array(heap, char, (i32)attributes.size);
Assert(buffer != 0);
in_heap_mem = true;
}
if (system->load_file(handle, buffer, size)){
if (system->load_file(handle, buffer, (i32)attributes.size)){
system->load_close(handle);
file = working_set_alloc_always(working_set, heap, &models->lifetime_allocator);
if (file != 0){
file_bind_file_name(system, heap, working_set, file, canon.name);
buffer_bind_name(models, heap, part, working_set, file, front_of_directory(file_name));
init_normal_file(system, models, buffer, size, file);
init_normal_file(system, models, buffer, (i32)attributes.size, attributes, file);
*new_buffer_id_out = file->id.id;
result = true;
}
@ -1316,11 +1315,9 @@ DOC_SEE(Buffer_Create_Flag)
}
}
if (file != 0 && buffer_is_for_new_file &&
(flags & BufferCreate_SuppressNewFileHook) == 0){
if (models->hook_new_file != 0){
models->hook_new_file(&models->app_links, file->id.id);
}
if (file != 0 && buffer_is_for_new_file && (flags & BufferCreate_SuppressNewFileHook) == 0 &&
models->hook_new_file != 0){
models->hook_new_file(&models->app_links, file->id.id);
}
end_temp_memory(temp);
@ -1450,14 +1447,14 @@ Buffer_Reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag fl
if (file->canon.name.str != 0 && file->canon.name.size != 0){
Plat_Handle handle = {};
if (system->load_handle(file->canon.name.str, &handle)){
i32 size = system->load_size(handle);
File_Attributes attributes = system->load_attributes(handle);
Partition *part = &models->mem.part;
Temp_Memory temp = begin_temp_memory(part);
char *file_memory = push_array(part, char, size);
char *file_memory = push_array(part, char, (i32)attributes.size);
if (file_memory != 0){
if (system->load_file(handle, file_memory, size)){
if (system->load_file(handle, file_memory, (i32)attributes.size)){
system->load_close(handle);
// TODO(allen): try(perform a diff maybe apply edits in reopen)
@ -1486,7 +1483,7 @@ Buffer_Reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag fl
file_free(system, &models->mem.heap, &models->lifetime_allocator, file);
working_set_file_default_settings(&models->working_set, file);
init_normal_file(system, models, file_memory, size, file);
init_normal_file(system, models, file_memory, (i32)attributes.size, attributes, file);
for (i32 i = 0; i < vptr_count; ++i){
view_set_file(system, models, vptrs[i], file);
@ -1515,6 +1512,19 @@ Buffer_Reopen(Application_Links *app, Buffer_ID buffer_id, Buffer_Reopen_Flag fl
return(*result == BufferReopenResult_Reopened);
}
API_EXPORT bool32
Buffer_Get_File_Attributes(Application_Links *app, Buffer_ID buffer_id, File_Attributes *attributes_out)
{
Models *models = (Models*)app->cmd_context;
Editing_File *file = imp_get_file(models, buffer_id);
if (buffer_api_check_file(file)){
block_copy(attributes_out, &file->attributes, sizeof(*attributes_out));
return(true);
}
block_zero_struct(attributes_out);
return(false);
}
internal View*
get_view_next__inner(Layout *layout, View *view){
if (view != 0){

View File

@ -181,10 +181,12 @@ save_file_to_name(System_Functions *system, Models *models, Editing_File *file,
}
}
result = system->save_file(file_name, data, size);
if (result && using_actual_file_name){
file->state.ignore_behind_os = 1;
File_Attributes new_attributes = system->save_file(file_name, data, size);
if (new_attributes.last_write_time > 0){
if (using_actual_file_name){
file->state.ignore_behind_os = 1;
}
file->attributes = new_attributes;
}
file_set_dirty_flag(file, DirtyState_UpToDate);
@ -413,12 +415,12 @@ file_allocate_wrap_positions_as_needed(Heap *heap, Editing_File *file, i32 min_l
////////////////////////////////
internal void
file_create_from_string(System_Functions *system, Models *models, Editing_File *file, String val, u32 flags){
file_create_from_string(System_Functions *system, Models *models, Editing_File *file, String val, File_Attributes attributes, u32 flags){
Heap *heap = &models->mem.heap;
Partition *part = &models->mem.part;
Application_Links *app_links = &models->app_links;
memset(&file->state, 0, sizeof(file->state));
block_zero_struct(&file->state);
Gap_Buffer_Init init = buffer_begin_init(&file->state.buffer, val.str, val.size);
for (; buffer_init_need_more(&init); ){
i32 page_size = buffer_init_page_size(&init);
@ -436,9 +438,10 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File *
AllowLocal(init_success); Assert(init_success);
if (buffer_size(&file->state.buffer) < val.size){
file->settings.dos_write_mode = 1;
file->settings.dos_write_mode = true;
}
file_set_dirty_flag(file, DirtyState_UpToDate);
file->attributes = attributes;
Face_ID font_id = models->global_font_id;
file->settings.font_id = font_id;
@ -515,15 +518,16 @@ file_free(System_Functions *system, Heap *heap, Lifetime_Allocator *lifetime_all
}
internal void
init_normal_file(System_Functions *system, Models *models, char *buffer, i32 size, Editing_File *file){
init_normal_file(System_Functions *system, Models *models, char *buffer, i32 size, File_Attributes attributes, Editing_File *file){
String val = make_string(buffer, size);
file_create_from_string(system, models, file, val, 0);
file_create_from_string(system, models, file, val, attributes, 0);
}
internal void
init_read_only_file(System_Functions *system, Models *models, Editing_File *file){
String val = null_string;
file_create_from_string(system, models, file, val, FileCreateFlag_ReadOnly);
String val = {};
File_Attributes attributes = {};
file_create_from_string(system, models, file, val, attributes, FileCreateFlag_ReadOnly);
}
////////////////////////////////

View File

@ -106,6 +106,7 @@ struct Editing_File{
b32 is_loading;
b32 is_dummy;
Editing_File_State state;
File_Attributes attributes;
Lifetime_Object *lifetime_object;
Editing_File_Name base_name;
Editing_File_Name unique_name;

View File

@ -17,8 +17,6 @@ struct Plat_Handle{
u32 d[4];
};
static Plat_Handle null_plat_handle = {};
internal b32
handle_equal(Plat_Handle a, Plat_Handle b){
b32 result = (memcmp(&a, &b, sizeof(a)) == 0);
@ -36,8 +34,8 @@ typedef Sys_Get_Canonical_Sig(System_Get_Canonical);
#define Sys_Load_Handle_Sig(name) b32 name(char *filename, Plat_Handle *handle_out)
typedef Sys_Load_Handle_Sig(System_Load_Handle);
#define Sys_Load_Size_Sig(name) u32 name(Plat_Handle handle)
typedef Sys_Load_Size_Sig(System_Load_Size);
#define Sys_Load_Attributes_Sig(name) File_Attributes name(Plat_Handle handle)
typedef Sys_Load_Attributes_Sig(System_Load_Attributes);
#define Sys_Load_File_Sig(name) b32 name(Plat_Handle handle, char *buffer, u32 size)
typedef Sys_Load_File_Sig(System_Load_File);
@ -45,7 +43,7 @@ typedef Sys_Load_File_Sig(System_Load_File);
#define Sys_Load_Close_Sig(name) b32 name(Plat_Handle handle)
typedef Sys_Load_Close_Sig(System_Load_Close);
#define Sys_Save_File_Sig(name) b32 name(char *filename, char *buffer, u32 size)
#define Sys_Save_File_Sig(name) File_Attributes name(char *filename, char *buffer, u32 size)
typedef Sys_Save_File_Sig(System_Save_File);
// file changes
@ -239,7 +237,7 @@ struct System_Functions{
System_Remove_Listener *remove_listener;
System_Get_File_Change *get_file_change;
System_Load_Handle *load_handle;
System_Load_Size *load_size;
System_Load_Attributes *load_attributes;
System_Load_File *load_file;
System_Load_Close *load_close;
System_Save_File *save_file;

View File

@ -567,57 +567,6 @@ buffer_bind_name(Models *models, Heap *heap, Partition *scratch,
////////////////////////////////
internal Editing_File*
open_file(System_Functions *system, Models *models, String file_name){
Editing_File *file = 0;
Editing_File_Name canon_name = {};
if (terminate_with_null(&file_name) &&
get_canon_name(system, file_name, &canon_name)){
Working_Set *working_set = &models->working_set;
file = working_set_contains_canon(working_set, canon_name.name);
if (file == 0){
Plat_Handle handle;
if (system->load_handle(canon_name.name.str, &handle)){
Mem_Options *mem = &models->mem;
Heap *heap = &mem->heap;
Partition *part = &mem->part;
file = working_set_alloc_always(working_set, heap, &models->lifetime_allocator);
file_bind_file_name(system, heap, working_set, file, canon_name.name);
buffer_bind_name(models, heap, part, working_set, file, front_of_directory(file_name));
Temp_Memory temp = begin_temp_memory(part);
i32 size = system->load_size(handle);
char *buffer = push_array(part, char, size);
b32 gen_buffer = false;
if (buffer == 0){
buffer = heap_array(heap, char, size);
Assert(buffer != 0);
gen_buffer = true;
}
b32 good_load = system->load_file(handle, buffer, size);
system->load_close(handle);
if (good_load){
init_normal_file(system, models, buffer, size, file);
}
if (gen_buffer){
heap_free(heap, buffer);
}
end_temp_memory(temp);
}
}
}
return(file);
}
////////////////////////////////
internal void
file_touch(Working_Set *working_set, Editing_File *file){
Assert(file != 0);

View File

@ -21,7 +21,7 @@ link_system_code(){
SYSLINK(remove_listener);
SYSLINK(get_file_change);
SYSLINK(load_handle);
SYSLINK(load_size);
SYSLINK(load_attributes);
SYSLINK(load_file);
SYSLINK(load_close);
SYSLINK(save_file);

View File

@ -41,36 +41,6 @@ init_shared_vars(){
// General shared pieces
//
internal File_Data
sysshared_load_file(char *filename){
File_Data result = {};
Plat_Handle handle = {};
if (system_load_handle(filename, &handle)){
u32 size = system_load_size(handle);
result.got_file = 1;
if (size > 0){
result.size = size;
result.data = (char*)system_memory_allocate(size+1);
if (!result.data){
result = null_file_data;
}
else{
if (!system_load_file(handle, result.data, size)){
system_memory_free(result.data, size+1);
result = null_file_data;
}
}
}
system_load_close(handle);
}
return(result);
}
internal void
sysshared_filter_real_files(char **files, i32 *file_count){
i32 end = *file_count;

View File

@ -334,79 +334,78 @@ Sys_Get_Canonical_Sig(system_get_canonical){
return(result);
}
internal File_Attributes
win32_file_attributes_from_HANDLE(HANDLE file){
BY_HANDLE_FILE_INFORMATION info = {};
GetFileInformationByHandle(file, &info);
File_Attributes result = {};
result.size = ((u64)info.nFileSizeHigh << 32LL) | ((u64)info.nFileSizeLow);
result.last_write_time = ((u64)info.ftLastWriteTime.dwHighDateTime << 32LL) | ((u64)info.ftLastWriteTime.dwLowDateTime);
return(result);
}
internal
Sys_Load_Handle_Sig(system_load_handle){
b32 result = false;
HANDLE file = CreateFile_utf8(&shared_vars.scratch, (u8*)filename, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (file != INVALID_HANDLE_VALUE){
*(HANDLE*)handle_out = file;
result = true;
}
return(result);
}
internal
Sys_Load_Size_Sig(system_load_size){
u32 result = 0;
Sys_Load_Attributes_Sig(system_load_attributes){
HANDLE file = *(HANDLE*)(&handle);
DWORD hi = 0;
DWORD lo = GetFileSize(file, &hi);
if (hi == 0){
result = lo;
}
return(result);
return(win32_file_attributes_from_HANDLE(file));
}
internal
Sys_Load_File_Sig(system_load_file){
b32 result = 0;
HANDLE file = *(HANDLE*)(&handle);
DWORD read_size = 0;
b32 result = false;
if (ReadFile(file, buffer, size, &read_size, 0)){
if (read_size == size){
result = 1;
result = true;
}
}
return(result);
}
internal
Sys_Load_Close_Sig(system_load_close){
b32 result = 0;
b32 result = false;
HANDLE file = *(HANDLE*)(&handle);
if (CloseHandle(file)){
result = 1;
result = true;
}
return(result);
}
internal
Sys_Save_File_Sig(system_save_file){
b32 result = false;
File_Attributes result = {};
HANDLE file = CreateFile_utf8(&shared_vars.scratch, (u8*)filename, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (file != INVALID_HANDLE_VALUE){
DWORD written_total = 0;
DWORD written_size = 0;
result = true;
while (written_total < size){
b32 success = true;
for (;written_total < size;){
if (!WriteFile(file, buffer + written_total, size - written_total, &written_size, 0)){
result = 0;
success = false;
break;
}
written_total += written_size;
}
if (success){
result = win32_file_attributes_from_HANDLE(file);
}
CloseHandle(file);
}

View File

@ -20,361 +20,3 @@ The following bindings apply in all situations.
\ITEM \STYLE{code} <ctrl i> \END Interactively switch to an open buffer.
\ITEM \STYLE{code} <ctrl h> \END Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.
\ITEM \STYLE{code} <ctrl S> \END Saves all buffers marked dirty (showing the '*' indicator).
\ITEM \STYLE{code} <alt .> \END If the special build panel is open, makes the build panel the active panel.
\ITEM \STYLE{code} <alt ,> \END If the special build panel is open, closes it.
\ITEM \STYLE{code} <alt n> \END If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.
\ITEM \STYLE{code} <alt N> \END If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.
\ITEM \STYLE{code} <alt M> \END If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.
\ITEM \STYLE{code} <alt m> \END Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.
\ITEM \STYLE{code} <alt b> \END Toggles the visibility status of the current view's filebar.
\ITEM \STYLE{code} <alt z> \END Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.
\ITEM \STYLE{code} <alt Z> \END If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.
\ITEM \STYLE{code} <alt x> \END Opens an interactive list of all registered commands.
\ITEM \STYLE{code} <alt X> \END Open a lister of all commands in the currently loaded project.
\ITEM \STYLE{code} <ctrl I> \END Creates a lister of locations that look like function definitions and declarations all buffers.
\ITEM \STYLE{code} <alt E> \END Attempts to close 4coder.
\ITEM \STYLE{code} <f1> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f2> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f3> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f4> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f5> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f6> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f7> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f8> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f9> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f10> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f11> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f12> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f13> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f14> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f15> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f16> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <mouse wheel> \END Reads the scroll wheel value from the mouse state and scrolls accordingly.
\ITEM \STYLE{code} <ctrl mouse wheel> \END Reads the state of the mouse wheel and uses it to either increase or decrease the face size.
\END
\END
\SECTION{mapid-file}
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.
\LIST
\ITEM \STYLE{code} <any character> \END Inserts whatever character was used to trigger this command.
\ITEM \STYLE{code} <left click> \END Sets the cursor position and mark to the mouse position.
\ITEM \STYLE{code} <click_activate_view> \END Sets the cursor position and mark to the mouse position.
\ITEM \STYLE{code} <left release> \END Sets the cursor position to the mouse position.
\ITEM \STYLE{code} <mouse move> \END If the mouse left button is pressed, sets the cursor position to the mouse position.
\ITEM \STYLE{code} <delete> \END Deletes the character to the right of the cursor.
\ITEM \STYLE{code} <shift delete> \END Deletes the character to the right of the cursor.
\ITEM \STYLE{code} <backspace> \END Deletes the character to the left of the cursor.
\ITEM \STYLE{code} <shift backspace> \END Deletes the character to the left of the cursor.
\ITEM \STYLE{code} <up> \END Moves the cursor up one line.
\ITEM \STYLE{code} <down> \END Moves the cursor down one line.
\ITEM \STYLE{code} <left> \END Moves the cursor one character to the left.
\ITEM \STYLE{code} <right> \END Moves the cursor one character to the right.
\ITEM \STYLE{code} <shift up> \END Moves the cursor up one line.
\ITEM \STYLE{code} <shift down> \END Moves the cursor down one line.
\ITEM \STYLE{code} <shift left> \END Moves the cursor one character to the left.
\ITEM \STYLE{code} <shift right> \END Moves the cursor one character to the right.
\ITEM \STYLE{code} <end> \END Seeks the cursor to the end of the visual line.
\ITEM \STYLE{code} <home> \END Seeks the cursor to the beginning of the visual line.
\ITEM \STYLE{code} <ctrl page up> \END Sets the cursor to the beginning of the file.
\ITEM \STYLE{code} <ctrl page down> \END Sets the cursor to the end of the file.
\ITEM \STYLE{code} <page up> \END Scrolls the view up one view height and moves the cursor up one view height.
\ITEM \STYLE{code} <page down> \END Scrolls the view down one view height and moves the cursor down one view height.
\ITEM \STYLE{code} <shift end> \END Seeks the cursor to the end of the visual line.
\ITEM \STYLE{code} <shift home> \END Seeks the cursor to the beginning of the visual line.
\ITEM \STYLE{code} <ctrlshift page up> \END Sets the cursor to the beginning of the file.
\ITEM \STYLE{code} <ctrlshift page down> \END Sets the cursor to the end of the file.
\ITEM \STYLE{code} <shift page up> \END Scrolls the view up one view height and moves the cursor up one view height.
\ITEM \STYLE{code} <shift page down> \END Scrolls the view down one view height and moves the cursor down one view height.
\ITEM \STYLE{code} <ctrl up> \END Seeks the cursor up to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <ctrl down> \END Seeks the cursor down to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <ctrl left> \END Seek left for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <ctrl right> \END Seek right for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <ctrlshift up> \END Seeks the cursor up to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <ctrlshift down> \END Seeks the cursor down to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <ctrlshift left> \END Seek left for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <ctrlshift right> \END Seek right for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <alt up> \END Swaps the line under the cursor with the line above it, and moves the cursor up with it.
\ITEM \STYLE{code} <alt down> \END Swaps the line under the cursor with the line below it, and moves the cursor down with it.
\ITEM \STYLE{code} <ctrl backspace> \END Delete characters between the cursor position and the first alphanumeric boundary to the left.
\ITEM \STYLE{code} <ctrl delete> \END Delete characters between the cursor position and the first alphanumeric boundary to the right.
\ITEM \STYLE{code} <alt backspace> \END Delete a single, whole token on or to the left of the cursor and post it to the clipboard.
\ITEM \STYLE{code} <alt delete> \END Delete a single, whole token on or to the right of the cursor and post it to the clipboard.
\ITEM \STYLE{code} <ctrl space> \END Sets the mark to the current position of the cursor.
\ITEM \STYLE{code} <ctrl a> \END Queries the user for two strings, and replaces all occurences of the first string in the range between the cursor and the mark with the second string.
\ITEM \STYLE{code} <ctrl c> \END Copy the text in the range from the cursor to the mark onto the clipboard.
\ITEM \STYLE{code} <ctrl d> \END Deletes the text in the range between the cursor and the mark.
\ITEM \STYLE{code} <ctrl D> \END Delete the line the on which the cursor sits.
\ITEM \STYLE{code} <ctrl e> \END Centers the view vertically on the line on which the cursor sits.
\ITEM \STYLE{code} <ctrl E> \END Sets the left size of the view near the x position of the cursor.
\ITEM \STYLE{code} <ctrl f> \END Begins an incremental search down through the current buffer for a user specified string.
\ITEM \STYLE{code} <ctrl F> \END Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.
\ITEM \STYLE{code} <alt F> \END Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.
\ITEM \STYLE{code} <ctrl g> \END Queries the user for a number, and jumps the cursor to the corresponding line.
\ITEM \STYLE{code} <ctrl G> \END Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.
\ITEM \STYLE{code} <ctrl j> \END Opens a snippet lister for inserting whole pre-written snippets of text.
\ITEM \STYLE{code} <ctrl K> \END Kills the current buffer.
\ITEM \STYLE{code} <ctrl L> \END Create a copy of the line on which the cursor sits.
\ITEM \STYLE{code} <ctrl m> \END Swaps the position of the cursor and the mark.
\ITEM \STYLE{code} <ctrl O> \END Reopen the current buffer from the hard drive.
\ITEM \STYLE{code} <ctrl q> \END Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.
\ITEM \STYLE{code} <ctrl Q> \END Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.
\ITEM \STYLE{code} <alt q> \END Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.
\ITEM \STYLE{code} <ctrl r> \END Begins an incremental search up through the current buffer for a user specified string.
\ITEM \STYLE{code} <ctrl s> \END Saves the current buffer.
\ITEM \STYLE{code} <ctrl t> \END Begins an incremental search down through the current buffer for the word or token under the cursor.
\ITEM \STYLE{code} <ctrl T> \END Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.
\ITEM \STYLE{code} <ctrl v> \END Paste from the top of clipboard and run auto-indent on the newly pasted text.
\ITEM \STYLE{code} <ctrl V> \END Paste the next item on the clipboard and run auto-indent on the newly pasted text.
\ITEM \STYLE{code} <ctrl x> \END Cut the text in the range from the cursor to the mark onto the clipboard.
\ITEM \STYLE{code} <ctrl y> \END Advances forewards through the undo history.
\ITEM \STYLE{code} <ctrl z> \END Advances backwards through the undo history.
\ITEM \STYLE{code} <ctrl 1> \END Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.
\ITEM \STYLE{code} <ctrl 2> \END Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.
\ITEM \STYLE{code} <return> \END If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.
\ITEM \STYLE{code} <shift return> \END If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.
\ITEM \STYLE{code} <ctrl >> \END When executed on a buffer with jumps, creates a persistent lister for all the jumps
\ITEM \STYLE{code} <shift space> \END Inserts whatever character was used to trigger this command.
\END
\END
\SECTION{default-code-map}
The following commands only apply in files where the lexer (syntax highlighting) is turned on.
\LIST
\ITEM \STYLE{code} <ctrl left> \END Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.
\ITEM \STYLE{code} <ctrl right> \END Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.
\ITEM \STYLE{code} <return> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <shift return> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <}> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <)> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <]> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <;> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <#> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <ctrl ;> \END Turns uncommented lines into commented lines and vice versa for comments starting with '//'.
\ITEM \STYLE{code} <tab> \END Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.
\ITEM \STYLE{code} <ctrl tab> \END Auto-indents the range between the cursor and the mark.
\ITEM \STYLE{code} <shift tab> \END Auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <alt r> \END At the cursor, insert a block comment.
\ITEM \STYLE{code} <alt t> \END At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.
\ITEM \STYLE{code} <alt y> \END At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.
\ITEM \STYLE{code} <alt D> \END Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.
\ITEM \STYLE{code} <alt T> \END Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.
\ITEM \STYLE{code} <ctrl [> \END At the cursor, insert a '{' and '}' separated by a blank line.
\ITEM \STYLE{code} <ctrl {> \END At the cursor, insert a '{' and '};' separated by a blank line.
\ITEM \STYLE{code} <ctrl }> \END At the cursor, insert a '{' and '}break;' separated by a blank line.
\ITEM \STYLE{code} <alt [> \END Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.
\ITEM \STYLE{code} <alt ]> \END Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.
\ITEM \STYLE{code} <alt '> \END Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.
\ITEM \STYLE{code} <alt /> \END Wraps the code contained in the range between cursor and mark with a new curly brace scope.
\ITEM \STYLE{code} <alt -> \END Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.
\ITEM \STYLE{code} <alt j> \END If a scope is currently selected, and a statement or block statement is present below the current scope, the statement is moved into the scope.
\ITEM \STYLE{code} <alt i> \END Surround the range between the cursor and mark with an '#if 0' and an '#endif'
\ITEM \STYLE{code} <alt 1> \END Reads a filename from surrounding '"' characters and attempts to open the corresponding file.
\ITEM \STYLE{code} <alt 2> \END If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.
\ITEM \STYLE{code} <ctrl 0> \END At the cursor, insert a ' = {};'.
\END
\END
\SECTION{default-lister-ui-map}
These commands apply in 'lister mode' such as when you open a file.
\LIST
\ITEM \STYLE{code} <any character> \END A lister mode command that dispatches to the lister's write character handler.
\ITEM \STYLE{code} <escape> \END A lister mode command that quits the list without executing any actions.
\ITEM \STYLE{code} <return> \END A lister mode command that activates the list's action on the highlighted item.
\ITEM \STYLE{code} <tab> \END A lister mode command that activates the list's action on the highlighted item.
\ITEM \STYLE{code} <backspace> \END A lister mode command that dispatches to the lister's backspace text field handler.
\ITEM \STYLE{code} <up> \END A lister mode command that dispatches to the lister's navigate up handler.
\ITEM \STYLE{code} <alt k> \END A lister mode command that dispatches to the lister's navigate up handler.
\ITEM \STYLE{code} <page up> \END A lister mode command that dispatches to the lister's navigate up handler.
\ITEM \STYLE{code} <down> \END A lister mode command that dispatches to the lister's navigate down handler.
\ITEM \STYLE{code} <alt j> \END A lister mode command that dispatches to the lister's navigate down handler.
\ITEM \STYLE{code} <page down> \END A lister mode command that dispatches to the lister's navigate down handler.
\ITEM \STYLE{code} <mouse wheel> \END A lister mode command that scrolls the list in response to the mouse wheel.
\ITEM \STYLE{code} <left click> \END A lister mode command that beings a click interaction with a list item under the mouse.
\ITEM \STYLE{code} <left release> \END A lister mode command that ends a click interaction with a list item under the mouse, possibly activating it.
\ITEM \STYLE{code} <mouse move> \END A lister mode command that updates the lists UI data.
\ITEM \STYLE{code} <animate> \END A lister mode command that updates the lists UI data.
\END
\END
\END
\SECTION{Map: mac-default}
\SECTION{mapid-global}
The following bindings apply in all situations.
\LIST
\ITEM \STYLE{code} <cmnd ,> \END Change the currently active panel, moving to the panel with the next highest view_id.
\ITEM \STYLE{code} <cmnd <> \END Change the currently active panel, moving to the panel with the next lowest view_id.
\ITEM \STYLE{code} <cmnd n> \END Interactively creates a new file.
\ITEM \STYLE{code} <cmnd o> \END Interactively open a file out of the file system.
\ITEM \STYLE{code} <ctrl o> \END Interactively opens a file in the other panel.
\ITEM \STYLE{code} <cmnd k> \END Interactively kill an open buffer.
\ITEM \STYLE{code} <cmnd i> \END Interactively switch to an open buffer.
\ITEM \STYLE{code} <cmnd h> \END Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.
\ITEM \STYLE{code} <cmnd S> \END Saves all buffers marked dirty (showing the '*' indicator).
\ITEM \STYLE{code} <ctrl .> \END If the special build panel is open, makes the build panel the active panel.
\ITEM \STYLE{code} <ctrl ,> \END If the special build panel is open, closes it.
\ITEM \STYLE{code} <ctrl n> \END If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.
\ITEM \STYLE{code} <ctrl N> \END If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.
\ITEM \STYLE{code} <ctrl M> \END If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.
\ITEM \STYLE{code} <ctrl m> \END Looks for a build.bat, build.sh, or makefile in the current and parent directories. Runs the first that it finds and prints the output to *compilation*. Puts the *compilation* buffer in a panel at the footer of the current view.
\ITEM \STYLE{code} <ctrl b> \END Toggles the visibility status of the current view's filebar.
\ITEM \STYLE{code} <ctrl z> \END Queries for an output buffer name and system command, runs the system command as a CLI and prints the output to the specified buffer.
\ITEM \STYLE{code} <ctrl Z> \END If the command execute_any_cli has already been used, this will execute a CLI reusing the most recent buffer name and command.
\ITEM \STYLE{code} <ctrl x> \END Opens an interactive list of all registered commands.
\ITEM \STYLE{code} <ctrl X> \END Open a lister of all commands in the currently loaded project.
\ITEM \STYLE{code} <cmnd I> \END Creates a lister of locations that look like function definitions and declarations all buffers.
\ITEM \STYLE{code} <ctrl E> \END Attempts to close 4coder.
\ITEM \STYLE{code} <f1> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f2> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f3> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f4> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f5> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f6> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f7> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f8> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f9> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f10> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f11> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f12> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f13> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f14> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f15> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <f16> \END Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.
\ITEM \STYLE{code} <mouse wheel> \END Reads the scroll wheel value from the mouse state and scrolls accordingly.
\ITEM \STYLE{code} <cmnd mouse wheel> \END Reads the state of the mouse wheel and uses it to either increase or decrease the face size.
\END
\END
\SECTION{mapid-file}
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.
\LIST
\ITEM \STYLE{code} <any character> \END Inserts whatever character was used to trigger this command.
\ITEM \STYLE{code} <alt any character> \END Inserts whatever character was used to trigger this command.
\ITEM \STYLE{code} <left click> \END Sets the cursor position and mark to the mouse position.
\ITEM \STYLE{code} <click_activate_view> \END Sets the cursor position and mark to the mouse position.
\ITEM \STYLE{code} <left release> \END Sets the cursor position to the mouse position.
\ITEM \STYLE{code} <mouse move> \END If the mouse left button is pressed, sets the cursor position to the mouse position.
\ITEM \STYLE{code} <delete> \END Deletes the character to the right of the cursor.
\ITEM \STYLE{code} <shift delete> \END Deletes the character to the right of the cursor.
\ITEM \STYLE{code} <backspace> \END Deletes the character to the left of the cursor.
\ITEM \STYLE{code} <shift backspace> \END Deletes the character to the left of the cursor.
\ITEM \STYLE{code} <up> \END Moves the cursor up one line.
\ITEM \STYLE{code} <down> \END Moves the cursor down one line.
\ITEM \STYLE{code} <left> \END Moves the cursor one character to the left.
\ITEM \STYLE{code} <right> \END Moves the cursor one character to the right.
\ITEM \STYLE{code} <shift up> \END Moves the cursor up one line.
\ITEM \STYLE{code} <shift down> \END Moves the cursor down one line.
\ITEM \STYLE{code} <shift left> \END Moves the cursor one character to the left.
\ITEM \STYLE{code} <shift right> \END Moves the cursor one character to the right.
\ITEM \STYLE{code} <end> \END Seeks the cursor to the end of the visual line.
\ITEM \STYLE{code} <home> \END Seeks the cursor to the beginning of the visual line.
\ITEM \STYLE{code} <ctrl page up> \END Sets the cursor to the beginning of the file.
\ITEM \STYLE{code} <ctrl page down> \END Sets the cursor to the end of the file.
\ITEM \STYLE{code} <page up> \END Scrolls the view up one view height and moves the cursor up one view height.
\ITEM \STYLE{code} <page down> \END Scrolls the view down one view height and moves the cursor down one view height.
\ITEM \STYLE{code} <shift end> \END Seeks the cursor to the end of the visual line.
\ITEM \STYLE{code} <shift home> \END Seeks the cursor to the beginning of the visual line.
\ITEM \STYLE{code} <ctrlshift page up> \END Sets the cursor to the beginning of the file.
\ITEM \STYLE{code} <ctrlshift page down> \END Sets the cursor to the end of the file.
\ITEM \STYLE{code} <shift page up> \END Scrolls the view up one view height and moves the cursor up one view height.
\ITEM \STYLE{code} <shift page down> \END Scrolls the view down one view height and moves the cursor down one view height.
\ITEM \STYLE{code} <cmnd up> \END Seeks the cursor up to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <cmnd down> \END Seeks the cursor down to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <cmnd left> \END Seek left for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <cmnd right> \END Seek right for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <cmndshift up> \END Seeks the cursor up to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <cmndshift down> \END Seeks the cursor down to the next blank line and places it at the end of the line.
\ITEM \STYLE{code} <cmndshift left> \END Seek left for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <cmndshift right> \END Seek right for the next boundary between whitespace and non-whitespace.
\ITEM \STYLE{code} <alt up> \END Swaps the line under the cursor with the line above it, and moves the cursor up with it.
\ITEM \STYLE{code} <alt down> \END Swaps the line under the cursor with the line below it, and moves the cursor down with it.
\ITEM \STYLE{code} <cmnd backspace> \END Delete characters between the cursor position and the first alphanumeric boundary to the left.
\ITEM \STYLE{code} <cmnd delete> \END Delete characters between the cursor position and the first alphanumeric boundary to the right.
\ITEM \STYLE{code} <ctrl backspace> \END Delete a single, whole token on or to the left of the cursor and post it to the clipboard.
\ITEM \STYLE{code} <ctrl delete> \END Delete a single, whole token on or to the right of the cursor and post it to the clipboard.
\ITEM \STYLE{code} <cmnd /> \END Sets the mark to the current position of the cursor.
\ITEM \STYLE{code} <cmnd a> \END Queries the user for two strings, and replaces all occurences of the first string in the range between the cursor and the mark with the second string.
\ITEM \STYLE{code} <cmnd c> \END Copy the text in the range from the cursor to the mark onto the clipboard.
\ITEM \STYLE{code} <cmnd d> \END Deletes the text in the range between the cursor and the mark.
\ITEM \STYLE{code} <cmnd D> \END Delete the line the on which the cursor sits.
\ITEM \STYLE{code} <cmnd e> \END Centers the view vertically on the line on which the cursor sits.
\ITEM \STYLE{code} <cmnd E> \END Sets the left size of the view near the x position of the cursor.
\ITEM \STYLE{code} <cmnd f> \END Begins an incremental search down through the current buffer for a user specified string.
\ITEM \STYLE{code} <cmnd F> \END Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.
\ITEM \STYLE{code} <ctrl F> \END Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.
\ITEM \STYLE{code} <cmnd g> \END Queries the user for a number, and jumps the cursor to the corresponding line.
\ITEM \STYLE{code} <cmnd G> \END Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.
\ITEM \STYLE{code} <cmnd K> \END Kills the current buffer.
\ITEM \STYLE{code} <cmnd L> \END Create a copy of the line on which the cursor sits.
\ITEM \STYLE{code} <cmnd m> \END Swaps the position of the cursor and the mark.
\ITEM \STYLE{code} <cmnd O> \END Reopen the current buffer from the hard drive.
\ITEM \STYLE{code} <cmnd q> \END Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.
\ITEM \STYLE{code} <cmnd Q> \END Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.
\ITEM \STYLE{code} <cmnd r> \END Begins an incremental search up through the current buffer for a user specified string.
\ITEM \STYLE{code} <cmnd s> \END Saves the current buffer.
\ITEM \STYLE{code} <cmnd t> \END Begins an incremental search down through the current buffer for the word or token under the cursor.
\ITEM \STYLE{code} <cmnd T> \END Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.
\ITEM \STYLE{code} <cmnd v> \END Paste from the top of clipboard and run auto-indent on the newly pasted text.
\ITEM \STYLE{code} <cmnd V> \END Paste the next item on the clipboard and run auto-indent on the newly pasted text.
\ITEM \STYLE{code} <cmnd x> \END Cut the text in the range from the cursor to the mark onto the clipboard.
\ITEM \STYLE{code} <cmnd y> \END Advances forewards through the undo history.
\ITEM \STYLE{code} <cmnd z> \END Advances backwards through the undo history.
\ITEM \STYLE{code} <cmnd 1> \END Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.
\ITEM \STYLE{code} <cmnd 2> \END Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.
\ITEM \STYLE{code} <return> \END If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.
\ITEM \STYLE{code} <shift return> \END If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.
\ITEM \STYLE{code} <cmnd >> \END When executed on a buffer with jumps, creates a persistent lister for all the jumps
\ITEM \STYLE{code} <shift space> \END Inserts whatever character was used to trigger this command.
\END
\END
\SECTION{default-code-map}
The following commands only apply in files where the lexer (syntax highlighting) is turned on.
\LIST
\ITEM \STYLE{code} <cmnd left> \END Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.
\ITEM \STYLE{code} <cmnd right> \END Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.
\ITEM \STYLE{code} <return> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <shift return> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <}> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <)> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <]> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <;> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <#> \END Inserts a character and auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <ctrl ;> \END Turns uncommented lines into commented lines and vice versa for comments starting with '//'.
\ITEM \STYLE{code} <tab> \END Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.
\ITEM \STYLE{code} <cmnd tab> \END Auto-indents the range between the cursor and the mark.
\ITEM \STYLE{code} <shift tab> \END Auto-indents the line on which the cursor sits.
\ITEM \STYLE{code} <ctrl r> \END At the cursor, insert a block comment.
\ITEM \STYLE{code} <ctrl t> \END At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.
\ITEM \STYLE{code} <ctrl y> \END At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.
\ITEM \STYLE{code} <ctrl D> \END Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.
\ITEM \STYLE{code} <ctrl T> \END Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.
\ITEM \STYLE{code} <cmnd [> \END At the cursor, insert a '{' and '}' separated by a blank line.
\ITEM \STYLE{code} <cmnd {> \END At the cursor, insert a '{' and '};' separated by a blank line.
\ITEM \STYLE{code} <cmnd }> \END At the cursor, insert a '{' and '}break;' separated by a blank line.
\ITEM \STYLE{code} <ctrl [> \END Finds the scope enclosed by '{' '}' surrounding the cursor and puts the cursor and mark on the '{' and '}'.
\ITEM \STYLE{code} <ctrl ]> \END Finds the first scope started by '{' before the cursor and puts the cursor and mark on the '{' and '}'.
\ITEM \STYLE{code} <ctrl '> \END Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.
\ITEM \STYLE{code} <ctrl /> \END Wraps the code contained in the range between cursor and mark with a new curly brace scope.
\ITEM \STYLE{code} <ctrl -> \END Deletes the braces surrounding the currently selected scope. Leaves the contents within the scope.
\ITEM \STYLE{code} <ctrl j> \END If a scope is currently selected, and a statement or block statement is present below the current scope, the statement is moved into the scope.
\ITEM \STYLE{code} <ctrl i> \END Surround the range between the cursor and mark with an '#if 0' and an '#endif'
\ITEM \STYLE{code} <ctrl 1> \END Reads a filename from surrounding '"' characters and attempts to open the corresponding file.
\ITEM \STYLE{code} <ctrl 2> \END If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.
\ITEM \STYLE{code} <cmnd 0> \END At the cursor, insert a ' = {};'.
\END
\END
\SECTION{default-lister-ui-map}
These commands apply in 'lister mode' such as when you open a file.
\LIST
\ITEM \STYLE{code} <any character> \END A lister mode command that dispatches to the lister's write character handler.
\ITEM \STYLE{code} <escape> \END A lister mode command that quits the list without executing any actions.
\ITEM \STYLE{code} <return> \END A lister mode command that activates the list's action on the highlighted item.
\ITEM \STYLE{code} <tab> \END A lister mode command that activates the list's action on the highlighted item.
\ITEM \STYLE{code} <backspace> \END A lister mode command that dispatches to the lister's backspace text field handler.
\ITEM \STYLE{code} <up> \END A lister mode command that dispatches to the lister's navigate up handler.
\ITEM \STYLE{code} <page up> \END A lister mode command that dispatches to the lister's navigate up handler.
\ITEM \STYLE{code} <down> \END A lister mode command that dispatches to the lister's navigate down handler.
\ITEM \STYLE{code} <page down> \END A lister mode command that dispatches to the lister's navigate down handler.
\ITEM \STYLE{code} <mouse wheel> \END A lister mode command that scrolls the list in response to the mouse wheel.
\ITEM \STYLE{code} <left click> \END A lister mode command that beings a click interaction with a list item under the mouse.
\ITEM \STYLE{code} <left release> \END A lister mode command that ends a click interaction with a list item under the mouse, possibly activating it.
\ITEM \STYLE{code} <mouse move> \END A lister mode command that updates the lists UI data.
\ITEM \STYLE{code} <animate> \END A lister mode command that updates the lists UI data.
\END
\END
\END