2016-02-25 23:52:11 +00:00
/*
2016-08-30 19:30:41 +00:00
* Mr . 4 th Dimention - Allen Webster
*
* 25.02 .2016
*
* File editing view for 4 coder
*
*/
2016-02-25 23:52:11 +00:00
// TOP
2017-11-18 22:40:10 +00:00
# define API_H "4coder_generated / app_functions.h"
# define REMAPPING_FILE "4coder_generated / remapping.h"
2018-11-27 18:07:07 +00:00
# include "4ed_defines.h"
2017-07-07 23:54:50 +00:00
# include "4ed_meta_defines.h"
2018-11-27 18:07:07 +00:00
# include "4coder_API/4coder_version.h"
2018-11-22 18:34:11 +00:00
# include "4coder_API/4coder_keycodes.h"
2017-01-23 06:19:43 +00:00
2018-11-27 20:09:24 +00:00
# include "4coder_lib / 4coder_arena.h"
# include "4coder_lib / 4coder_arena.cpp"
# define FSTRING_IMPLEMENTATION
# include "4coder_lib / 4coder_string.h"
2018-11-27 18:07:07 +00:00
# include "4coder_lib/4cpp_lexer.h"
# include "4ed_linked_node_macros.h"
2016-06-24 19:33:37 +00:00
2016-08-30 19:30:41 +00:00
# include <stdlib.h>
# include <stdio.h>
# include <string.h>
2016-11-03 04:57:26 +00:00
2017-07-10 16:35:25 +00:00
# define FTECH_FILE_MOVING_IMPLEMENTATION
# include "4ed_file_moving.h"
2017-07-09 04:28:33 +00:00
# include "4ed_meta_parser.cpp"
2017-07-10 16:35:25 +00:00
# include "4ed_meta_keywords.h"
2016-03-04 23:10:00 +00:00
2016-11-02 03:27:51 +00:00
//
// Meta Parse Rules
//
2017-07-10 17:05:30 +00:00
struct App_API_Name {
2016-09-02 19:39:38 +00:00
String macro ;
String public_name ;
2017-07-10 17:05:30 +00:00
} ;
2016-09-02 19:39:38 +00:00
2017-07-10 17:05:30 +00:00
struct App_API {
2016-09-02 19:39:38 +00:00
App_API_Name * names ;
2017-07-10 17:05:30 +00:00
} ;
2016-09-02 19:39:38 +00:00
2017-07-10 17:05:30 +00:00
internal App_API
2018-11-27 20:09:24 +00:00
allocate_app_api ( Partition * part , i32 count ) {
2018-11-20 08:18:54 +00:00
App_API app_api = { } ;
2018-11-27 20:09:24 +00:00
app_api . names = push_array ( part , App_API_Name , count ) ;
2016-09-03 05:03:03 +00:00
memset ( app_api . names , 0 , sizeof ( App_API_Name ) * count ) ;
2016-09-02 19:39:38 +00:00
return ( app_api ) ;
}
2017-07-10 17:05:30 +00:00
internal void
2018-11-27 20:09:24 +00:00
generate_custom_headers ( Partition * part ) {
Temp_Memory temp = begin_temp_memory ( part ) ;
2016-07-06 19:18:10 +00:00
2016-09-04 01:44:12 +00:00
// NOTE(allen): Parse the customization API files
2017-01-23 06:19:43 +00:00
static char * functions_files [ ] = { " 4ed_api_implementation.cpp " , 0 } ;
2018-11-27 20:09:24 +00:00
Meta_Unit unit_custom = compile_meta_unit ( part , " . " , functions_files , ExpandArray ( meta_keywords ) ) ;
2017-01-23 06:19:43 +00:00
if ( unit_custom . parse = = 0 ) {
Assert ( ! " Missing one or more input files! " ) ;
}
2016-09-04 01:44:12 +00:00
// NOTE(allen): Compute and store variations of the function names
2018-11-27 20:09:24 +00:00
App_API func_4ed_names = allocate_app_api ( part , unit_custom . set . count ) ;
2016-07-06 19:18:10 +00:00
2017-07-10 17:05:30 +00:00
for ( i32 i = 0 ; i < unit_custom . set . count ; + + i ) {
2016-09-03 22:43:37 +00:00
String name_string = unit_custom . set . items [ i ] . name ;
2016-09-02 19:39:38 +00:00
String * macro = & func_4ed_names . names [ i ] . macro ;
String * public_name = & func_4ed_names . names [ i ] . public_name ;
2016-05-25 22:43:58 +00:00
2018-11-29 20:55:53 +00:00
* macro = string_push ( part , name_string . size + 4 ) ;
2017-07-10 17:42:09 +00:00
to_upper ( macro , name_string ) ;
2017-07-10 16:35:25 +00:00
append ( macro , make_lit_string ( " _SIG " ) ) ;
2016-06-24 19:33:37 +00:00
2018-11-29 20:55:53 +00:00
* public_name = string_push ( part , name_string . size ) ;
2017-07-10 17:42:09 +00:00
to_lower ( public_name , name_string ) ;
2016-06-24 19:33:37 +00:00
2018-11-27 20:09:24 +00:00
push_align ( part , 8 ) ;
2016-06-24 19:33:37 +00:00
}
2016-09-04 01:44:12 +00:00
// NOTE(allen): Output
2018-11-29 20:55:53 +00:00
String out = string_push ( part , 10 < < 20 ) ;
2016-05-25 22:43:58 +00:00
2016-09-04 01:44:12 +00:00
// NOTE(allen): Custom API headers
2017-07-10 17:05:30 +00:00
append ( & out , " struct Application_Links; \n " ) ;
for ( i32 i = 0 ; i < unit_custom . set . count ; + + i ) {
append ( & out , " #define " ) ;
append ( & out , func_4ed_names . names [ i ] . macro ) ;
append ( & out , " (n) " ) ;
append ( & out , unit_custom . set . items [ i ] . ret ) ;
append ( & out , " n " ) ;
append ( & out , unit_custom . set . items [ i ] . args ) ;
append_s_char ( & out , ' \n ' ) ;
}
for ( i32 i = 0 ; i < unit_custom . set . count ; + + i ) {
append ( & out , " typedef " ) ;
append ( & out , func_4ed_names . names [ i ] . macro ) ;
append_s_char ( & out , ' ( ' ) ;
append ( & out , unit_custom . set . items [ i ] . name ) ;
append ( & out , " _Function); \n " ) ;
}
append ( & out , " struct Application_Links{ \n " ) ;
append ( & out , " #if defined(ALLOW_DEP_4CODER) \n " ) ;
for ( i32 i = 0 ; i < unit_custom . set . count ; + + i ) {
append ( & out , unit_custom . set . items [ i ] . name ) ;
append ( & out , " _Function * " ) ;
append ( & out , func_4ed_names . names [ i ] . public_name ) ;
append ( & out , " ; \n " ) ;
}
append ( & out , " #else \n " ) ;
for ( i32 i = 0 ; i < unit_custom . set . count ; + + i ) {
append ( & out , unit_custom . set . items [ i ] . name ) ;
append ( & out , " _Function * " ) ;
append ( & out , func_4ed_names . names [ i ] . public_name ) ;
append ( & out , " _; \n " ) ;
}
append ( & out , " #endif \n " ) ;
append ( & out ,
" void *memory; \n "
" int32_t memory_size; \n "
" void *cmd_context; \n "
" void *system_links; \n "
" void *current_coroutine; \n "
" int32_t type_coroutine; \n "
" }; \n " ) ;
append ( & out , " #define FillAppLinksAPI(app_links) do{ " ) ;
for ( i32 i = 0 ; i < unit_custom . set . count ; + + i ) {
append ( & out , " \\ \n app_links-> " ) ;
append ( & out , func_4ed_names . names [ i ] . public_name ) ;
append ( & out , " _ = " ) ;
append ( & out , unit_custom . set . items [ i ] . name ) ;
append_s_char ( & out , ' ; ' ) ;
}
append ( & out , " } while(false) \n " ) ;
append ( & out , " #if defined(ALLOW_DEP_4CODER) \n " ) ;
for ( i32 use_dep = 1 ; use_dep > = 0 ; - - use_dep ) {
for ( i32 i = 0 ; i < unit_custom . set . count ; + + i ) {
Argument_Breakdown breakdown = unit_custom . set . items [ i ] . breakdown ;
String ret = unit_custom . set . items [ i ] . ret ;
String public_name = func_4ed_names . names [ i ] . public_name ;
append ( & out , " static inline " ) ;
append ( & out , ret ) ;
append ( & out , " " ) ;
append ( & out , public_name ) ;
append ( & out , " ( " ) ;
for ( i32 j = 0 ; j < breakdown . count ; + + j ) {
append ( & out , breakdown . args [ j ] . param_string ) ;
if ( j + 1 ! = breakdown . count ) {
append ( & out , " , " ) ;
2016-09-17 00:03:09 +00:00
}
2017-07-10 17:05:30 +00:00
}
append ( & out , " ){ " ) ;
2017-07-10 17:42:09 +00:00
if ( match ( ret , make_lit_string ( " void " ) ) ) {
2017-07-10 16:35:25 +00:00
append ( & out , " ( " ) ;
2016-09-17 00:03:09 +00:00
}
2017-07-10 17:05:30 +00:00
else {
append ( & out , " return( " ) ;
}
append ( & out , " app-> " ) ;
append ( & out , public_name ) ;
if ( ! use_dep ) {
append ( & out , " _ " ) ;
}
append ( & out , " ( " ) ;
for ( i32 j = 0 ; j < breakdown . count ; + + j ) {
append ( & out , breakdown . args [ j ] . param_name ) ;
if ( j + 1 ! = breakdown . count ) {
append ( & out , " , " ) ;
}
2016-09-17 00:03:09 +00:00
}
2017-07-10 17:05:30 +00:00
append ( & out , " ) " ) ;
append ( & out , " );} \n " ) ;
}
if ( use_dep = = 1 ) {
append ( & out , " #else \n " ) ;
2016-09-17 00:03:09 +00:00
}
2016-09-04 05:08:36 +00:00
}
2017-07-10 17:05:30 +00:00
append ( & out , " #endif \n " ) ;
2016-05-25 22:43:58 +00:00
2017-07-10 17:42:09 +00:00
fm_write_file ( API_H , out . str , out . size ) ;
out . size = 0 ;
2017-07-10 17:05:30 +00:00
2018-11-27 20:09:24 +00:00
end_temp_memory ( temp ) ;
2016-05-25 22:43:58 +00:00
}
2017-11-18 22:40:10 +00:00
//////////////////////////////////////////////////////////////////////////////////////////////////
struct Key_Bind {
Key_Bind * next ;
b32 vanilla ;
u32 keycode ;
u32 modifiers ;
char * command ;
i32 command_len ;
} ;
struct Sub_Map {
Sub_Map * next ;
char * name ;
i32 name_len ;
char * description ;
i32 description_len ;
char * parent ;
i32 parent_len ;
b32 has_vanilla ;
Key_Bind * first_key_bind ;
Key_Bind * last_key_bind ;
i32 key_bind_count ;
} ;
struct Mapping {
Mapping * next ;
char * name ;
i32 name_len ;
char * description ;
i32 description_len ;
Sub_Map * first_sub_map ;
Sub_Map * last_sub_map ;
i32 sub_map_count ;
} ;
struct Mapping_Array {
Mapping * first_mapping ;
Mapping * last_mapping ;
i32 mapping_count ;
Mapping * current_mapping ;
Sub_Map * current_sub_map ;
} ;
enum {
MDFR_NONE = 0x0 ,
MDFR_CTRL = 0x1 ,
MDFR_ALT = 0x2 ,
MDFR_CMND = 0x4 ,
MDFR_SHIFT = 0x8 ,
} ;
//////////////////////////////////////////////////////////////////////////////////////////////////
internal void
2018-11-27 20:09:24 +00:00
emit_begin_mapping ( Partition * part , Mapping_Array * array , char * name , char * description ) {
2017-11-18 22:40:10 +00:00
Assert ( array - > current_mapping = = 0 ) ;
2018-11-27 20:09:24 +00:00
Mapping * mapping = push_array ( part , Mapping , 1 ) ;
mapping - > name = fm_basic_str ( part , name ) ;
2017-11-18 22:40:10 +00:00
mapping - > name_len = str_size ( name ) ;
2018-11-27 20:09:24 +00:00
mapping - > description = fm_basic_str ( part , description ) ;
2017-11-18 22:40:10 +00:00
mapping - > description_len = str_size ( description ) ;
mapping - > first_sub_map = 0 ;
mapping - > last_sub_map = 0 ;
mapping - > sub_map_count = 0 ;
sll_push ( array - > first_mapping , array - > last_mapping , mapping ) ;
+ + array - > mapping_count ;
array - > current_mapping = mapping ;
}
internal void
emit_end_mapping ( Mapping_Array * array ) {
Assert ( array - > current_mapping ! = 0 ) ;
array - > current_mapping = 0 ;
}
internal void
2018-11-27 20:09:24 +00:00
emit_begin_map ( Partition * part , Mapping_Array * array , char * mapid , char * description ) {
2017-11-18 22:40:10 +00:00
Assert ( array - > current_mapping ! = 0 ) ;
Assert ( array - > current_sub_map = = 0 ) ;
2018-11-27 20:09:24 +00:00
Sub_Map * sub_map = push_array ( part , Sub_Map , 1 ) ;
sub_map - > name = fm_basic_str ( part , mapid ) ;
2017-11-18 22:40:10 +00:00
sub_map - > name_len = str_size ( mapid ) ;
2018-11-27 20:09:24 +00:00
sub_map - > description = fm_basic_str ( part , description ) ;
2017-11-18 22:40:10 +00:00
sub_map - > description_len = str_size ( description ) ;
sub_map - > parent = 0 ;
sub_map - > parent_len = 0 ;
sub_map - > first_key_bind = 0 ;
sub_map - > last_key_bind = 0 ;
sub_map - > key_bind_count = 0 ;
Mapping * mapping = array - > current_mapping ;
sll_push ( mapping - > first_sub_map , mapping - > last_sub_map , sub_map ) ;
+ + mapping - > sub_map_count ;
array - > current_sub_map = sub_map ;
}
internal void
emit_end_map ( Mapping_Array * array ) {
Assert ( array - > current_mapping ! = 0 ) ;
Assert ( array - > current_sub_map ! = 0 ) ;
array - > current_sub_map = 0 ;
}
internal void
2018-11-27 20:09:24 +00:00
emit_inherit_map ( Partition * part , Mapping_Array * array , char * mapid ) {
2017-11-18 22:40:10 +00:00
Assert ( array - > current_mapping ! = 0 ) ;
Assert ( array - > current_sub_map ! = 0 ) ;
Sub_Map * sub_map = array - > current_sub_map ;
Assert ( sub_map - > parent = = 0 ) ;
2018-11-27 20:09:24 +00:00
sub_map - > parent = fm_basic_str ( part , mapid ) ;
2017-11-18 22:40:10 +00:00
sub_map - > parent_len = str_size ( mapid ) ;
}
internal void
2018-11-27 20:09:24 +00:00
emit_bind ( Partition * part , Mapping_Array * array , u32 keycode , u32 modifiers , char * command ) {
2017-11-18 22:40:10 +00:00
Assert ( array - > current_mapping ! = 0 ) ;
Assert ( array - > current_sub_map ! = 0 ) ;
b32 is_duplicate = false ;
Sub_Map * sub_map = array - > current_sub_map ;
for ( Key_Bind * bind = sub_map - > first_key_bind ;
bind ! = 0 ;
bind = bind - > next ) {
if ( ! bind - > vanilla & & keycode = = bind - > keycode & & modifiers = = bind - > modifiers ) {
fprintf ( stdout , " duplicate binding for %u %u \n " , keycode , modifiers ) ;
is_duplicate = true ;
break ;
}
}
if ( ! is_duplicate ) {
2018-11-27 20:09:24 +00:00
Key_Bind * bind = push_array ( part , Key_Bind , 1 ) ;
2017-11-18 22:40:10 +00:00
bind - > vanilla = false ;
bind - > keycode = keycode ;
bind - > modifiers = modifiers ;
2018-11-27 20:09:24 +00:00
bind - > command = fm_basic_str ( part , command ) ;
2017-11-18 22:40:10 +00:00
bind - > command_len = str_size ( command ) ;
sll_push ( sub_map - > first_key_bind , sub_map - > last_key_bind , bind ) ;
+ + sub_map - > key_bind_count ;
}
}
internal void
2018-11-27 20:09:24 +00:00
emit_bind_vanilla_keys ( Partition * part , Mapping_Array * array , u32 modifiers , char * command ) {
2017-11-18 22:40:10 +00:00
Assert ( array - > current_mapping ! = 0 ) ;
Assert ( array - > current_sub_map ! = 0 ) ;
b32 is_duplicate = false ;
Sub_Map * sub_map = array - > current_sub_map ;
for ( Key_Bind * bind = sub_map - > first_key_bind ;
bind ! = 0 ;
bind = bind - > next ) {
if ( bind - > vanilla & & modifiers = = bind - > modifiers ) {
fprintf ( stdout , " duplicate vanilla binding %u \n " , modifiers ) ;
is_duplicate = true ;
break ;
}
}
if ( ! is_duplicate ) {
2018-11-27 20:09:24 +00:00
Key_Bind * bind = push_array ( part , Key_Bind , 1 ) ;
2017-11-18 22:40:10 +00:00
bind - > vanilla = true ;
bind - > keycode = 0 ;
bind - > modifiers = modifiers ;
2018-11-27 20:09:24 +00:00
bind - > command = fm_basic_str ( part , command ) ;
2017-11-18 22:40:10 +00:00
bind - > command_len = str_size ( command ) ;
sll_push ( sub_map - > first_key_bind , sub_map - > last_key_bind , bind ) ;
+ + sub_map - > key_bind_count ;
}
}
2018-11-27 20:09:24 +00:00
# define begin_mapping(pa,mp,n,d) emit_begin_mapping(pa,mp, #n, d)
# define end_mapping(mp) emit_end_mapping(mp)
# define begin_map(pa,mp,mapid,d) emit_begin_map(pa,mp, #mapid, d)
# define end_map(mp) emit_end_map(mp)
# define inherit_map(pa,mp,mapid) emit_inherit_map(pa,mp, #mapid)
# define bind(pa,mp,k,md,c) emit_bind(pa,mp, k, md, #c)
# define bind_vanilla_keys(pa,mp,md,c) emit_bind_vanilla_keys(pa,mp, md, #c)
2017-11-18 22:40:10 +00:00
//////////////////////////////////////////////////////////////////////////////////////////////////
internal void
2018-11-27 20:09:24 +00:00
generate_remapping_code_and_data ( Partition * part ) {
Temp_Memory temp = begin_temp_memory ( part ) ;
2017-11-18 22:40:10 +00:00
// Generate mapping array data structure
2018-11-20 08:18:54 +00:00
Mapping_Array mappings_ = { } ;
2017-11-18 22:40:10 +00:00
Mapping_Array * mappings = & mappings_ ;
2018-11-27 20:09:24 +00:00
begin_mapping ( part , mappings , default , " The default 4coder bindings - typically good for Windows and Linux " ) ;
2017-11-18 22:40:10 +00:00
{
// NOTE(allen): GLOBAL
2018-11-27 20:09:24 +00:00
begin_map ( part , mappings , mapid_global , " The following bindings apply in all situations. " ) ;
bind ( part , mappings , ' , ' , MDFR_CTRL , change_active_panel ) ;
bind ( part , mappings , ' < ' , MDFR_CTRL , change_active_panel_backwards ) ;
bind ( part , mappings , ' n ' , MDFR_CTRL , interactive_new ) ;
bind ( part , mappings , ' o ' , MDFR_CTRL , interactive_open_or_new ) ;
bind ( part , mappings , ' o ' , MDFR_ALT , open_in_other ) ;
bind ( part , mappings , ' k ' , MDFR_CTRL , interactive_kill_buffer ) ;
bind ( part , mappings , ' i ' , MDFR_CTRL , interactive_switch_buffer ) ;
bind ( part , mappings , ' h ' , MDFR_CTRL , project_go_to_root_directory ) ;
bind ( part , mappings , ' S ' , MDFR_CTRL , save_all_dirty_buffers ) ;
bind ( part , mappings , ' . ' , MDFR_ALT , change_to_build_panel ) ;
bind ( part , mappings , ' , ' , MDFR_ALT , close_build_panel ) ;
2018-11-29 21:18:51 +00:00
bind ( part , mappings , ' n ' , MDFR_ALT , goto_next_jump_sticky ) ;
bind ( part , mappings , ' N ' , MDFR_ALT , goto_prev_jump_sticky ) ;
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' M ' , MDFR_ALT , goto_first_jump_sticky ) ;
bind ( part , mappings , ' m ' , MDFR_ALT , build_in_build_panel ) ;
bind ( part , mappings , ' b ' , MDFR_ALT , toggle_filebar ) ;
bind ( part , mappings , ' z ' , MDFR_ALT , execute_any_cli ) ;
bind ( part , mappings , ' Z ' , MDFR_ALT , execute_previous_cli ) ;
bind ( part , mappings , ' x ' , MDFR_ALT , command_lister ) ;
bind ( part , mappings , ' X ' , MDFR_ALT , project_command_lister ) ;
bind ( part , mappings , ' I ' , MDFR_CTRL , list_all_functions_current_buffer_lister ) ;
bind ( part , mappings , ' E ' , MDFR_ALT , exit_4coder ) ;
bind ( part , mappings , key_f1 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f2 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f3 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f4 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f5 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f6 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f7 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f8 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f9 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f10 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f11 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f12 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f13 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f14 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f15 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f16 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_mouse_wheel , MDFR_NONE , mouse_wheel_scroll ) ;
2018-09-22 23:45:24 +00:00
2017-11-18 22:40:10 +00:00
end_map ( mappings ) ;
// NOTE(allen): FILE
2018-11-27 20:09:24 +00:00
begin_map ( part , mappings , 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. " ) ;
bind_vanilla_keys ( part , mappings , MDFR_NONE , write_character ) ;
bind ( part , mappings , key_mouse_left , MDFR_NONE , click_set_cursor_and_mark ) ;
bind ( part , mappings , key_click_activate_view , MDFR_NONE , click_set_cursor_and_mark ) ;
bind ( part , mappings , key_mouse_left_release , MDFR_NONE , click_set_cursor ) ;
bind ( part , mappings , key_mouse_move , MDFR_NONE , click_set_cursor_if_lbutton ) ;
bind ( part , mappings , key_del , MDFR_NONE , delete_char ) ;
bind ( part , mappings , key_del , MDFR_SHIFT , delete_char ) ;
bind ( part , mappings , key_back , MDFR_NONE , backspace_char ) ;
bind ( part , mappings , key_back , MDFR_SHIFT , backspace_char ) ;
bind ( part , mappings , key_up , MDFR_NONE , move_up ) ;
bind ( part , mappings , key_down , MDFR_NONE , move_down ) ;
bind ( part , mappings , key_left , MDFR_NONE , move_left ) ;
bind ( part , mappings , key_right , MDFR_NONE , move_right ) ;
bind ( part , mappings , key_up , MDFR_SHIFT , move_up ) ;
bind ( part , mappings , key_down , MDFR_SHIFT , move_down ) ;
bind ( part , mappings , key_left , MDFR_SHIFT , move_left ) ;
bind ( part , mappings , key_right , MDFR_SHIFT , move_right ) ;
bind ( part , mappings , ' k ' , MDFR_ALT , move_up ) ;
bind ( part , mappings , ' j ' , MDFR_ALT , move_down ) ;
bind ( part , mappings , ' h ' , MDFR_ALT , move_left ) ;
bind ( part , mappings , ' l ' , MDFR_ALT , move_right ) ;
bind ( part , mappings , key_end , MDFR_NONE , seek_end_of_line ) ;
bind ( part , mappings , key_home , MDFR_NONE , seek_beginning_of_line ) ;
bind ( part , mappings , key_page_up , MDFR_CTRL , goto_beginning_of_file ) ;
bind ( part , mappings , key_page_down , MDFR_CTRL , goto_end_of_file ) ;
bind ( part , mappings , key_page_up , MDFR_NONE , page_up ) ;
bind ( part , mappings , key_page_down , MDFR_NONE , page_down ) ;
bind ( part , mappings , key_end , MDFR_SHIFT , seek_end_of_line ) ;
bind ( part , mappings , key_home , MDFR_SHIFT , seek_beginning_of_line ) ;
bind ( part , mappings , key_page_up , MDFR_CTRL | MDFR_SHIFT , goto_beginning_of_file ) ;
bind ( part , mappings , key_page_down , MDFR_CTRL | MDFR_SHIFT , goto_end_of_file ) ;
bind ( part , mappings , key_page_up , MDFR_SHIFT , page_up ) ;
bind ( part , mappings , key_page_down , MDFR_SHIFT , page_down ) ;
bind ( part , mappings , key_up , MDFR_CTRL , seek_whitespace_up_end_line ) ;
bind ( part , mappings , key_down , MDFR_CTRL , seek_whitespace_down_end_line ) ;
bind ( part , mappings , key_left , MDFR_CTRL , seek_whitespace_left ) ;
bind ( part , mappings , key_right , MDFR_CTRL , seek_whitespace_right ) ;
bind ( part , mappings , key_up , MDFR_CTRL | MDFR_SHIFT , seek_whitespace_up_end_line ) ;
bind ( part , mappings , key_down , MDFR_CTRL | MDFR_SHIFT , seek_whitespace_down_end_line ) ;
bind ( part , mappings , key_left , MDFR_CTRL | MDFR_SHIFT , seek_whitespace_left ) ;
bind ( part , mappings , key_right , MDFR_CTRL | MDFR_SHIFT , seek_whitespace_right ) ;
bind ( part , mappings , ' K ' , MDFR_ALT , seek_whitespace_up_end_line ) ;
bind ( part , mappings , ' J ' , MDFR_ALT , seek_whitespace_down_end_line ) ;
bind ( part , mappings , ' H ' , MDFR_ALT , seek_whitespace_left ) ;
bind ( part , mappings , ' L ' , MDFR_ALT , seek_whitespace_right ) ;
bind ( part , mappings , key_up , MDFR_ALT , move_line_up ) ;
bind ( part , mappings , key_down , MDFR_ALT , move_line_down ) ;
bind ( part , mappings , ' k ' , MDFR_ALT | MDFR_CTRL , move_line_up ) ;
bind ( part , mappings , ' j ' , MDFR_ALT | MDFR_CTRL , move_line_down ) ;
bind ( part , mappings , key_back , MDFR_CTRL , backspace_word ) ;
bind ( part , mappings , key_del , MDFR_CTRL , delete_word ) ;
bind ( part , mappings , key_back , MDFR_ALT , snipe_token_or_word ) ;
bind ( part , mappings , key_del , MDFR_ALT , snipe_token_or_word_right ) ;
bind ( part , mappings , ' ' , MDFR_CTRL , set_mark ) ;
bind ( part , mappings , ' a ' , MDFR_CTRL , replace_in_range ) ;
bind ( part , mappings , ' c ' , MDFR_CTRL , copy ) ;
bind ( part , mappings , ' d ' , MDFR_CTRL , delete_range ) ;
bind ( part , mappings , ' D ' , MDFR_CTRL , delete_line ) ;
bind ( part , mappings , ' e ' , MDFR_CTRL , center_view ) ;
bind ( part , mappings , ' E ' , MDFR_CTRL , left_adjust_view ) ;
bind ( part , mappings , ' f ' , MDFR_CTRL , search ) ;
bind ( part , mappings , ' F ' , MDFR_CTRL , list_all_locations ) ;
bind ( part , mappings , ' F ' , MDFR_ALT , list_all_substring_locations_case_insensitive ) ;
bind ( part , mappings , ' g ' , MDFR_CTRL , goto_line ) ;
bind ( part , mappings , ' G ' , MDFR_CTRL , list_all_locations_of_selection ) ;
bind ( part , mappings , ' j ' , MDFR_CTRL , snippet_lister ) ;
bind ( part , mappings , ' K ' , MDFR_CTRL , kill_buffer ) ;
bind ( part , mappings , ' L ' , MDFR_CTRL , duplicate_line ) ;
bind ( part , mappings , ' m ' , MDFR_CTRL , cursor_mark_swap ) ;
bind ( part , mappings , ' O ' , MDFR_CTRL , reopen ) ;
bind ( part , mappings , ' q ' , MDFR_CTRL , query_replace ) ;
bind ( part , mappings , ' Q ' , MDFR_CTRL , query_replace_identifier ) ;
bind ( part , mappings , ' q ' , MDFR_ALT , query_replace_selection ) ;
bind ( part , mappings , ' r ' , MDFR_CTRL , reverse_search ) ;
bind ( part , mappings , ' s ' , MDFR_CTRL , save ) ;
bind ( part , mappings , ' t ' , MDFR_CTRL , search_identifier ) ;
bind ( part , mappings , ' T ' , MDFR_CTRL , list_all_locations_of_identifier ) ;
bind ( part , mappings , ' v ' , MDFR_CTRL , paste_and_indent ) ;
bind ( part , mappings , ' V ' , MDFR_CTRL , paste_next_and_indent ) ;
bind ( part , mappings , ' x ' , MDFR_CTRL , cut ) ;
bind ( part , mappings , ' y ' , MDFR_CTRL , redo ) ;
bind ( part , mappings , ' z ' , MDFR_CTRL , undo ) ;
bind ( part , mappings , ' 1 ' , MDFR_CTRL , view_buffer_other_panel ) ;
bind ( part , mappings , ' 2 ' , MDFR_CTRL , swap_buffers_between_panels ) ;
bind ( part , mappings , ' \n ' , MDFR_NONE , newline_or_goto_position_sticky ) ;
bind ( part , mappings , ' \n ' , MDFR_SHIFT , newline_or_goto_position_same_panel_sticky ) ;
bind ( part , mappings , ' > ' , MDFR_CTRL , view_jump_list_with_lister ) ;
bind ( part , mappings , ' ' , MDFR_SHIFT , write_character ) ;
2017-11-18 22:40:10 +00:00
end_map ( mappings ) ;
// NOTE(allen): CODE
2018-11-27 20:09:24 +00:00
begin_map ( part , mappings , default_code_map , " The following commands only apply in files where the lexer (syntax highlighting) is turned on. " ) ;
2017-11-18 22:40:10 +00:00
2018-11-27 20:09:24 +00:00
inherit_map ( part , mappings , mapid_file ) ;
2017-11-18 22:40:10 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , key_left , MDFR_CTRL , seek_alphanumeric_or_camel_left ) ;
bind ( part , mappings , key_right , MDFR_CTRL , seek_alphanumeric_or_camel_right ) ;
2017-11-18 22:40:10 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' H ' , MDFR_ALT , seek_alphanumeric_or_camel_left ) ;
bind ( part , mappings , ' L ' , MDFR_ALT , seek_alphanumeric_or_camel_right ) ;
2017-11-18 22:40:10 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' \n ' , MDFR_NONE , write_and_auto_tab ) ;
bind ( part , mappings , ' \n ' , MDFR_SHIFT , write_and_auto_tab ) ;
bind ( part , mappings , ' } ' , MDFR_NONE , write_and_auto_tab ) ;
bind ( part , mappings , ' ) ' , MDFR_NONE , write_and_auto_tab ) ;
bind ( part , mappings , ' ] ' , MDFR_NONE , write_and_auto_tab ) ;
bind ( part , mappings , ' ; ' , MDFR_NONE , write_and_auto_tab ) ;
bind ( part , mappings , ' # ' , MDFR_NONE , write_and_auto_tab ) ;
2017-11-18 22:40:10 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' \t ' , MDFR_NONE , word_complete ) ;
bind ( part , mappings , ' \t ' , MDFR_CTRL , auto_tab_range ) ;
bind ( part , mappings , ' \t ' , MDFR_SHIFT , auto_tab_line_at_cursor ) ;
2017-11-21 18:25:19 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' r ' , MDFR_ALT , write_block ) ;
bind ( part , mappings , ' t ' , MDFR_ALT , write_todo ) ;
bind ( part , mappings , ' y ' , MDFR_ALT , write_note ) ;
2017-11-29 23:00:14 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' D ' , MDFR_ALT , list_all_locations_of_type_definition ) ;
bind ( part , mappings , ' T ' , MDFR_ALT , list_all_locations_of_type_definition_of_identifier ) ;
2017-11-21 18:25:19 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' [ ' , MDFR_CTRL , open_long_braces ) ;
bind ( part , mappings , ' { ' , MDFR_CTRL , open_long_braces_semicolon ) ;
bind ( part , mappings , ' } ' , MDFR_CTRL , open_long_braces_break ) ;
2017-11-21 18:25:19 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' [ ' , MDFR_ALT , select_surrounding_scope ) ;
bind ( part , mappings , ' ] ' , MDFR_ALT , select_prev_scope_absolute ) ;
bind ( part , mappings , ' \' ' , MDFR_ALT , select_next_scope_absolute ) ;
bind ( part , mappings , ' / ' , MDFR_ALT , place_in_scope ) ;
bind ( part , mappings , ' - ' , MDFR_ALT , delete_current_scope ) ;
2018-11-29 23:21:29 +00:00
bind ( part , mappings , ' " ' , MDFR_ALT , scope_absorb_down ) ;
2017-11-21 18:25:19 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' i ' , MDFR_ALT , if0_off ) ;
bind ( part , mappings , ' 1 ' , MDFR_ALT , open_file_in_quotes ) ;
bind ( part , mappings , ' 2 ' , MDFR_ALT , open_matching_file_cpp ) ;
bind ( part , mappings , ' 0 ' , MDFR_CTRL , write_zero_struct ) ;
2017-11-18 22:40:10 +00:00
end_map ( mappings ) ;
2018-08-04 02:41:38 +00:00
// NOTE(allen): LISTER
2018-11-27 20:09:24 +00:00
begin_map ( part , mappings , default_lister_ui_map ,
2018-08-04 02:41:38 +00:00
" These commands apply in 'lister mode' such as when you open a file. " ) ;
2018-11-27 20:09:24 +00:00
bind_vanilla_keys ( part , mappings , MDFR_NONE , lister__write_character ) ;
bind ( part , mappings , key_esc , MDFR_NONE , lister__quit ) ;
bind ( part , mappings , ' \n ' , MDFR_NONE , lister__activate ) ;
bind ( part , mappings , ' \t ' , MDFR_NONE , lister__activate ) ;
bind ( part , mappings , key_back , MDFR_NONE , lister__backspace_text_field ) ;
bind ( part , mappings , key_up , MDFR_NONE , lister__move_up ) ;
bind ( part , mappings , ' k ' , MDFR_ALT , lister__move_up ) ;
bind ( part , mappings , key_page_up , MDFR_NONE , lister__move_up ) ;
bind ( part , mappings , key_down , MDFR_NONE , lister__move_down ) ;
2018-11-28 04:36:09 +00:00
bind ( part , mappings , ' j ' , MDFR_ALT , lister__move_down ) ;
2018-11-27 20:09:24 +00:00
bind ( part , mappings , key_page_down , MDFR_NONE , lister__move_down ) ;
bind ( part , mappings , key_mouse_wheel , MDFR_NONE , lister__wheel_scroll ) ;
bind ( part , mappings , key_mouse_left , MDFR_NONE , lister__mouse_press ) ;
bind ( part , mappings , key_mouse_left_release , MDFR_NONE , lister__mouse_release ) ;
bind ( part , mappings , key_mouse_move , MDFR_NONE , lister__repaint ) ;
bind ( part , mappings , key_animate , MDFR_NONE , lister__repaint ) ;
2018-08-04 02:41:38 +00:00
end_map ( mappings ) ;
2017-11-18 22:40:10 +00:00
}
end_mapping ( mappings ) ;
2018-11-27 20:09:24 +00:00
begin_mapping ( part , mappings , mac_default , " Default 4coder bindings on a Mac keyboard " ) ;
2017-11-18 22:40:10 +00:00
{
// NOTE(allen): GLOBAL
2018-11-27 20:09:24 +00:00
begin_map ( part , mappings , mapid_global , " The following bindings apply in all situations. " ) ;
bind ( part , mappings , ' , ' , MDFR_CMND , change_active_panel ) ;
bind ( part , mappings , ' < ' , MDFR_CMND , change_active_panel_backwards ) ;
bind ( part , mappings , ' n ' , MDFR_CMND , interactive_new ) ;
bind ( part , mappings , ' o ' , MDFR_CMND , interactive_open_or_new ) ;
bind ( part , mappings , ' o ' , MDFR_CTRL , open_in_other ) ;
bind ( part , mappings , ' k ' , MDFR_CMND , interactive_kill_buffer ) ;
bind ( part , mappings , ' i ' , MDFR_CMND , interactive_switch_buffer ) ;
bind ( part , mappings , ' h ' , MDFR_CMND , project_go_to_root_directory ) ;
bind ( part , mappings , ' S ' , MDFR_CMND , save_all_dirty_buffers ) ;
bind ( part , mappings , ' . ' , MDFR_CTRL , change_to_build_panel ) ;
bind ( part , mappings , ' , ' , MDFR_CTRL , close_build_panel ) ;
bind ( part , mappings , ' n ' , MDFR_CTRL , goto_next_jump_sticky ) ;
bind ( part , mappings , ' N ' , MDFR_CTRL , goto_prev_jump_sticky ) ;
bind ( part , mappings , ' M ' , MDFR_CTRL , goto_first_jump_sticky ) ;
bind ( part , mappings , ' m ' , MDFR_CTRL , build_in_build_panel ) ;
bind ( part , mappings , ' b ' , MDFR_CTRL , toggle_filebar ) ;
bind ( part , mappings , ' z ' , MDFR_CTRL , execute_any_cli ) ;
bind ( part , mappings , ' Z ' , MDFR_CTRL , execute_previous_cli ) ;
bind ( part , mappings , ' x ' , MDFR_CTRL , command_lister ) ;
bind ( part , mappings , ' X ' , MDFR_CTRL , project_command_lister ) ;
bind ( part , mappings , ' I ' , MDFR_CMND , list_all_functions_current_buffer_lister ) ;
bind ( part , mappings , ' E ' , MDFR_CTRL , exit_4coder ) ;
bind ( part , mappings , key_f1 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f2 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f3 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f4 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f5 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f6 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f7 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f8 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f9 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f10 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f11 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f12 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f13 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f14 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f15 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_f16 , MDFR_NONE , project_fkey_command ) ;
bind ( part , mappings , key_mouse_wheel , MDFR_NONE , mouse_wheel_scroll ) ;
2018-09-22 23:45:24 +00:00
2017-11-18 22:40:10 +00:00
end_map ( mappings ) ;
// NOTE(allen): FILE
2018-11-27 20:09:24 +00:00
begin_map ( part , mappings , 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. " ) ;
bind_vanilla_keys ( part , mappings , MDFR_NONE , write_character ) ;
bind_vanilla_keys ( part , mappings , MDFR_ALT , write_character ) ;
bind ( part , mappings , key_mouse_left , MDFR_NONE , click_set_cursor_and_mark ) ;
bind ( part , mappings , key_click_activate_view , MDFR_NONE , click_set_cursor_and_mark ) ;
bind ( part , mappings , key_mouse_left_release , MDFR_NONE , click_set_cursor ) ;
bind ( part , mappings , key_mouse_move , MDFR_NONE , click_set_cursor_if_lbutton ) ;
bind ( part , mappings , key_del , MDFR_NONE , delete_char ) ;
bind ( part , mappings , key_del , MDFR_SHIFT , delete_char ) ;
bind ( part , mappings , key_back , MDFR_NONE , backspace_char ) ;
bind ( part , mappings , key_back , MDFR_SHIFT , backspace_char ) ;
bind ( part , mappings , key_up , MDFR_NONE , move_up ) ;
bind ( part , mappings , key_down , MDFR_NONE , move_down ) ;
bind ( part , mappings , key_left , MDFR_NONE , move_left ) ;
bind ( part , mappings , key_right , MDFR_NONE , move_right ) ;
bind ( part , mappings , key_up , MDFR_SHIFT , move_up ) ;
bind ( part , mappings , key_down , MDFR_SHIFT , move_down ) ;
bind ( part , mappings , key_left , MDFR_SHIFT , move_left ) ;
bind ( part , mappings , key_right , MDFR_SHIFT , move_right ) ;
bind ( part , mappings , ' k ' , MDFR_CTRL , move_up ) ;
bind ( part , mappings , ' j ' , MDFR_CTRL , move_down ) ;
bind ( part , mappings , ' h ' , MDFR_CTRL , move_left ) ;
bind ( part , mappings , ' l ' , MDFR_CTRL , move_right ) ;
bind ( part , mappings , key_end , MDFR_NONE , seek_end_of_line ) ;
bind ( part , mappings , key_home , MDFR_NONE , seek_beginning_of_line ) ;
bind ( part , mappings , key_page_up , MDFR_CTRL , goto_beginning_of_file ) ;
bind ( part , mappings , key_page_down , MDFR_CTRL , goto_end_of_file ) ;
bind ( part , mappings , key_page_up , MDFR_NONE , page_up ) ;
bind ( part , mappings , key_page_down , MDFR_NONE , page_down ) ;
bind ( part , mappings , key_end , MDFR_SHIFT , seek_end_of_line ) ;
bind ( part , mappings , key_home , MDFR_SHIFT , seek_beginning_of_line ) ;
bind ( part , mappings , key_page_up , MDFR_CTRL | MDFR_SHIFT , goto_beginning_of_file ) ;
bind ( part , mappings , key_page_down , MDFR_CTRL | MDFR_SHIFT , goto_end_of_file ) ;
bind ( part , mappings , key_page_up , MDFR_SHIFT , page_up ) ;
bind ( part , mappings , key_page_down , MDFR_SHIFT , page_down ) ;
bind ( part , mappings , key_up , MDFR_CMND , seek_whitespace_up_end_line ) ;
bind ( part , mappings , key_down , MDFR_CMND , seek_whitespace_down_end_line ) ;
bind ( part , mappings , key_left , MDFR_CMND , seek_whitespace_left ) ;
bind ( part , mappings , key_right , MDFR_CMND , seek_whitespace_right ) ;
bind ( part , mappings , key_up , MDFR_CMND | MDFR_SHIFT , seek_whitespace_up_end_line ) ;
bind ( part , mappings , key_down , MDFR_CMND | MDFR_SHIFT , seek_whitespace_down_end_line ) ;
bind ( part , mappings , key_left , MDFR_CMND | MDFR_SHIFT , seek_whitespace_left ) ;
bind ( part , mappings , key_right , MDFR_CMND | MDFR_SHIFT , seek_whitespace_right ) ;
bind ( part , mappings , ' K ' , MDFR_CTRL , seek_whitespace_up_end_line ) ;
bind ( part , mappings , ' J ' , MDFR_CTRL , seek_whitespace_down_end_line ) ;
bind ( part , mappings , ' H ' , MDFR_CTRL , seek_whitespace_left ) ;
bind ( part , mappings , ' L ' , MDFR_CTRL , seek_whitespace_right ) ;
bind ( part , mappings , key_up , MDFR_ALT , move_line_up ) ;
bind ( part , mappings , key_down , MDFR_ALT , move_line_down ) ;
bind ( part , mappings , ' k ' , MDFR_CTRL | MDFR_ALT , move_line_up ) ;
bind ( part , mappings , ' j ' , MDFR_CTRL | MDFR_ALT , move_line_down ) ;
bind ( part , mappings , key_back , MDFR_CMND , backspace_word ) ;
bind ( part , mappings , key_del , MDFR_CMND , delete_word ) ;
bind ( part , mappings , key_back , MDFR_CTRL , snipe_token_or_word ) ;
bind ( part , mappings , key_del , MDFR_CTRL , snipe_token_or_word_right ) ;
bind ( part , mappings , ' / ' , MDFR_CMND , set_mark ) ;
bind ( part , mappings , ' a ' , MDFR_CMND , replace_in_range ) ;
bind ( part , mappings , ' c ' , MDFR_CMND , copy ) ;
bind ( part , mappings , ' d ' , MDFR_CMND , delete_range ) ;
bind ( part , mappings , ' D ' , MDFR_CMND , delete_line ) ;
bind ( part , mappings , ' e ' , MDFR_CMND , center_view ) ;
bind ( part , mappings , ' E ' , MDFR_CMND , left_adjust_view ) ;
bind ( part , mappings , ' f ' , MDFR_CMND , search ) ;
bind ( part , mappings , ' F ' , MDFR_CMND , list_all_locations ) ;
bind ( part , mappings , ' F ' , MDFR_CTRL , list_all_substring_locations_case_insensitive ) ;
bind ( part , mappings , ' g ' , MDFR_CMND , goto_line ) ;
bind ( part , mappings , ' G ' , MDFR_CMND , list_all_locations_of_selection ) ;
bind ( part , mappings , ' K ' , MDFR_CMND , kill_buffer ) ;
bind ( part , mappings , ' L ' , MDFR_CMND , duplicate_line ) ;
bind ( part , mappings , ' m ' , MDFR_CMND , cursor_mark_swap ) ;
bind ( part , mappings , ' O ' , MDFR_CMND , reopen ) ;
bind ( part , mappings , ' q ' , MDFR_CMND , query_replace ) ;
bind ( part , mappings , ' Q ' , MDFR_CMND , query_replace_identifier ) ;
bind ( part , mappings , ' r ' , MDFR_CMND , reverse_search ) ;
bind ( part , mappings , ' s ' , MDFR_CMND , save ) ;
bind ( part , mappings , ' t ' , MDFR_CMND , search_identifier ) ;
bind ( part , mappings , ' T ' , MDFR_CMND , list_all_locations_of_identifier ) ;
bind ( part , mappings , ' v ' , MDFR_CMND , paste_and_indent ) ;
bind ( part , mappings , ' V ' , MDFR_CMND , paste_next_and_indent ) ;
bind ( part , mappings , ' x ' , MDFR_CMND , cut ) ;
bind ( part , mappings , ' y ' , MDFR_CMND , redo ) ;
bind ( part , mappings , ' z ' , MDFR_CMND , undo ) ;
bind ( part , mappings , ' 1 ' , MDFR_CMND , view_buffer_other_panel ) ;
bind ( part , mappings , ' 2 ' , MDFR_CMND , swap_buffers_between_panels ) ;
bind ( part , mappings , ' \n ' , MDFR_NONE , newline_or_goto_position_sticky ) ;
bind ( part , mappings , ' \n ' , MDFR_SHIFT , newline_or_goto_position_same_panel_sticky ) ;
bind ( part , mappings , ' > ' , MDFR_CMND , view_jump_list_with_lister ) ;
bind ( part , mappings , ' ' , MDFR_SHIFT , write_character ) ;
2017-11-18 22:40:10 +00:00
end_map ( mappings ) ;
// NOTE(allen): CODE
2018-11-27 20:09:24 +00:00
begin_map ( part , mappings , default_code_map , " The following commands only apply in files where the lexer (syntax highlighting) is turned on. " ) ;
inherit_map ( part , mappings , mapid_file ) ;
2017-11-18 22:40:10 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , key_left , MDFR_CMND , seek_alphanumeric_or_camel_left ) ;
bind ( part , mappings , key_right , MDFR_CMND , seek_alphanumeric_or_camel_right ) ;
2017-11-18 22:40:10 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' H ' , MDFR_CTRL , seek_alphanumeric_or_camel_left ) ;
bind ( part , mappings , ' L ' , MDFR_CTRL , seek_alphanumeric_or_camel_right ) ;
2017-11-18 22:40:10 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' \n ' , MDFR_NONE , write_and_auto_tab ) ;
bind ( part , mappings , ' \n ' , MDFR_SHIFT , write_and_auto_tab ) ;
bind ( part , mappings , ' } ' , MDFR_NONE , write_and_auto_tab ) ;
bind ( part , mappings , ' ) ' , MDFR_NONE , write_and_auto_tab ) ;
bind ( part , mappings , ' ] ' , MDFR_NONE , write_and_auto_tab ) ;
bind ( part , mappings , ' ; ' , MDFR_NONE , write_and_auto_tab ) ;
bind ( part , mappings , ' # ' , MDFR_NONE , write_and_auto_tab ) ;
2017-11-18 22:40:10 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' \t ' , MDFR_NONE , word_complete ) ;
bind ( part , mappings , ' \t ' , MDFR_CMND , auto_tab_range ) ;
bind ( part , mappings , ' \t ' , MDFR_SHIFT , auto_tab_line_at_cursor ) ;
2017-11-18 22:40:10 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' r ' , MDFR_CTRL , write_block ) ;
bind ( part , mappings , ' t ' , MDFR_CTRL , write_todo ) ;
bind ( part , mappings , ' y ' , MDFR_CTRL , write_note ) ;
2017-11-21 18:25:19 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' D ' , MDFR_CTRL , list_all_locations_of_type_definition ) ;
bind ( part , mappings , ' T ' , MDFR_CTRL , list_all_locations_of_type_definition_of_identifier ) ;
2017-11-29 23:00:14 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' [ ' , MDFR_CMND , open_long_braces ) ;
bind ( part , mappings , ' { ' , MDFR_CMND , open_long_braces_semicolon ) ;
bind ( part , mappings , ' } ' , MDFR_CMND , open_long_braces_break ) ;
2017-11-21 18:25:19 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' [ ' , MDFR_CTRL , select_surrounding_scope ) ;
bind ( part , mappings , ' ] ' , MDFR_CTRL , select_prev_scope_absolute ) ;
bind ( part , mappings , ' \' ' , MDFR_CTRL , select_next_scope_absolute ) ;
bind ( part , mappings , ' / ' , MDFR_CTRL , place_in_scope ) ;
bind ( part , mappings , ' - ' , MDFR_CTRL , delete_current_scope ) ;
2018-11-29 23:21:29 +00:00
bind ( part , mappings , ' " ' , MDFR_CTRL , scope_absorb_down ) ;
2017-11-21 18:25:19 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' i ' , MDFR_CTRL , if0_off ) ;
2017-11-21 18:25:19 +00:00
2018-11-27 20:09:24 +00:00
bind ( part , mappings , ' 1 ' , MDFR_CTRL , open_file_in_quotes ) ;
bind ( part , mappings , ' 2 ' , MDFR_CTRL , open_matching_file_cpp ) ;
bind ( part , mappings , ' 0 ' , MDFR_CMND , write_zero_struct ) ;
2017-11-18 22:40:10 +00:00
end_map ( mappings ) ;
2018-08-04 02:41:38 +00:00
// NOTE(allen): LISTER
2018-11-27 20:09:24 +00:00
begin_map ( part , mappings , default_lister_ui_map ,
2018-08-04 02:41:38 +00:00
" These commands apply in 'lister mode' such as when you open a file. " ) ;
2018-11-27 20:09:24 +00:00
bind_vanilla_keys ( part , mappings , MDFR_NONE , lister__write_character ) ;
bind ( part , mappings , key_esc , MDFR_NONE , lister__quit ) ;
bind ( part , mappings , ' \n ' , MDFR_NONE , lister__activate ) ;
bind ( part , mappings , ' \t ' , MDFR_NONE , lister__activate ) ;
bind ( part , mappings , key_back , MDFR_NONE , lister__backspace_text_field ) ;
bind ( part , mappings , key_up , MDFR_NONE , lister__move_up ) ;
bind ( part , mappings , key_page_up , MDFR_NONE , lister__move_up ) ;
bind ( part , mappings , key_down , MDFR_NONE , lister__move_down ) ;
bind ( part , mappings , key_page_down , MDFR_NONE , lister__move_down ) ;
bind ( part , mappings , key_mouse_wheel , MDFR_NONE , lister__wheel_scroll ) ;
bind ( part , mappings , key_mouse_left , MDFR_NONE , lister__mouse_press ) ;
bind ( part , mappings , key_mouse_left_release , MDFR_NONE , lister__mouse_release ) ;
bind ( part , mappings , key_mouse_move , MDFR_NONE , lister__repaint ) ;
bind ( part , mappings , key_animate , MDFR_NONE , lister__repaint ) ;
2018-08-04 02:41:38 +00:00
end_map ( mappings ) ;
2017-11-18 22:40:10 +00:00
}
end_mapping ( mappings ) ;
// Generate remapping from mapping array
FILE * out = fopen ( REMAPPING_FILE , " wb " ) ;
if ( out ! = 0 ) {
fprintf ( out , " #if defined(CUSTOM_COMMAND_SIG) \n " ) ;
for ( Mapping * mapping = mappings - > first_mapping ;
mapping ! = 0 ;
mapping = mapping - > next ) {
fprintf ( out , " void fill_keys_%s(Bind_Helper *context){ \n " , mapping - > name ) ;
for ( Sub_Map * sub_map = mapping - > first_sub_map ;
sub_map ! = 0 ;
sub_map = sub_map - > next ) {
fprintf ( out , " begin_map(context, %s); \n " , sub_map - > name ) ;
if ( sub_map - > parent ! = 0 ) {
fprintf ( out , " inherit_map(context, %s); \n " , sub_map - > parent ) ;
}
for ( Key_Bind * bind = sub_map - > first_key_bind ;
bind ! = 0 ;
bind = bind - > next ) {
char mdfr_str [ 256 ] ;
String m = make_fixed_width_string ( mdfr_str ) ;
b32 has_base = false ;
if ( bind - > modifiers & MDFR_CTRL ) {
if ( has_base ) {
append ( & m , " | " ) ;
}
append ( & m , " MDFR_CTRL " ) ;
2018-09-30 12:14:47 +00:00
has_base = true ;
2017-11-18 22:40:10 +00:00
}
if ( bind - > modifiers & MDFR_ALT ) {
if ( has_base ) {
append ( & m , " | " ) ;
}
append ( & m , " MDFR_ALT " ) ;
2018-09-30 12:14:47 +00:00
has_base = true ;
2017-11-18 22:40:10 +00:00
}
if ( bind - > modifiers & MDFR_CMND ) {
if ( has_base ) {
append ( & m , " | " ) ;
}
append ( & m , " MDFR_CMND " ) ;
2018-09-30 12:14:47 +00:00
has_base = true ;
2017-11-18 22:40:10 +00:00
}
if ( bind - > modifiers & MDFR_SHIFT ) {
if ( has_base ) {
append ( & m , " | " ) ;
}
append ( & m , " MDFR_SHIFT " ) ;
2018-09-30 12:14:47 +00:00
has_base = true ;
2017-11-18 22:40:10 +00:00
}
if ( bind - > modifiers = = 0 ) {
append ( & m , " MDFR_NONE " ) ;
2018-09-30 12:14:47 +00:00
has_base = true ;
2017-11-18 22:40:10 +00:00
}
terminate_with_null ( & m ) ;
if ( bind - > vanilla ) {
if ( bind - > modifiers = = 0 ) {
fprintf ( out , " bind_vanilla_keys(context, %s); \n " , bind - > command ) ;
}
else {
fprintf ( out , " bind_vanilla_keys(context, %s, %s); \n " , mdfr_str , bind - > command ) ;
}
}
else {
char key_str_space [ 16 ] ;
2018-11-22 18:34:11 +00:00
i32 size = 0 ;
char * key_str = global_key_name ( bind - > keycode , & size ) ;
2017-11-18 22:40:10 +00:00
if ( key_str = = 0 ) {
key_str = key_str_space ;
if ( bind - > keycode = = ' \n ' ) {
memcpy ( key_str_space , " ' \\ n' " , 5 ) ;
}
else if ( bind - > keycode = = ' \t ' ) {
memcpy ( key_str_space , " ' \\ t' " , 5 ) ;
}
else if ( bind - > keycode = = ' \' ' ) {
memcpy ( key_str_space , " ' \\ '' " , 5 ) ;
}
else if ( bind - > keycode = = ' \\ ' ) {
memcpy ( key_str_space , " ' \\ \\ ' " , 5 ) ;
}
else {
Assert ( bind - > keycode < = 127 ) ;
key_str_space [ 0 ] = ' \' ' ;
key_str_space [ 1 ] = ( char ) bind - > keycode ;
key_str_space [ 2 ] = ' \' ' ;
key_str_space [ 3 ] = 0 ;
}
}
2018-11-22 18:34:11 +00:00
fprintf ( out , " bind(context, %s, %s, %s); \n " , key_str , mdfr_str , bind - > command ) ;
2017-11-18 22:40:10 +00:00
}
}
fprintf ( out , " end_map(context); \n " ) ;
}
fprintf ( out , " } \n " ) ;
}
fprintf ( out , " #endif \n " ) ;
fprintf ( out ,
" #if defined(CUSTOM_COMMAND_SIG) \n "
" #define LINK_PROCS(x) x \n "
" #else \n "
" #define LINK_PROCS(x) \n "
" #endif \n " ) ;
fprintf ( out ,
" struct Meta_Key_Bind{ \n "
" int32_t vanilla; \n "
" uint32_t keycode; \n "
" uint32_t modifiers; \n "
" char *command; \n "
" int32_t command_len; \n "
" LINK_PROCS(Custom_Command_Function *proc;) \n "
" }; \n "
" struct Meta_Sub_Map{ \n "
" char *name; \n "
" int32_t name_len; \n "
" char *description; \n "
" int32_t description_len; \n "
" char *parent; \n "
" int32_t parent_len; \n "
" Meta_Key_Bind *binds; \n "
" int32_t bind_count; \n "
" }; \n "
" struct Meta_Mapping{ \n "
" char *name; \n "
" int32_t name_len; \n "
" char *description; \n "
" int32_t description_len; \n "
" Meta_Sub_Map *sub_maps; \n "
" int32_t sub_map_count; \n "
" LINK_PROCS(void (*fill_keys_proc)(Bind_Helper *context);) \n "
" }; \n " ) ;
for ( Mapping * mapping = mappings - > first_mapping ;
mapping ! = 0 ;
mapping = mapping - > next ) {
for ( Sub_Map * sub_map = mapping - > first_sub_map ;
sub_map ! = 0 ;
sub_map = sub_map - > next ) {
if ( sub_map - > key_bind_count > 0 ) {
fprintf ( out , " static Meta_Key_Bind fcoder_binds_for_%s_%s[%d] = { \n " ,
mapping - > name , sub_map - > name , sub_map - > key_bind_count ) ;
for ( Key_Bind * bind = sub_map - > first_key_bind ;
bind ! = 0 ;
bind = bind - > next ) {
fprintf ( out ,
" {%d, %u, %u, \" %s \" , %d, LINK_PROCS(%s)}, \n " ,
bind - > vanilla , bind - > keycode , bind - > modifiers ,
bind - > command , bind - > command_len ,
bind - > command ) ;
}
fprintf ( out , " }; \n " ) ;
}
}
fprintf ( out , " static Meta_Sub_Map fcoder_submaps_for_%s[%d] = { \n " ,
mapping - > name , mapping - > sub_map_count ) ;
for ( Sub_Map * sub_map = mapping - > first_sub_map ;
sub_map ! = 0 ;
sub_map = sub_map - > next ) {
if ( sub_map - > parent ! = 0 ) {
fprintf ( out , " { \" %s \" , %d, \" %s \" , %d, \" %s \" , %d, fcoder_binds_for_%s_%s, %d}, \n " ,
sub_map - > name , sub_map - > name_len ,
sub_map - > description , sub_map - > description_len ,
sub_map - > parent , sub_map - > parent_len ,
mapping - > name , sub_map - > name ,
sub_map - > key_bind_count ) ;
}
else {
fprintf ( out , " { \" %s \" , %d, \" %s \" , %d, 0, 0, fcoder_binds_for_%s_%s, %d}, \n " ,
sub_map - > name , sub_map - > name_len ,
sub_map - > description , sub_map - > description_len ,
mapping - > name , sub_map - > name ,
sub_map - > key_bind_count ) ;
}
}
fprintf ( out , " }; \n " ) ;
}
fprintf ( out , " static Meta_Mapping fcoder_meta_maps[%d] = { \n " ,
mappings - > mapping_count ) ;
for ( Mapping * mapping = mappings - > first_mapping ;
mapping ! = 0 ;
mapping = mapping - > next ) {
fprintf ( out , " { \" %s \" , %d, \" %s \" , %d, fcoder_submaps_for_%s, %d, LINK_PROCS(fill_keys_%s)}, \n " ,
mapping - > name , mapping - > name_len ,
mapping - > description , mapping - > description_len ,
mapping - > name ,
mapping - > sub_map_count ,
mapping - > name ) ;
}
fprintf ( out , " }; \n " ) ;
fclose ( out ) ;
}
2018-11-27 20:09:24 +00:00
end_temp_memory ( temp ) ;
2017-11-18 22:40:10 +00:00
}
//////////////////////////////////////////////////////////////////////////////////////////////////
2016-07-02 14:15:15 +00:00
int main ( int argc , char * * argv ) {
2017-07-10 17:05:30 +00:00
META_BEGIN ( ) ;
2018-11-27 20:09:24 +00:00
Partition part = fm_init_system ( ) ;
generate_custom_headers ( & part ) ;
generate_remapping_code_and_data ( & part ) ;
2017-07-10 17:05:30 +00:00
META_FINISH ( ) ;
2016-02-25 23:52:11 +00:00
}
// BOTTOM