aboutsummaryrefslogtreecommitdiffstats
path: root/build/4coder_byp/4coder_vim/4coder_vim_bindings.cpp
blob: bcab1161bd3ee03a65200090ac2ed60de83375be (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
// TODO(BYP): Might want meta-data on these, for now I prefer the simplicity
function void vim_overwrite(Table_u64_u64 *table, u64 key, u64 val){
	table_erase(table, key);
	table_insert(table, key, val);
}

function void vim_map_set_binding(u32 mode, u32 sub_mode, void *func, u64 key){
	if((mode & bitmask_3) == 0){
		mode |= bitmask_3;
		foreach(s,VIM_SUBMODE_COUNT){ vim_map_set_binding(mode, s, func, key); }
	}
	if(mode & bit_1){ vim_overwrite(vim_maps + 0 + sub_mode*VIM_MODE_COUNT, key, PtrAsInt(func)); }
	if(mode & bit_2){ vim_overwrite(vim_maps + 1 + sub_mode*VIM_MODE_COUNT, key, PtrAsInt(func)); }
	if(mode & bit_3){ vim_overwrite(vim_maps + 2 + sub_mode*VIM_MODE_COUNT, key, PtrAsInt(func)); }
}
function void VimBind(u32 mode, Custom_Command_Function *custom, Vim_Sub_Mode sub_mode, u64 key){
	vim_map_set_binding(mode, sub_mode, (void *)custom, key);
}
function void VimBind(u32 mode, Custom_Command_Function *custom, u64 key){
	vim_map_set_binding(mode, SUB_None, (void *)custom, key);
}


function void vim_default_bindings(Application_Links *app, Key_Code leader){

	// Normal, Insert, Visual
	// These could be local variables but I like the highlighting
#define N bit_1
#define I bit_2
#define V bit_3
#define MAP 0
	u32 Ctl = KeyMod_Ctl;
	u32 Sft = KeyMod_Sft;
	u32 Alt = KeyMod_Alt;

	VimBind(MAP, vim_normal_mode,                          KeyCode_Escape);
	VimBind(MAP, vim_inc_buffer_peek,                 (Ctl|KeyCode_RightBracket));
	VimBind(MAP, vim_dec_buffer_peek,                 (Ctl|KeyCode_LeftBracket));
	VimBind(MAP, vim_toggle_show_buffer_peek,         (Ctl|KeyCode_Return));
	VimBind(MAP, vim_toggle_show_buffer_peek,     (Ctl|Sft|KeyCode_Return));
	VimBind(MAP, vim_scoll_buffer_peek_up,        (Ctl|Sft|KeyCode_U));
	VimBind(MAP, vim_scoll_buffer_peek_down,      (Ctl|Sft|KeyCode_D));

	/// Rebinds
	VimBind(N|MAP, undo,                                   KeyCode_U);
	VimBind(N|MAP, undo,                              (Ctl|KeyCode_Z));
	VimBind(N|MAP, redo,                              (Ctl|KeyCode_R));
	VimBind(N|V|MAP, set_mark,                        (Ctl|KeyCode_Space));
	VimBind(N|MAP, save,                              (Ctl|KeyCode_S));
	VimBind(N|MAP, vim_open_file_in_quotes,         SUB_G, KeyCode_F);
	VimBind(N|MAP, vim_interactive_open_or_new,   (Ctl|Sft|KeyCode_O));
	VimBind(N|MAP, quick_swap_buffer,             (Sft|Ctl|KeyCode_6));
	VimBind(N|MAP, vim_goto_definition,               (Ctl|KeyCode_W));
	VimBind(N|MAP, vim_next_4coder_jump,              (Alt|KeyCode_N));
	VimBind(N|MAP, vim_prev_4coder_jump,          (Sft|Alt|KeyCode_N));
	VimBind(N|MAP, vim_first_4coder_jump,         (Sft|Alt|KeyCode_M));
	VimBind(N|I|MAP, view_buffer_other_panel,         (Ctl|KeyCode_1));
	VimBind(N|I|MAP, swap_panels,                     (Ctl|KeyCode_2));
	VimBind(I|MAP, word_complete_drop_down,           (Ctl|KeyCode_N));
	//VimBind(I|MAP, word_complete_drop_down,           (Ctl|KeyCode_P));
	VimBind(N|I|MAP, vim_if_read_only_goto_position,                 KeyCode_Return);
	VimBind(N|I|MAP, vim_if_read_only_goto_position_same_panel, (Sft|KeyCode_Return));

	/// Mode Binds
	VimBind(N|V|MAP, vim_modal_i,                          KeyCode_I);
	VimBind(N|V|MAP, vim_modal_a,                          KeyCode_A);
	VimBind(N|V|MAP, vim_command_mode,                (Sft|KeyCode_Semicolon));
	VimBind(N|MAP,   vim_insert_begin,                (Sft|KeyCode_I));
	VimBind(N|MAP,   vim_insert_end,                  (Sft|KeyCode_A));
	VimBind(N|MAP,   vim_replace_mode,                (Sft|KeyCode_R));
	VimBind(N|V|MAP, vim_visual_mode,                      KeyCode_V);
	VimBind(N|V|MAP, vim_visual_mode,                 (Sft|KeyCode_V));
	VimBind(N|V|MAP, vim_visual_mode,                 (Ctl|KeyCode_V));
	VimBind(N|MAP,   vim_prev_visual,               SUB_G, KeyCode_V);
	VimBind(N|MAP,   vim_newline_below,                    KeyCode_O);
	VimBind(N|MAP,   vim_newline_above,               (Sft|KeyCode_O));
	VimBind(V|MAP,   vim_visual_insert,               (Sft|KeyCode_A));
	VimBind(V|MAP,   vim_visual_insert,               (Sft|KeyCode_I));
	VimBind(I|MAP,   vim_insert_command,          (Ctl|Sft|KeyCode_O));

	/// Sub Mode Binds
	VimBind(N|V|MAP, vim_submode_g,                        KeyCode_G);
	VimBind(N|V|MAP, vim_submode_z,                        KeyCode_Z);
	VimBind(N|V|MAP, vim_submode_leader,                   leader);

	/// Request Binds
	VimBind(N|V|MAP, vim_request_yank,                     KeyCode_Y);
	VimBind(N|V|MAP, vim_request_delete,                   KeyCode_D);
	VimBind(N|V|MAP, vim_request_change,                   KeyCode_C);
	VimBind(N|V|MAP, vim_delete_end,                  (Sft|KeyCode_D));
	VimBind(N|V|MAP, vim_change_end,                  (Sft|KeyCode_C));
	VimBind(N|V|MAP, vim_yank_end,                    (Sft|KeyCode_Y));
	VimBind(N|V|MAP, vim_request_auto_indent,              KeyCode_Equal);
	VimBind(N|V|MAP, vim_lowercase,            SUB_G,      KeyCode_U);
	VimBind(N|V|MAP, vim_uppercase,            SUB_G, (Sft|KeyCode_U));
	VimBind(N|V|MAP, vim_toggle_case,          SUB_G, (Sft|KeyCode_Tick));
	VimBind(N|V|MAP, vim_request_indent,              (Sft|KeyCode_Period));
	VimBind(N|V|MAP, vim_request_outdent,             (Sft|KeyCode_Comma));
	VimBind(N|V|MAP, vim_request_fold,              SUB_Z, KeyCode_F);
	VimBind(N|V|MAP, fold_toggle_cursor,            SUB_Z, KeyCode_A);
	VimBind(N|V|MAP, fold_pop_cursor,               SUB_Z, KeyCode_D);
	VimBind(V|MAP,   vim_toggle_case,                 (Sft|KeyCode_Tick));
	VimBind(V|MAP,   vim_lowercase,                        KeyCode_U);
	VimBind(V|MAP,   vim_uppercase,                   (Sft|KeyCode_U));
	VimBind(V|MAP,   vim_replace_range_next,               KeyCode_R);

	/// Edit Binds
	VimBind(N|MAP,   vim_paste_before,               (Sft|KeyCode_P));
	VimBind(N|MAP,   vim_paste_after,                     KeyCode_P);
	VimBind(N|MAP,   vim_backspace_char,             (Sft|KeyCode_X));
	VimBind(N|MAP,   vim_delete_char,                     KeyCode_X);
	VimBind(N|MAP,   vim_replace_next_char,               KeyCode_R);
	VimBind(N|V|MAP, vim_combine_line,                (Sft|KeyCode_J));
	VimBind(N|V|MAP, vim_combine_line,         SUB_G, (Sft|KeyCode_J));
	VimBind(N|MAP,   vim_last_command,                     KeyCode_Period);
	VimBind(N|V|MAP, vim_select_register,             (Sft|KeyCode_Quote));
	VimBind(N|MAP,   vim_toggle_char,                 (Sft|KeyCode_Tick));
	VimBind(I|MAP,   vim_select_register,             (Ctl|KeyCode_R));
	VimBind(I|MAP,   vim_delete_to_begin,             (Ctl|KeyCode_U));
	VimBind(V|MAP,   vim_move_selection_up,           (Alt|KeyCode_K));
	VimBind(V|MAP,   vim_move_selection_down,         (Alt|KeyCode_J));

	/// Digit Binds
	VimBind(N|V|MAP, vim_modal_0,                          KeyCode_0);
	VimBind(N|V|MAP, vim_digit,                            KeyCode_1);
	VimBind(N|V|MAP, vim_digit,                            KeyCode_2);
	VimBind(N|V|MAP, vim_digit,                            KeyCode_3);
	VimBind(N|V|MAP, vim_digit,                            KeyCode_4);
	VimBind(N|V|MAP, vim_digit,                            KeyCode_5);
	VimBind(N|V|MAP, vim_digit,                            KeyCode_6);
	VimBind(N|V|MAP, vim_digit,                            KeyCode_7);
	VimBind(N|V|MAP, vim_digit,                            KeyCode_8);
	VimBind(N|V|MAP, vim_digit,                            KeyCode_9);
	VimBind(N|V|MAP, vim_digit_del,                        KeyCode_Backspace);
	VimBind(N|V|MAP, vim_digit_del,                        KeyCode_Delete);

	/// Movement Binds
	VimBind(N|V|MAP, vim_left,                             KeyCode_H);
	VimBind(N|V|MAP, vim_down,                             KeyCode_J);
	VimBind(N|V|MAP, vim_up,                               KeyCode_K);
	VimBind(N|V|MAP, vim_right,                            KeyCode_L);
	VimBind(N|V|MAP, vim_end_line,                    (Sft|KeyCode_4));
	VimBind(N|V|MAP, vim_begin_line,                  (Sft|KeyCode_6));
	VimBind(N|V|MAP, vim_forward_word,                     KeyCode_W);
	VimBind(N|V|MAP, vim_forward_WORD,                (Sft|KeyCode_W));
	VimBind(N|V|MAP, vim_backward_word,                    KeyCode_B);
	VimBind(N|V|MAP, vim_backward_WORD,               (Sft|KeyCode_B));
	VimBind(N|V|MAP, vim_forward_end,                      KeyCode_E);
	VimBind(N|V|MAP, vim_forward_END,                 (Sft|KeyCode_E));
	VimBind(N|V|MAP, vim_backward_end,         SUB_G,      KeyCode_E);
	VimBind(N|V|MAP, vim_backward_END,         SUB_G, (Sft|KeyCode_E));

	VimBind(N|V|MAP, vim_file_top,             SUB_G,     KeyCode_G);
	VimBind(N|V|MAP, vim_goto_line,                   (Sft|KeyCode_G));
	VimBind(N|V|MAP, vim_goto_column,                 (Sft|KeyCode_BackwardSlash));
	VimBind(N|V|MAP, vim_modal_percent,               (Sft|KeyCode_5));
	VimBind(N|V|MAP, vim_bounce,                      (Ctl|KeyCode_5));
	VimBind(N|V|MAP, vim_set_seek_char,                    KeyCode_F);
	VimBind(N|V|MAP, vim_set_seek_char,                    KeyCode_T);
	VimBind(N|V|MAP, vim_set_seek_char,               (Sft|KeyCode_F));
	VimBind(N|V|MAP, vim_set_seek_char,               (Sft|KeyCode_T));
	VimBind(N|V|MAP, vim_seek_char_forward,                KeyCode_Semicolon);
	VimBind(N|V|MAP, vim_seek_char_backward,               KeyCode_Comma);
	VimBind(N|V|MAP, vim_paragraph_up,                (Sft|KeyCode_LeftBracket));
	VimBind(N|V|MAP, vim_paragraph_down,              (Sft|KeyCode_RightBracket));
	VimBind(N|V|MAP, vim_screen_top,                  (Sft|KeyCode_H));
	VimBind(N|V|MAP, vim_screen_bot,                  (Sft|KeyCode_L));
	VimBind(N|V|MAP, vim_screen_mid,                  (Sft|KeyCode_M));

	// NOTE: cursor swapping with M
	VimBind(N|V|MAP,   cursor_mark_swap,                     KeyCode_M);

	VimBind(V|MAP,   vim_block_swap,                  (Sft|KeyCode_O));

	VimBind(N|V|MAP, vim_search_identifier,         (Ctl|Sft|KeyCode_8));
	VimBind(N|V|MAP, vim_search_identifier,             (Sft|KeyCode_8));
	VimBind(N|V|MAP, vim_clear_search,                SUB_Leader,  KeyCode_Space);
	VimBind(N|V|MAP, vim_start_search_forward,               KeyCode_ForwardSlash);
	VimBind(N|V|MAP, vim_start_search_backward,         (Sft|KeyCode_ForwardSlash));
	VimBind(N|V|MAP, vim_to_next_pattern,                    KeyCode_N);
	VimBind(N|V|MAP, vim_to_prev_pattern,               (Sft|KeyCode_N));
	VimBind(N|MAP, vim_in_next_pattern,        SUB_G,      KeyCode_N);
	VimBind(N|MAP, vim_in_prev_pattern,        SUB_G, (Sft|KeyCode_N));

	VimBind(N|MAP, vim_prev_jump,                     (Ctl|KeyCode_O));
	VimBind(N|MAP, vim_next_jump,                     (Ctl|KeyCode_I));

	/// Screen Adjust Binds
	VimBind(N|V|MAP, vim_half_page_up,                (Ctl|KeyCode_U));
	VimBind(N|V|MAP, vim_half_page_down,              (Ctl|KeyCode_D));
	VimBind(N|V|MAP, vim_whole_page_up,               (Ctl|KeyCode_B));
	VimBind(N|V|MAP, vim_whole_page_down,             (Ctl|KeyCode_F));
	VimBind(N|V|MAP, vim_line_down,               (Ctl|Sft|KeyCode_Y));
	VimBind(N|V|MAP, vim_line_down,                   (Ctl|KeyCode_Y));
	VimBind(N|V|MAP, vim_line_up,                 (Ctl|Sft|KeyCode_E));
	VimBind(N|V|MAP, vim_line_up,                     (Ctl|KeyCode_E));
	VimBind(N|V|MAP, vim_scroll_screen_top,         SUB_Z, KeyCode_T);
	VimBind(N|V|MAP, vim_scroll_screen_mid,         SUB_Z, KeyCode_Z);
	VimBind(N|V|MAP, vim_scroll_screen_bot,         SUB_Z, KeyCode_B);

	/// Miscellaneous Binds
	// VimBind(N|V|MAP, vim_set_mark,                         KeyCode_M);
	// VimBind(N|V|MAP, vim_goto_mark,                        KeyCode_Tick);
	// VimBind(N|V|MAP, vim_goto_mark,                        KeyCode_Quote);
	// VimBind(N|V|MAP, vim_toggle_macro,                     KeyCode_Q);
	// VimBind(N|V|MAP, vim_play_macro,                  (Sft|KeyCode_2));

	/// Window Binds (TODO(BYP): Do the rest of these, and do them properly)
	VimBind(N|MAP, change_active_panel_backwards,     (Ctl|KeyCode_H));
	VimBind(N|MAP, change_active_panel_backwards,     (Ctl|KeyCode_J));
	VimBind(N|MAP, change_active_panel,               (Ctl|KeyCode_K));
	VimBind(N|MAP, change_active_panel,               (Ctl|KeyCode_L));


#undef I
#undef N
#undef V
#undef MAP
}