Upgraded virtual whitespace layout

master
Allen Webster 2019-11-10 18:51:37 -08:00
parent b5e3812014
commit c4664e8ed5
10 changed files with 2258 additions and 2073 deletions

View File

@ -732,6 +732,19 @@ CUSTOM_DOC("Toggles the left margin line numbers.")
global_config.show_line_number_margins = !global_config.show_line_number_margins;
}
CUSTOM_COMMAND_SIG(toggle_line_wrap)
CUSTOM_DOC("Toggles the line wrap setting on this buffer.")
{
View_ID view = get_active_view(app, Access_ReadVisible);
Buffer_ID buffer = view_get_buffer(app, view, Access_Always);
Managed_Scope scope = buffer_get_managed_scope(app, buffer);
b32 *wrap_lines_ptr = scope_attachment(app, scope, buffer_wrap_lines, b32);
if (wrap_lines_ptr != 0){
*wrap_lines_ptr = !(*wrap_lines_ptr);
buffer_clear_layout_cache(app, buffer);
}
}
CUSTOM_COMMAND_SIG(exit_4coder)
CUSTOM_DOC("Attempts to close 4coder.")
{

View File

@ -10,8 +10,7 @@ function void
code_index_init(void){
global_code_index.mutex = system_mutex_make();
global_code_index.node_arena = make_arena_system(KB(4));
global_code_index.buffer_to_index_file =
make_table_u64_u64(global_code_index.node_arena.base_allocator, 500);
global_code_index.buffer_to_index_file = make_table_u64_u64(global_code_index.node_arena.base_allocator, 500);
}
function Code_Index_File_Storage*
@ -547,8 +546,7 @@ generic_parse_full_input_breaks(Code_Index_File *index, Generic_Parse_State *sta
////////////////////////////////
function void
default_comment_index(Application_Links *app, Arena *arena, Code_Index_File *index,
Token *token, String_Const_u8 contents){
default_comment_index(Application_Links *app, Arena *arena, Code_Index_File *index, Token *token, String_Const_u8 contents){
}
@ -559,16 +557,35 @@ generic_parse_init(Application_Links *app, Arena *arena, String_Const_u8 content
////////////////////////////////
function Token_Pair
layout_token_pair(Token_Array *tokens, i64 pos){
Token_Iterator_Array it = token_iterator_pos(0, tokens, pos);
Token *b = token_it_read(&it);
if (b->kind == TokenBaseKind_Whitespace){
token_it_inc_non_whitespace(&it);
b = token_it_read(&it);
}
token_it_dec_non_whitespace(&it);
Token *a = token_it_read(&it);
Token_Pair result = {};
if (a != 0){
result.a = *a;
}
if (b != 0){
result.b = *b;
}
return(result);
}
function f32
layout_index_x_shift(Application_Links *app, Layout_Reflex *reflex, Code_Index_Nest *nest, i64 pos, f32 space_advance){
layout_index_x_shift(Application_Links *app, Layout_Reflex *reflex, Code_Index_Nest *nest, i64 pos, f32 space_advance, b32 *unresolved_dependence){
f32 result = 0.f;
if (nest != 0){
switch (nest->kind){
case CodeIndexNest_Scope:
case CodeIndexNest_Preprocessor:
{
result = layout_index_x_shift(app, reflex, nest->parent, pos, space_advance);
result = layout_index_x_shift(app, reflex, nest->parent, pos, space_advance, unresolved_dependence);
if (nest->open.min < pos && nest->open.max <= pos &&
(!nest->is_closed || pos < nest->close.min)){
result += 4.f*space_advance;
@ -577,7 +594,7 @@ layout_index_x_shift(Application_Links *app, Layout_Reflex *reflex, Code_Index_N
case CodeIndexNest_Statement:
{
result = layout_index_x_shift(app, reflex, nest->parent, pos, space_advance);
result = layout_index_x_shift(app, reflex, nest->parent, pos, space_advance, unresolved_dependence);
if (nest->open.min < pos && nest->open.max <= pos &&
(!nest->is_closed || pos < nest->close.min)){
result += 4.f*space_advance;
@ -586,7 +603,7 @@ layout_index_x_shift(Application_Links *app, Layout_Reflex *reflex, Code_Index_N
case CodeIndexNest_Paren:
{
Rect_f32 box = layout_reflex_get_rect(app, reflex, nest->open.max - 1);
Rect_f32 box = layout_reflex_get_rect(app, reflex, nest->open.max - 1, unresolved_dependence);
result = box.x1;
}break;
}
@ -595,19 +612,63 @@ layout_index_x_shift(Application_Links *app, Layout_Reflex *reflex, Code_Index_N
}
function f32
layout_index_x_shift(Application_Links *app, Layout_Reflex *reflex, Code_Index_File *file, i64 pos, f32 space_advance){
layout_index_x_shift(Application_Links *app, Layout_Reflex *reflex, Code_Index_Nest *nest, i64 pos, f32 space_advance){
b32 ignore;
return(layout_index_x_shift(app, reflex, nest, pos, space_advance, &ignore));
}
function f32
layout_index_x_shift(Application_Links *app, Layout_Reflex *reflex, Code_Index_File *file, i64 pos, f32 space_advance, b32 *unresolved_dependence){
f32 indent = 0;
Code_Index_Nest *nest = code_index_get_nest(file, pos);
if (nest != 0){
indent = layout_index_x_shift(app, reflex, nest, pos, space_advance);
indent = layout_index_x_shift(app, reflex, nest, pos, space_advance, unresolved_dependence);
}
return(indent);
}
function f32
layout_index_x_shift(Application_Links *app, Layout_Reflex *reflex, Code_Index_File *file, i64 pos, f32 space_advance){
b32 ignore;
return(layout_index_x_shift(app, reflex, file, pos, space_advance, &ignore));
}
function void
layout_index__emit_chunk(LefRig_TopBot_Layout_Vars *pos_vars, Arena *arena, u8 *text_str, i64 range_first, u8 *ptr, u8 *end, Layout_Item_List *list){
for (;ptr < end;){
Character_Consume_Result consume = utf8_consume(ptr, (umem)(end - ptr));
if (consume.codepoint != '\r'){
i64 index = layout_index_from_ptr(ptr, text_str, range_first);
if (consume.codepoint != max_u32){
lr_tb_write(pos_vars, arena, list, index, consume.codepoint);
}
else{
lr_tb_write_byte(pos_vars, arena, list, index, *ptr);
}
}
ptr += consume.inc;
}
}
function i32
layout_token_score_wrap_token(Token_Pair *pair, Token_Cpp_Kind kind){
i32 result = 0;
if (pair->a.sub_kind != kind && pair->b.sub_kind == kind){
result -= 1;
}
else if (pair->a.sub_kind == kind && pair->b.sub_kind != kind){
result += 1;
}
return(result);
}
function Layout_Item_List
layout_index_unwrapped__inner(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width, Code_Index_File *file){
layout_index__inner(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width, Code_Index_File *file, Layout_Wrap_Kind kind){
Scratch_Block scratch(app);
Managed_Scope scope = buffer_get_managed_scope(app, buffer);
Token_Array *tokens_ptr = scope_attachment(app, scope, attachment_tokens, Token_Array);
Layout_Item_List list = get_empty_item_list(range);
String_Const_u8 text = push_buffer_range(app, scratch, buffer, range);
@ -630,92 +691,173 @@ layout_index_unwrapped__inner(Application_Links *app, Arena *arena, Buffer_ID bu
u8 *end_ptr = ptr + text.size;
u8 *word_ptr = ptr;
if (!character_is_whitespace(*ptr)){
goto consuming_non_whitespace;
}
skipping_leading_whitespace:
for (;ptr < end_ptr; ptr += 1){
if (!character_is_whitespace(*ptr)){
word_ptr = ptr;
goto consuming_non_whitespace;
}
if (*ptr == '\n'){
goto consuming_normal_whitespace;
}
}
u8 *pending_wrap_ptr = ptr;
f32 pending_wrap_x = 0.f;
i32 pending_wrap_paren_nest_count = 0;
i32 pending_wrap_token_score = 0;
f32 pending_wrap_accumulated_w = 0.f;
start:
if (ptr == end_ptr){
goto finish;
}
consuming_non_whitespace:
for (;ptr <= end_ptr; ptr += 1){
if (ptr == end_ptr || character_is_whitespace(*ptr)){
break;
}
if (!character_is_whitespace(*ptr)){
goto consuming_non_whitespace;
}
{
newline_layout_consume_default(&newline_vars);
for (;ptr < end_ptr; ptr += 1){
if (!character_is_whitespace(*ptr)){
pending_wrap_ptr = ptr;
word_ptr = ptr;
i64 index = layout_index_from_ptr(ptr, text.str, range.first);
f32 shift = layout_index_x_shift(app, &reflex, file, index, metrics.space_advance);
lr_tb_advance_x_without_item(&pos_vars, shift);
goto consuming_non_whitespace;
}
if (*ptr == '\n'){
pending_wrap_ptr = ptr;
i64 index = layout_index_from_ptr(ptr, text.str, range.first);
f32 shift = layout_index_x_shift(app, &reflex, file, index, metrics.space_advance);
lr_tb_advance_x_without_item(&pos_vars, shift);
goto consuming_normal_whitespace;
}
}
if (ptr == end_ptr){
pending_wrap_ptr = ptr;
i64 index = layout_index_from_ptr(ptr - 1, text.str, range.first);
f32 shift = layout_index_x_shift(app, &reflex, file, index, metrics.space_advance);
lr_tb_advance_x_without_item(&pos_vars, shift);
goto finish;
}
}
consuming_non_whitespace:
{
for (;ptr <= end_ptr; ptr += 1){
if (ptr == end_ptr || character_is_whitespace(*ptr)){
break;
}
}
// NOTE(allen): measure this word
newline_layout_consume_default(&newline_vars);
String_Const_u8 word = SCu8(word_ptr, ptr);
u8 *word_end = ptr;
if (!first_of_the_line){
f32 total_advance = 0.f;
{
f32 word_advance = 0.f;
ptr = word.str;
for (;ptr < word_end;){
Character_Consume_Result consume =
utf8_consume(ptr, (umem)(word_end - ptr));
Character_Consume_Result consume = utf8_consume(ptr, (umem)(word_end - ptr));
if (consume.codepoint != max_u32){
total_advance += lr_tb_advance(&pos_vars, consume.codepoint);
word_advance += lr_tb_advance(&pos_vars, consume.codepoint);
}
else{
total_advance += lr_tb_advance_byte(&pos_vars);
word_advance += lr_tb_advance_byte(&pos_vars);
}
ptr += consume.inc;
}
if (lr_tb_crosses_width(&pos_vars, total_advance)){
i64 index = layout_index_from_ptr(word.str, text.str, range.first);
lr_tb_align_rightward(&pos_vars, wrap_align_x);
lr_tb_write_ghost(&pos_vars, arena, &list, index, '\\');
lr_tb_next_line(&pos_vars);
f32 shift = layout_index_x_shift(app, &reflex, file, index, metrics.space_advance);
lr_tb_advance_x_without_item(&pos_vars, shift);
}
pending_wrap_accumulated_w += word_advance;
}
else{
i64 index = layout_index_from_ptr(word.str, text.str, range.first);
if (!first_of_the_line && (kind == Layout_Wrapped) && lr_tb_crosses_width(&pos_vars, pending_wrap_accumulated_w)){
i64 index = layout_index_from_ptr(pending_wrap_ptr, text.str, range.first);
lr_tb_align_rightward(&pos_vars, wrap_align_x);
lr_tb_write_ghost(&pos_vars, arena, &list, index, '\\');
lr_tb_next_line(&pos_vars);
f32 shift = layout_index_x_shift(app, &reflex, file, index, metrics.space_advance);
lr_tb_advance_x_without_item(&pos_vars, shift);
ptr = pending_wrap_ptr;
pending_wrap_accumulated_w = 0.f;
first_of_the_line = true;
goto start;
}
ptr = word.str;
for (;ptr < word_end;){
Character_Consume_Result consume =
utf8_consume(ptr, (umem)(word_end - ptr));
i64 index = layout_index_from_ptr(ptr, text.str, range.first);
if (consume.codepoint != max_u32){
lr_tb_write(&pos_vars, arena, &list, index, consume.codepoint);
}
else{
lr_tb_write_byte(&pos_vars, arena, &list, index, *ptr);
}
ptr += consume.inc;
}
first_of_the_line = false;
}
consuming_normal_whitespace:
for (; ptr < end_ptr; ptr += 1){
if (!character_is_whitespace(*ptr)){
u8 *new_wrap_ptr = ptr;
i64 index = layout_index_from_ptr(new_wrap_ptr, text.str, range.first);
Code_Index_Nest *new_wrap_nest = code_index_get_nest(file, index);
b32 invalid_wrap_x = false;
f32 new_wrap_x = layout_index_x_shift(app, &reflex, new_wrap_nest, index, metrics.space_advance, &invalid_wrap_x);
if (invalid_wrap_x){
new_wrap_x = max_f32;
}
i32 new_wrap_paren_nest_count = 0;
for (Code_Index_Nest *nest = new_wrap_nest;
nest != 0;
nest = nest->parent){
if (nest->kind == CodeIndexNest_Paren){
new_wrap_paren_nest_count += 1;
}
}
Token_Pair new_wrap_token_pair = layout_token_pair(tokens_ptr, index);
// TODO(allen): pull out the token scoring part and make it replacable for other
// language's token based wrap scoring needs.
i32 token_score = 0;
if (new_wrap_token_pair.a.kind == TokenBaseKind_Keyword){
if (new_wrap_token_pair.b.kind == TokenBaseKind_ParentheticalOpen ||
new_wrap_token_pair.b.kind == TokenBaseKind_Keyword){
token_score -= 2;
}
}
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_Eq);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_PlusEq);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_MinusEq);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_StarEq);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_DivEq);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_ModEq);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_LeftLeftEq);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_RightRightEq);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_Comma);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_AndAnd);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_OrOr);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_Ternary);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_Colon);
token_score += layout_token_score_wrap_token(&new_wrap_token_pair, TokenCppKind_Semicolon);
i32 new_wrap_token_score = token_score;
b32 new_wrap_ptr_is_better = false;
if (first_of_the_line){
new_wrap_ptr_is_better = true;
}
else{
if (new_wrap_token_score > pending_wrap_token_score){
new_wrap_ptr_is_better = true;
}
else if (new_wrap_token_score == pending_wrap_token_score){
f32 new_score = new_wrap_paren_nest_count*10.f + new_wrap_x;
f32 old_score = pending_wrap_paren_nest_count*10.f + pending_wrap_x + metrics.normal_advance*4.f + pending_wrap_accumulated_w*0.5f;
if (new_score < old_score){
new_wrap_ptr_is_better = true;
}
}
}
if (new_wrap_ptr_is_better){
layout_index__emit_chunk(&pos_vars, arena, text.str, range.first, pending_wrap_ptr, new_wrap_ptr, &list);
first_of_the_line = false;
pending_wrap_ptr = new_wrap_ptr;
pending_wrap_paren_nest_count = new_wrap_paren_nest_count;
pending_wrap_x = layout_index_x_shift(app, &reflex, new_wrap_nest, index, metrics.space_advance);
pending_wrap_paren_nest_count = new_wrap_paren_nest_count;
pending_wrap_token_score = new_wrap_token_score;
pending_wrap_accumulated_w = 0.f;
}
word_ptr = ptr;
goto consuming_non_whitespace;
}
@ -725,8 +867,7 @@ layout_index_unwrapped__inner(Application_Links *app, Arena *arena, Buffer_ID bu
default:
{
newline_layout_consume_default(&newline_vars);
lr_tb_write(&pos_vars, arena, &list, index, *ptr);
first_of_the_line = false;
pending_wrap_accumulated_w += lr_tb_advance(&pos_vars, *ptr);
}break;
case '\r':
@ -736,30 +877,24 @@ layout_index_unwrapped__inner(Application_Links *app, Arena *arena, Buffer_ID bu
case '\n':
{
if (first_of_the_line){
f32 shift = layout_index_x_shift(app, &reflex, file, index,
metrics.space_advance);
lr_tb_advance_x_without_item(&pos_vars, shift);
}
layout_index__emit_chunk(&pos_vars, arena, text.str, range.first, pending_wrap_ptr, ptr, &list);
pending_wrap_ptr = ptr + 1;
pending_wrap_accumulated_w = 0.f;
u64 newline_index = newline_layout_consume_LF(&newline_vars, index);
lr_tb_write_blank(&pos_vars, arena, &list, newline_index);
lr_tb_next_line(&pos_vars);
first_of_the_line = true;
ptr += 1;
goto skipping_leading_whitespace;
goto start;
}break;
}
}
finish:
if (newline_layout_consume_finish(&newline_vars)){
layout_index__emit_chunk(&pos_vars, arena, text.str, range.first, pending_wrap_ptr, ptr, &list);
i64 index = layout_index_from_ptr(ptr, text.str, range.first);
if (first_of_the_line){
f32 shift = layout_index_x_shift(app, &reflex, file, index,
metrics.space_advance);
lr_tb_advance_x_without_item(&pos_vars, shift);
}
lr_tb_write_blank(&pos_vars, arena, &list, index);
}
}
@ -769,32 +904,46 @@ layout_index_unwrapped__inner(Application_Links *app, Arena *arena, Buffer_ID bu
return(list);
}
function Layout_Item_List
layout_virt_indent_index_unwrapped(Application_Links *app, Arena *arena,
Buffer_ID buffer, Range_i64 range, Face_ID face,
f32 width){
layout_virt_indent_index(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width, Layout_Wrap_Kind kind){
Layout_Item_List result = {};
if (global_config.enable_virtual_whitespace){
code_index_lock();
Code_Index_File *file = code_index_get_file(buffer);
if (file != 0){
result = layout_index_unwrapped__inner(app, arena, buffer, range, face, width, file);
result = layout_index__inner(app, arena, buffer, range, face, width, file, kind);
}
code_index_unlock();
if (file == 0){
result = layout_virt_indent_literal_unwrapped(app, arena, buffer, range, face, width);
result = layout_virt_indent_literal(app, arena, buffer, range, face, width, kind);
}
}
else{
result = layout_wrap_whitespace(app, arena, buffer, range, face, width);
result = layout_basic(app, arena, buffer, range, face, width, kind);
}
return(result);
}
function Layout_Item_List
layout_virt_indent_index_unwrapped(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width){
return(layout_virt_indent_index(app, arena, buffer, range, face, width, Layout_Unwrapped));
}
function Layout_Item_List
layout_virt_indent_index_wrapped(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width){
return(layout_virt_indent_index(app, arena, buffer, range, face, width, Layout_Wrapped));
}
function Layout_Item_List
layout_virt_indent_index_generic(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width){
Managed_Scope scope = buffer_get_managed_scope(app, buffer);
b32 *wrap_lines_ptr = scope_attachment(app, scope, buffer_wrap_lines, b32);
b32 wrap_lines = (wrap_lines_ptr != 0 && *wrap_lines_ptr);
return(layout_virt_indent_index(app, arena, buffer, range, face, width, wrap_lines?Layout_Wrapped:Layout_Unwrapped));
}
CUSTOM_COMMAND_SIG(toggle_virtual_whitespace)
CUSTOM_DOC("Toggles the current buffer's virtual whitespace status.")
{

View File

@ -45,6 +45,7 @@ global Managed_ID view_word_complete_menu = 0;
global Managed_ID buffer_map_id = 0;
global Managed_ID buffer_eol_setting = 0;
global Managed_ID buffer_lex_task = 0;
global Managed_ID buffer_wrap_lines = 0;
global Managed_ID sticky_jump_marker_handle = 0;

View File

@ -955,12 +955,12 @@ BUFFER_HOOK_SIG(default_begin_buffer){
buffer_map_id = managed_id_declare(app, SCu8("DEFAULT.buffer_map_id"));
buffer_eol_setting = managed_id_declare(app, SCu8("DEFAULT.buffer_eol_setting"));
buffer_lex_task = managed_id_declare(app, SCu8("DEFAULT.buffer_lex_task"));
buffer_wrap_lines = managed_id_declare(app, SCu8("DEFAULT.buffer_wrap_lines"));
}
Command_Map_ID map_id = (treat_as_code)?(default_code_map):(mapid_file);
Managed_Scope scope = buffer_get_managed_scope(app, buffer_id);
Command_Map_ID *map_id_ptr = scope_attachment(app, scope, buffer_map_id,
Command_Map_ID);
Command_Map_ID *map_id_ptr = scope_attachment(app, scope, buffer_map_id, Command_Map_ID);
*map_id_ptr = map_id;
Line_Ending_Kind setting = guess_line_ending_kind_from_buffer_contents(app, buffer_id);
@ -988,34 +988,21 @@ BUFFER_HOOK_SIG(default_begin_buffer){
*lex_task_ptr = async_task_no_dep(&global_async_system, do_full_lex_async, make_data_struct(&buffer_id));
}
if (wrap_lines){
{
b32 *wrap_lines_ptr = scope_attachment(app, scope, buffer_wrap_lines, b32);
*wrap_lines_ptr = wrap_lines;
}
if (use_virtual_whitespace){
if (use_lexer){
buffer_set_layout(app, buffer_id, layout_virt_indent_index_unwrapped);
//buffer_set_layout(app, buffer_id, layout_virt_indent_literal_unwrapped);
buffer_set_layout(app, buffer_id, layout_virt_indent_index_generic);
}
else{
buffer_set_layout(app, buffer_id, layout_virt_indent_literal_unwrapped);
buffer_set_layout(app, buffer_id, layout_virt_indent_literal_generic);
}
}
else{
buffer_set_layout(app, buffer_id, layout_wrap_whitespace);
buffer_set_layout(app, buffer_id, layout_generic);
}
}
else{
if (use_virtual_whitespace){
if (use_lexer){
buffer_set_layout(app, buffer_id, layout_virt_indent_index_unwrapped);
//buffer_set_layout(app, buffer_id, layout_virt_indent_literal_unwrapped);
}
else{
buffer_set_layout(app, buffer_id, layout_virt_indent_literal_unwrapped);
}
}
else{
buffer_set_layout(app, buffer_id, layout_unwrapped);
}
}
// no meaning for return
return(0);

View File

@ -15,14 +15,21 @@ get_layout_reflex(Layout_Item_List *list, Buffer_ID buffer, f32 width, Face_ID f
}
function Rect_f32
layout_reflex_get_rect(Application_Links *app, Layout_Reflex *reflex, i64 pos){
layout_reflex_get_rect(Application_Links *app, Layout_Reflex *reflex, i64 pos, b32 *unresolved_dependence){
Rect_f32 rect = {};
if (range_contains(reflex->list->input_index_range, pos)){
rect = layout_box_of_pos(*reflex->list, pos);
if (range_contains(reflex->list->manifested_index_range, pos)){
rect = layout_box_of_pos(*reflex->list, pos);
*unresolved_dependence = false;
}
else{
*unresolved_dependence = true;
}
}
else{
Buffer_Cursor cursor = buffer_compute_cursor(app, reflex->buffer, seek_pos(pos));
rect = buffer_relative_box_of_pos(app, reflex->buffer, reflex->width, reflex->face, cursor.line, cursor.pos);
rect = buffer_relative_box_of_pos(app, reflex->buffer, reflex->width, reflex->face, cursor.line, cursor.pos);
*unresolved_dependence = false;
}
return(rect);
}
@ -272,9 +279,7 @@ lr_tb_align_rightward(LefRig_TopBot_Layout_Vars *vars, f32 align_x){
////////////////////////////////
function Layout_Item_List
layout_unwrapped_small_blank_lines(Application_Links *app, Arena *arena,
Buffer_ID buffer, Range_i64 range, Face_ID face,
f32 width){
layout_unwrapped_small_blank_lines(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width){
Layout_Item_List list = get_empty_item_list(range);
Scratch_Block scratch(app);
@ -368,72 +373,7 @@ layout_unwrapped_small_blank_lines(Application_Links *app, Arena *arena,
}
function Layout_Item_List
layout_unwrapped(Application_Links *app, Arena *arena, Buffer_ID buffer,
Range_i64 range, Face_ID face, f32 width){
Layout_Item_List list = get_empty_item_list(range);
Scratch_Block scratch(app);
String_Const_u8 text = push_buffer_range(app, scratch, buffer, range);
Face_Advance_Map advance_map = get_face_advance_map(app, face);
Face_Metrics metrics = get_face_metrics(app, face);
LefRig_TopBot_Layout_Vars pos_vars = get_lr_tb_layout_vars(&advance_map, &metrics, width);
if (text.size == 0){
lr_tb_write_blank(&pos_vars, arena, &list, range.first);
}
else{
Newline_Layout_Vars newline_vars = get_newline_layout_vars();
u8 *ptr = text.str;
u8 *end_ptr = ptr + text.size;
for (;ptr < end_ptr;){
Character_Consume_Result consume = utf8_consume(ptr, (umem)(end_ptr - ptr));
i64 index = layout_index_from_ptr(ptr, text.str, range.first);
switch (consume.codepoint){
default:
{
newline_layout_consume_default(&newline_vars);
lr_tb_write(&pos_vars, arena, &list, index, consume.codepoint);
}break;
case '\r':
{
newline_layout_consume_CR(&newline_vars, index);
}break;
case '\n':
{
i64 newline_index = newline_layout_consume_LF(&newline_vars, index);
lr_tb_write_blank(&pos_vars, arena, &list, newline_index);
lr_tb_next_line(&pos_vars);
}break;
case max_u32:
{
newline_layout_consume_default(&newline_vars);
lr_tb_write_byte(&pos_vars, arena, &list, index, *ptr);
}break;
}
ptr += consume.inc;
}
if (newline_layout_consume_finish(&newline_vars)){
i64 index = layout_index_from_ptr(ptr, text.str, range.first);
lr_tb_write_blank(&pos_vars, arena, &list, index);
}
}
layout_item_list_finish(&list, -pos_vars.line_to_text_shift);
return(list);
}
function Layout_Item_List
layout_wrap_anywhere(Application_Links *app, Arena *arena, Buffer_ID buffer,
Range_i64 range, Face_ID face, f32 width){
layout_wrap_anywhere(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width){
Scratch_Block scratch(app);
Layout_Item_List list = get_empty_item_list(range);
@ -509,8 +449,84 @@ layout_wrap_anywhere(Application_Links *app, Arena *arena, Buffer_ID buffer,
}
function Layout_Item_List
layout_wrap_whitespace(Application_Links *app, Arena *arena, Buffer_ID buffer,
Range_i64 range, Face_ID face, f32 width){
layout_unwrapped__inner(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width, Layout_Virtual_Indent virt_indent){
Layout_Item_List list = get_empty_item_list(range);
Scratch_Block scratch(app);
String_Const_u8 text = push_buffer_range(app, scratch, buffer, range);
Face_Advance_Map advance_map = get_face_advance_map(app, face);
Face_Metrics metrics = get_face_metrics(app, face);
LefRig_TopBot_Layout_Vars pos_vars = get_lr_tb_layout_vars(&advance_map, &metrics, width);
if (text.size == 0){
lr_tb_write_blank(&pos_vars, arena, &list, range.first);
}
else{
b32 skipping_leading_whitespace = (virt_indent == LayoutVirtualIndent_On);
Newline_Layout_Vars newline_vars = get_newline_layout_vars();
u8 *ptr = text.str;
u8 *end_ptr = ptr + text.size;
for (;ptr < end_ptr;){
Character_Consume_Result consume = utf8_consume(ptr, (umem)(end_ptr - ptr));
i64 index = layout_index_from_ptr(ptr, text.str, range.first);
switch (consume.codepoint){
case '\t':
case ' ':
{
newline_layout_consume_default(&newline_vars);
f32 advance = lr_tb_advance(&pos_vars, consume.codepoint);
if (!skipping_leading_whitespace){
lr_tb_write_with_advance(&pos_vars, advance, arena, &list, index, consume.codepoint);
}
else{
lr_tb_advance_x_without_item(&pos_vars, advance);
}
}break;
default:
{
newline_layout_consume_default(&newline_vars);
lr_tb_write(&pos_vars, arena, &list, index, consume.codepoint);
}break;
case '\r':
{
newline_layout_consume_CR(&newline_vars, index);
}break;
case '\n':
{
i64 newline_index = newline_layout_consume_LF(&newline_vars, index);
lr_tb_write_blank(&pos_vars, arena, &list, newline_index);
lr_tb_next_line(&pos_vars);
}break;
case max_u32:
{
newline_layout_consume_default(&newline_vars);
lr_tb_write_byte(&pos_vars, arena, &list, index, *ptr);
}break;
}
ptr += consume.inc;
}
if (newline_layout_consume_finish(&newline_vars)){
i64 index = layout_index_from_ptr(ptr, text.str, range.first);
lr_tb_write_blank(&pos_vars, arena, &list, index);
}
}
layout_item_list_finish(&list, -pos_vars.line_to_text_shift);
return(list);
}
function Layout_Item_List
layout_wrap_whitespace__inner(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width, Layout_Virtual_Indent virt_indent){
Scratch_Block scratch(app);
Layout_Item_List list = get_empty_item_list(range);
@ -525,6 +541,7 @@ layout_wrap_whitespace(Application_Links *app, Arena *arena, Buffer_ID buffer,
lr_tb_write_blank(&pos_vars, arena, &list, range.first);
}
else{
b32 skipping_leading_whitespace = false;
b32 first_of_the_line = true;
Newline_Layout_Vars newline_vars = get_newline_layout_vars();
@ -533,6 +550,7 @@ layout_wrap_whitespace(Application_Links *app, Arena *arena, Buffer_ID buffer,
u8 *word_ptr = ptr;
if (character_is_whitespace(*ptr)){
skipping_leading_whitespace = (virt_indent == LayoutVirtualIndent_On);
goto consuming_whitespace;
}
@ -598,6 +616,23 @@ layout_wrap_whitespace(Application_Links *app, Arena *arena, Buffer_ID buffer,
i64 index = layout_index_from_ptr(ptr, text.str, range.first);
switch (*ptr){
case '\t':
case ' ':
{
newline_layout_consume_default(&newline_vars);
f32 advance = lr_tb_advance(&pos_vars, *ptr);
if (!skipping_leading_whitespace){
if (!first_of_the_line && lr_tb_crosses_width(&pos_vars, advance)){
lr_tb_next_line(&pos_vars);
}
lr_tb_write_with_advance(&pos_vars, advance, arena, &list, index, *ptr);
first_of_the_line = false;
}
else{
lr_tb_advance_x_without_item(&pos_vars, advance);
}
}break;
default:
{
newline_layout_consume_default(&newline_vars);
@ -605,8 +640,7 @@ layout_wrap_whitespace(Application_Links *app, Arena *arena, Buffer_ID buffer,
if (!first_of_the_line && lr_tb_crosses_width(&pos_vars, advance)){
lr_tb_next_line(&pos_vars);
}
lr_tb_write_with_advance(&pos_vars, advance,
arena, &list, index, *ptr);
lr_tb_write_with_advance(&pos_vars, advance, arena, &list, index, *ptr);
first_of_the_line = false;
}break;
@ -637,89 +671,71 @@ layout_wrap_whitespace(Application_Links *app, Arena *arena, Buffer_ID buffer,
}
function Layout_Item_List
layout_virt_indent_literal_unwrapped(Application_Links *app, Arena *arena,
Buffer_ID buffer, Range_i64 range, Face_ID face,
f32 width){
Scratch_Block scratch(app);
layout_unwrapped(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width){
return(layout_unwrapped__inner(app, arena, buffer, range, face, width, LayoutVirtualIndent_Off));
}
Layout_Item_List list = get_empty_item_list(range);
function Layout_Item_List
layout_wrap_whitespace(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width){
return(layout_wrap_whitespace__inner(app, arena, buffer, range, face, width, LayoutVirtualIndent_Off));
}
String_Const_u8 text = push_buffer_range(app, scratch, buffer, range);
Face_Advance_Map advance_map = get_face_advance_map(app, face);
Face_Metrics metrics = get_face_metrics(app, face);
LefRig_TopBot_Layout_Vars pos_vars = get_lr_tb_layout_vars(&advance_map, &metrics, width);
if (text.size == 0){
lr_tb_write_blank(&pos_vars, arena, &list, range.start);
function Layout_Item_List
layout_basic(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width, Layout_Wrap_Kind kind){
Layout_Item_List result = {};
switch (kind){
case Layout_Unwrapped:
{
result = layout_unwrapped(app, arena, buffer, range, face, width);
}break;
case Layout_Wrapped:
{
result = layout_wrap_whitespace(app, arena, buffer, range, face, width);
}break;
}
else{
b32 skipping_leading_whitespace = true;
Newline_Layout_Vars newline_vars = get_newline_layout_vars();
return(result);
}
u8 *ptr = text.str;
u8 *end_ptr = ptr + text.size;
for (;ptr < end_ptr;){
Character_Consume_Result consume = utf8_consume(ptr, (umem)(end_ptr - ptr));
function Layout_Item_List
layout_generic(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width){
Managed_Scope scope = buffer_get_managed_scope(app, buffer);
b32 *wrap_lines_ptr = scope_attachment(app, scope, buffer_wrap_lines, b32);
b32 wrap_lines = (wrap_lines_ptr != 0 && *wrap_lines_ptr);
return(layout_basic(app, arena, buffer, range, face, width, wrap_lines?Layout_Wrapped:Layout_Unwrapped));
}
if (!character_is_whitespace(consume.codepoint)){
skipping_leading_whitespace = false;
}
function Layout_Item_List
layout_virt_indent_literal_unwrapped(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width){
return(layout_unwrapped__inner(app, arena, buffer, range, face, width, LayoutVirtualIndent_On));
}
i64 index = layout_index_from_ptr(ptr, text.str, range.first);
switch (consume.codepoint){
case '\t':
case ' ':
{
newline_layout_consume_default(&newline_vars);
f32 advance = lr_tb_advance(&pos_vars, consume.codepoint);
if (!skipping_leading_whitespace){
lr_tb_write_with_advance(&pos_vars, advance,
arena, &list, index,
consume.codepoint);
}
else{
lr_tb_advance_x_without_item(&pos_vars, advance);
}
}break;
function Layout_Item_List
layout_virt_indent_literal_wrapped(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width){
return(layout_wrap_whitespace__inner(app, arena, buffer, range, face, width, LayoutVirtualIndent_On));
}
default:
{
newline_layout_consume_default(&newline_vars);
lr_tb_write(&pos_vars, arena, &list, index, consume.codepoint);
}break;
case '\r':
{
newline_layout_consume_CR(&newline_vars, index);
}break;
case '\n':
{
i64 newline_index = newline_layout_consume_LF(&newline_vars, index);
lr_tb_write_blank(&pos_vars, arena, &list, newline_index);
lr_tb_next_line(&pos_vars);
}break;
case max_u32:
{
newline_layout_consume_default(&newline_vars);
lr_tb_write_byte(&pos_vars, arena, &list, index, *ptr);
}break;
}
ptr += consume.inc;
}
if (newline_layout_consume_finish(&newline_vars)){
i64 index = layout_index_from_ptr(ptr, text.str, range.first);
lr_tb_write_blank(&pos_vars, arena, &list, index);
}
function Layout_Item_List
layout_virt_indent_literal(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width, Layout_Wrap_Kind kind){
Layout_Item_List result = {};
switch (kind){
case Layout_Unwrapped:
{
result = layout_virt_indent_literal_unwrapped(app, arena, buffer, range, face, width);
}break;
case Layout_Wrapped:
{
result = layout_virt_indent_literal_wrapped(app, arena, buffer, range, face, width);
}break;
}
return(result);
}
layout_item_list_finish(&list, -pos_vars.line_to_text_shift);
return(list);
function Layout_Item_List
layout_virt_indent_literal_generic(Application_Links *app, Arena *arena, Buffer_ID buffer, Range_i64 range, Face_ID face, f32 width){
Managed_Scope scope = buffer_get_managed_scope(app, buffer);
b32 *wrap_lines_ptr = scope_attachment(app, scope, buffer_wrap_lines, b32);
b32 wrap_lines = (wrap_lines_ptr != 0 && *wrap_lines_ptr);
return(layout_virt_indent_literal(app, arena, buffer, range, face, width, wrap_lines?Layout_Wrapped:Layout_Unwrapped));
}
// BOTTOM

View File

@ -33,6 +33,18 @@ struct Layout_Reflex{
Face_ID face;
};
typedef i32 Layout_Wrap_Kind;
enum{
Layout_Unwrapped,
Layout_Wrapped,
};
typedef i32 Layout_Virtual_Indent;
enum{
LayoutVirtualIndent_Off,
LayoutVirtualIndent_On,
};
#endif
// BOTTOM

View File

@ -61,6 +61,11 @@ struct Token{
u16 sub_flags;
};
struct Token_Pair{
Token a;
Token b;
};
struct Token_Array{
Token *tokens;
i64 count;

View File

@ -90,7 +90,6 @@ tutorial_render(Application_Links *app, Frame_Info frame_info, View_ID view_id){
Face_ID face = get_face_id(app, 0);
tutorial_init_title_face(app);
Face_Metrics metrics = get_face_metrics(app, face);
Face_Metrics tut_metrics = get_face_metrics(app, tutorial.face);
////////
@ -125,7 +124,7 @@ tutorial_render(Application_Links *app, Frame_Info frame_info, View_ID view_id){
if (is_active_view){
if (!tutorial.is_active){
view_enqueue_command_function(app, view_id, tutorial_activate);
}
}
}
else{
if (tutorial.is_active){
@ -152,25 +151,25 @@ tutorial_render(Application_Links *app, Frame_Info frame_info, View_ID view_id){
Rect_f32_Pair pair = rect_split_left_right(footer, b_width);
footer = pair.max;
footer.x0 += 10.f;
if (tutorial.slide_index > 0){
if (draw_button(app, pair.min, m_p, face, string_u8_litexpr("prev"))){
tutorial.hover_action = TutorialAction_Prev;
if (tutorial.slide_index > 0){
if (draw_button(app, pair.min, m_p, face, string_u8_litexpr("prev"))){
tutorial.hover_action = TutorialAction_Prev;
}
}
}
}
{
{
Rect_f32_Pair pair = rect_split_left_right(footer, b_width);
footer = pair.max;
footer.x0 += 10.f;
if (tutorial.slide_index < tutorial.slide_count - 1){
if (draw_button(app, pair.min, m_p, face, string_u8_litexpr("next"))){
tutorial.hover_action = TutorialAction_Next;
if (tutorial.slide_index < tutorial.slide_count - 1){
if (draw_button(app, pair.min, m_p, face, string_u8_litexpr("next"))){
tutorial.hover_action = TutorialAction_Next;
}
}
}
}
{
{
Rect_f32_Pair pair = rect_split_left_right(footer, b_width);
footer = pair.max;
footer.x0 += 10.f;
@ -178,16 +177,16 @@ tutorial_render(Application_Links *app, Frame_Info frame_info, View_ID view_id){
pair = rect_split_left_right(footer, b_width);
Rect_f32 restart_box = pair.min;
if (tutorial.slide_index == tutorial.slide_count - 1){
if (draw_button(app, exit_box, m_p, face, string_u8_litexpr("end"))){
tutorial.hover_action = TutorialAction_Exit;
}
if (tutorial.slide_index == tutorial.slide_count - 1){
if (draw_button(app, exit_box, m_p, face, string_u8_litexpr("end"))){
tutorial.hover_action = TutorialAction_Exit;
}
if (draw_button(app, restart_box, m_p, face, string_u8_litexpr("restart"))){
tutorial.hover_action = TutorialAction_Restart;
tutorial.hover_action = TutorialAction_Restart;
}
}
}
}
}
else{
draw_fancy_line(app, 0, fcolor_zero(), &slide.short_details, title_p);
@ -214,7 +213,7 @@ tutorial_run_loop(Application_Links *app)
break;
}
b32 handled = true;
b32 handled = true;
switch (in.event.kind){
case InputEventKind_MouseButton:
{
@ -335,7 +334,7 @@ hms_demo_tutorial_binding_line(Application_Links *app, Arena *arena, Fancy_Block
}
f32 pad_size = 0.f;
if (fill_size < 40.f){
pad_size = 40.f - fill_size;
pad_size = 40.f - fill_size;
}
Fancy_Line *line = line = push_fancy_line(arena, long_details, face, fcolor_id(Stag_Default));

View File

@ -2,7 +2,7 @@
#define command_id(c) (fcoder_metacmd_ID_##c)
#define command_metadata(c) (&fcoder_metacmd_table[command_id(c)])
#define command_metadata_by_id(id) (&fcoder_metacmd_table[id])
#define command_one_past_last_id 216
#define command_one_past_last_id 217
#if defined(CUSTOM_COMMAND_SIG)
#define PROC_LINKS(x,y) x
#else
@ -94,6 +94,7 @@ CUSTOM_COMMAND_SIG(decrease_face_size);
CUSTOM_COMMAND_SIG(mouse_wheel_change_face_size);
CUSTOM_COMMAND_SIG(toggle_show_whitespace);
CUSTOM_COMMAND_SIG(toggle_line_numbers);
CUSTOM_COMMAND_SIG(toggle_line_wrap);
CUSTOM_COMMAND_SIG(exit_4coder);
CUSTOM_COMMAND_SIG(goto_line);
CUSTOM_COMMAND_SIG(search);
@ -237,7 +238,7 @@ char *source_name;
i32 source_name_len;
i32 line_number;
};
static Command_Metadata fcoder_metacmd_table[216] = {
static Command_Metadata fcoder_metacmd_table[217] = {
{ PROC_LINKS(default_view_input_handler, 0), false, "default_view_input_handler", 26, "Input consumption loop for default view behavior", 48, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 56 },
{ PROC_LINKS(profile_enable, 0), false, "profile_enable", 14, "Allow 4coder's self profiler to gather new profiling information.", 65, "w:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 207 },
{ PROC_LINKS(profile_disable, 0), false, "profile_disable", 15, "Prevent 4coder's self profiler from gathering new profiling information.", 72, "w:\\4ed\\code\\custom\\4coder_profile.cpp", 37, 214 },
@ -248,7 +249,7 @@ static Command_Metadata fcoder_metacmd_table[216] = {
{ PROC_LINKS(seek_end_of_line, 0), false, "seek_end_of_line", 16, "Seeks the cursor to the end of the visual line.", 47, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2175 },
{ PROC_LINKS(goto_beginning_of_file, 0), false, "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2181 },
{ PROC_LINKS(goto_end_of_file, 0), false, "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "w:\\4ed\\code\\custom\\4coder_helper.cpp", 36, 2189 },
{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 798 },
{ PROC_LINKS(toggle_virtual_whitespace, 0), false, "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\custom\\4coder_code_index.cpp", 40, 945 },
{ PROC_LINKS(change_active_panel, 0), false, "change_active_panel", 19, "Change the currently active panel, moving to the panel with the next highest view_id.", 85, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 284 },
{ PROC_LINKS(change_active_panel_backwards, 0), false, "change_active_panel_backwards", 29, "Change the currently active panel, moving to the panel with the next lowest view_id.", 84, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 290 },
{ PROC_LINKS(open_panel_vsplit, 0), false, "open_panel_vsplit", 17, "Create a new panel by vertically splitting the active panel.", 60, "w:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 300 },
@ -323,40 +324,41 @@ static Command_Metadata fcoder_metacmd_table[216] = {
{ PROC_LINKS(mouse_wheel_change_face_size, 0), false, "mouse_wheel_change_face_size", 28, "Reads the state of the mouse wheel and uses it to either increase or decrease the face size.", 92, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 703 },
{ PROC_LINKS(toggle_show_whitespace, 0), false, "toggle_show_whitespace", 22, "Toggles the current buffer's whitespace visibility status.", 58, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 720 },
{ PROC_LINKS(toggle_line_numbers, 0), false, "toggle_line_numbers", 19, "Toggles the left margin line numbers.", 37, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 729 },
{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 735 },
{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 743 },
{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 971 },
{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 977 },
{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 983 },
{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 989 },
{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1036 },
{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1045 },
{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1054 },
{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1144 },
{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1165 },
{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1181 },
{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1217 },
{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1242 },
{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1286 },
{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1319 },
{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1357 },
{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1391 },
{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1397 },
{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1403 },
{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1417 },
{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1482 },
{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1514 },
{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1527 },
{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1539 },
{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1563 },
{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1571 },
{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1581 },
{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1806 },
{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1819 },
{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1833 },
{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1904 },
{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 2005 },
{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 2011 },
{ PROC_LINKS(toggle_line_wrap, 0), false, "toggle_line_wrap", 16, "Toggles the line wrap setting on this buffer.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 735 },
{ PROC_LINKS(exit_4coder, 0), false, "exit_4coder", 11, "Attempts to close 4coder.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 748 },
{ PROC_LINKS(goto_line, 0), false, "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 756 },
{ PROC_LINKS(search, 0), false, "search", 6, "Begins an incremental search down through the current buffer for a user specified string.", 89, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 984 },
{ PROC_LINKS(reverse_search, 0), false, "reverse_search", 14, "Begins an incremental search up through the current buffer for a user specified string.", 87, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 990 },
{ PROC_LINKS(search_identifier, 0), false, "search_identifier", 17, "Begins an incremental search down through the current buffer for the word or token under the cursor.", 100, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 996 },
{ PROC_LINKS(reverse_search_identifier, 0), false, "reverse_search_identifier", 25, "Begins an incremental search up through the current buffer for the word or token under the cursor.", 98, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1002 },
{ PROC_LINKS(replace_in_range, 0), false, "replace_in_range", 16, "Queries the user for a needle and string. Replaces all occurences of needle with string in the range between cursor and the mark in the active buffer.", 150, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1049 },
{ PROC_LINKS(replace_in_buffer, 0), false, "replace_in_buffer", 17, "Queries the user for a needle and string. Replaces all occurences of needle with string in the active buffer.", 109, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1058 },
{ PROC_LINKS(replace_in_all_buffers, 0), false, "replace_in_all_buffers", 22, "Queries the user for a needle and string. Replaces all occurences of needle with string in all editable buffers.", 112, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1067 },
{ PROC_LINKS(query_replace, 0), false, "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1157 },
{ PROC_LINKS(query_replace_identifier, 0), false, "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1178 },
{ PROC_LINKS(query_replace_selection, 0), false, "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1194 },
{ PROC_LINKS(save_all_dirty_buffers, 0), false, "save_all_dirty_buffers", 22, "Saves all buffers marked dirty (showing the '*' indicator).", 59, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1230 },
{ PROC_LINKS(delete_file_query, 0), false, "delete_file_query", 17, "Deletes the file of the current buffer if 4coder has the appropriate access rights. Will ask the user for confirmation first.", 125, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1255 },
{ PROC_LINKS(save_to_query, 0), false, "save_to_query", 13, "Queries the user for a file name and saves the contents of the current buffer, altering the buffer's name too.", 110, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1299 },
{ PROC_LINKS(rename_file_query, 0), false, "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1332 },
{ PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1370 },
{ PROC_LINKS(move_line_up, 0), false, "move_line_up", 12, "Swaps the line under the cursor with the line above it, and moves the cursor up with it.", 88, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1404 },
{ PROC_LINKS(move_line_down, 0), false, "move_line_down", 14, "Swaps the line under the cursor with the line below it, and moves the cursor down with it.", 90, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1410 },
{ PROC_LINKS(duplicate_line, 0), false, "duplicate_line", 14, "Create a copy of the line on which the cursor sits.", 51, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1416 },
{ PROC_LINKS(delete_line, 0), false, "delete_line", 11, "Delete the line the on which the cursor sits.", 45, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1430 },
{ PROC_LINKS(open_file_in_quotes, 0), false, "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1495 },
{ PROC_LINKS(open_matching_file_cpp, 0), false, "open_matching_file_cpp", 22, "If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.", 110, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1527 },
{ PROC_LINKS(view_buffer_other_panel, 0), false, "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1540 },
{ PROC_LINKS(swap_panels, 0), false, "swap_panels", 11, "Swaps the active panel with it's sibling.", 41, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1552 },
{ PROC_LINKS(kill_buffer, 0), false, "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1576 },
{ PROC_LINKS(save, 0), false, "save", 4, "Saves the current buffer.", 25, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1584 },
{ PROC_LINKS(reopen, 0), false, "reopen", 6, "Reopen the current buffer from the hard drive.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1594 },
{ PROC_LINKS(undo, 0), false, "undo", 4, "Advances backwards through the undo history of the current buffer.", 66, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1819 },
{ PROC_LINKS(redo, 0), false, "redo", 4, "Advances forwards through the undo history of the current buffer.", 65, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1832 },
{ PROC_LINKS(undo_all_buffers, 0), false, "undo_all_buffers", 16, "Advances backward through the undo history in the buffer containing the most recent regular edit.", 97, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1846 },
{ PROC_LINKS(redo_all_buffers, 0), false, "redo_all_buffers", 16, "Advances forward through the undo history in the buffer containing the most recent regular edit.", 96, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1917 },
{ PROC_LINKS(open_in_other, 0), false, "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 2018 },
{ PROC_LINKS(default_file_externally_modified, 0), false, "default_file_externally_modified", 32, "Notes the external modification of attached files by printing a message.", 72, "w:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 2024 },
{ PROC_LINKS(set_eol_mode_to_crlf, 0), false, "set_eol_mode_to_crlf", 20, "Puts the buffer in crlf line ending mode.", 41, "w:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 86 },
{ PROC_LINKS(set_eol_mode_to_lf, 0), false, "set_eol_mode_to_lf", 18, "Puts the buffer in lf line ending mode.", 39, "w:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 97 },
{ PROC_LINKS(set_eol_mode_to_binary, 0), false, "set_eol_mode_to_binary", 22, "Puts the buffer in bin line ending mode.", 40, "w:\\4ed\\code\\custom\\4coder_eol.cpp", 33, 108 },
@ -451,7 +453,7 @@ static Command_Metadata fcoder_metacmd_table[216] = {
{ PROC_LINKS(miblo_decrement_time_stamp_minute, 0), false, "miblo_decrement_time_stamp_minute", 33, "Decrement a time stamp under the cursor by one minute. (format [m]m:ss or h:mm:ss", 81, "w:\\4ed\\code\\custom\\4coder_miblo_numbers.cpp", 43, 249 },
{ PROC_LINKS(profile_inspect, 0), true, "profile_inspect", 15, "Inspect all currently collected profiling information in 4coder's self profiler.", 80, "w:\\4ed\\code\\custom\\4coder_profile_inspect.cpp", 45, 779 },
{ PROC_LINKS(kill_tutorial, 0), false, "kill_tutorial", 13, "If there is an active tutorial, kill it.", 40, "w:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 9 },
{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "w:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 801 },
{ PROC_LINKS(hms_demo_tutorial, 0), false, "hms_demo_tutorial", 17, "Tutorial for built in 4coder bindings and features.", 51, "w:\\4ed\\code\\custom\\4coder_tutorial.cpp", 38, 821 },
{ PROC_LINKS(default_startup, 0), false, "default_startup", 15, "Default command for responding to a startup event", 49, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 7 },
{ PROC_LINKS(default_try_exit, 0), false, "default_try_exit", 16, "Default command for responding to a try-exit event", 50, "w:\\4ed\\code\\custom\\4coder_default_hooks.cpp", 43, 22 },
};
@ -540,135 +542,136 @@ static i32 fcoder_metacmd_ID_decrease_face_size = 81;
static i32 fcoder_metacmd_ID_mouse_wheel_change_face_size = 82;
static i32 fcoder_metacmd_ID_toggle_show_whitespace = 83;
static i32 fcoder_metacmd_ID_toggle_line_numbers = 84;
static i32 fcoder_metacmd_ID_exit_4coder = 85;
static i32 fcoder_metacmd_ID_goto_line = 86;
static i32 fcoder_metacmd_ID_search = 87;
static i32 fcoder_metacmd_ID_reverse_search = 88;
static i32 fcoder_metacmd_ID_search_identifier = 89;
static i32 fcoder_metacmd_ID_reverse_search_identifier = 90;
static i32 fcoder_metacmd_ID_replace_in_range = 91;
static i32 fcoder_metacmd_ID_replace_in_buffer = 92;
static i32 fcoder_metacmd_ID_replace_in_all_buffers = 93;
static i32 fcoder_metacmd_ID_query_replace = 94;
static i32 fcoder_metacmd_ID_query_replace_identifier = 95;
static i32 fcoder_metacmd_ID_query_replace_selection = 96;
static i32 fcoder_metacmd_ID_save_all_dirty_buffers = 97;
static i32 fcoder_metacmd_ID_delete_file_query = 98;
static i32 fcoder_metacmd_ID_save_to_query = 99;
static i32 fcoder_metacmd_ID_rename_file_query = 100;
static i32 fcoder_metacmd_ID_make_directory_query = 101;
static i32 fcoder_metacmd_ID_move_line_up = 102;
static i32 fcoder_metacmd_ID_move_line_down = 103;
static i32 fcoder_metacmd_ID_duplicate_line = 104;
static i32 fcoder_metacmd_ID_delete_line = 105;
static i32 fcoder_metacmd_ID_open_file_in_quotes = 106;
static i32 fcoder_metacmd_ID_open_matching_file_cpp = 107;
static i32 fcoder_metacmd_ID_view_buffer_other_panel = 108;
static i32 fcoder_metacmd_ID_swap_panels = 109;
static i32 fcoder_metacmd_ID_kill_buffer = 110;
static i32 fcoder_metacmd_ID_save = 111;
static i32 fcoder_metacmd_ID_reopen = 112;
static i32 fcoder_metacmd_ID_undo = 113;
static i32 fcoder_metacmd_ID_redo = 114;
static i32 fcoder_metacmd_ID_undo_all_buffers = 115;
static i32 fcoder_metacmd_ID_redo_all_buffers = 116;
static i32 fcoder_metacmd_ID_open_in_other = 117;
static i32 fcoder_metacmd_ID_default_file_externally_modified = 118;
static i32 fcoder_metacmd_ID_set_eol_mode_to_crlf = 119;
static i32 fcoder_metacmd_ID_set_eol_mode_to_lf = 120;
static i32 fcoder_metacmd_ID_set_eol_mode_to_binary = 121;
static i32 fcoder_metacmd_ID_set_eol_mode_from_contents = 122;
static i32 fcoder_metacmd_ID_interactive_switch_buffer = 123;
static i32 fcoder_metacmd_ID_interactive_kill_buffer = 124;
static i32 fcoder_metacmd_ID_interactive_open_or_new = 125;
static i32 fcoder_metacmd_ID_interactive_new = 126;
static i32 fcoder_metacmd_ID_interactive_open = 127;
static i32 fcoder_metacmd_ID_command_lister = 128;
static i32 fcoder_metacmd_ID_auto_indent_whole_file = 129;
static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 130;
static i32 fcoder_metacmd_ID_auto_indent_range = 131;
static i32 fcoder_metacmd_ID_write_text_and_auto_indent = 132;
static i32 fcoder_metacmd_ID_list_all_locations = 133;
static i32 fcoder_metacmd_ID_list_all_substring_locations = 134;
static i32 fcoder_metacmd_ID_list_all_locations_case_insensitive = 135;
static i32 fcoder_metacmd_ID_list_all_substring_locations_case_insensitive = 136;
static i32 fcoder_metacmd_ID_list_all_locations_of_identifier = 137;
static i32 fcoder_metacmd_ID_list_all_locations_of_identifier_case_insensitive = 138;
static i32 fcoder_metacmd_ID_list_all_locations_of_selection = 139;
static i32 fcoder_metacmd_ID_list_all_locations_of_selection_case_insensitive = 140;
static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition = 141;
static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition_of_identifier = 142;
static i32 fcoder_metacmd_ID_word_complete = 143;
static i32 fcoder_metacmd_ID_word_complete_drop_down = 144;
static i32 fcoder_metacmd_ID_goto_jump_at_cursor = 145;
static i32 fcoder_metacmd_ID_goto_jump_at_cursor_same_panel = 146;
static i32 fcoder_metacmd_ID_goto_next_jump = 147;
static i32 fcoder_metacmd_ID_goto_prev_jump = 148;
static i32 fcoder_metacmd_ID_goto_next_jump_no_skips = 149;
static i32 fcoder_metacmd_ID_goto_prev_jump_no_skips = 150;
static i32 fcoder_metacmd_ID_goto_first_jump = 151;
static i32 fcoder_metacmd_ID_goto_first_jump_same_panel_sticky = 152;
static i32 fcoder_metacmd_ID_if_read_only_goto_position = 153;
static i32 fcoder_metacmd_ID_if_read_only_goto_position_same_panel = 154;
static i32 fcoder_metacmd_ID_view_jump_list_with_lister = 155;
static i32 fcoder_metacmd_ID_show_the_log_graph = 156;
static i32 fcoder_metacmd_ID_copy = 157;
static i32 fcoder_metacmd_ID_cut = 158;
static i32 fcoder_metacmd_ID_paste = 159;
static i32 fcoder_metacmd_ID_paste_next = 160;
static i32 fcoder_metacmd_ID_paste_and_indent = 161;
static i32 fcoder_metacmd_ID_paste_next_and_indent = 162;
static i32 fcoder_metacmd_ID_execute_previous_cli = 163;
static i32 fcoder_metacmd_ID_execute_any_cli = 164;
static i32 fcoder_metacmd_ID_build_search = 165;
static i32 fcoder_metacmd_ID_build_in_build_panel = 166;
static i32 fcoder_metacmd_ID_close_build_panel = 167;
static i32 fcoder_metacmd_ID_change_to_build_panel = 168;
static i32 fcoder_metacmd_ID_close_all_code = 169;
static i32 fcoder_metacmd_ID_open_all_code = 170;
static i32 fcoder_metacmd_ID_open_all_code_recursive = 171;
static i32 fcoder_metacmd_ID_load_project = 172;
static i32 fcoder_metacmd_ID_project_fkey_command = 173;
static i32 fcoder_metacmd_ID_project_go_to_root_directory = 174;
static i32 fcoder_metacmd_ID_setup_new_project = 175;
static i32 fcoder_metacmd_ID_setup_build_bat = 176;
static i32 fcoder_metacmd_ID_setup_build_sh = 177;
static i32 fcoder_metacmd_ID_setup_build_bat_and_sh = 178;
static i32 fcoder_metacmd_ID_project_command_lister = 179;
static i32 fcoder_metacmd_ID_list_all_functions_current_buffer = 180;
static i32 fcoder_metacmd_ID_list_all_functions_current_buffer_lister = 181;
static i32 fcoder_metacmd_ID_list_all_functions_all_buffers = 182;
static i32 fcoder_metacmd_ID_list_all_functions_all_buffers_lister = 183;
static i32 fcoder_metacmd_ID_select_surrounding_scope = 184;
static i32 fcoder_metacmd_ID_select_surrounding_scope_maximal = 185;
static i32 fcoder_metacmd_ID_select_next_scope_absolute = 186;
static i32 fcoder_metacmd_ID_select_next_scope_after_current = 187;
static i32 fcoder_metacmd_ID_select_prev_scope_absolute = 188;
static i32 fcoder_metacmd_ID_select_prev_top_most_scope = 189;
static i32 fcoder_metacmd_ID_place_in_scope = 190;
static i32 fcoder_metacmd_ID_delete_current_scope = 191;
static i32 fcoder_metacmd_ID_open_long_braces = 192;
static i32 fcoder_metacmd_ID_open_long_braces_semicolon = 193;
static i32 fcoder_metacmd_ID_open_long_braces_break = 194;
static i32 fcoder_metacmd_ID_if0_off = 195;
static i32 fcoder_metacmd_ID_write_todo = 196;
static i32 fcoder_metacmd_ID_write_hack = 197;
static i32 fcoder_metacmd_ID_write_note = 198;
static i32 fcoder_metacmd_ID_write_block = 199;
static i32 fcoder_metacmd_ID_write_zero_struct = 200;
static i32 fcoder_metacmd_ID_comment_line = 201;
static i32 fcoder_metacmd_ID_uncomment_line = 202;
static i32 fcoder_metacmd_ID_comment_line_toggle = 203;
static i32 fcoder_metacmd_ID_snippet_lister = 204;
static i32 fcoder_metacmd_ID_miblo_increment_basic = 205;
static i32 fcoder_metacmd_ID_miblo_decrement_basic = 206;
static i32 fcoder_metacmd_ID_miblo_increment_time_stamp = 207;
static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp = 208;
static i32 fcoder_metacmd_ID_miblo_increment_time_stamp_minute = 209;
static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp_minute = 210;
static i32 fcoder_metacmd_ID_profile_inspect = 211;
static i32 fcoder_metacmd_ID_kill_tutorial = 212;
static i32 fcoder_metacmd_ID_hms_demo_tutorial = 213;
static i32 fcoder_metacmd_ID_default_startup = 214;
static i32 fcoder_metacmd_ID_default_try_exit = 215;
static i32 fcoder_metacmd_ID_toggle_line_wrap = 85;
static i32 fcoder_metacmd_ID_exit_4coder = 86;
static i32 fcoder_metacmd_ID_goto_line = 87;
static i32 fcoder_metacmd_ID_search = 88;
static i32 fcoder_metacmd_ID_reverse_search = 89;
static i32 fcoder_metacmd_ID_search_identifier = 90;
static i32 fcoder_metacmd_ID_reverse_search_identifier = 91;
static i32 fcoder_metacmd_ID_replace_in_range = 92;
static i32 fcoder_metacmd_ID_replace_in_buffer = 93;
static i32 fcoder_metacmd_ID_replace_in_all_buffers = 94;
static i32 fcoder_metacmd_ID_query_replace = 95;
static i32 fcoder_metacmd_ID_query_replace_identifier = 96;
static i32 fcoder_metacmd_ID_query_replace_selection = 97;
static i32 fcoder_metacmd_ID_save_all_dirty_buffers = 98;
static i32 fcoder_metacmd_ID_delete_file_query = 99;
static i32 fcoder_metacmd_ID_save_to_query = 100;
static i32 fcoder_metacmd_ID_rename_file_query = 101;
static i32 fcoder_metacmd_ID_make_directory_query = 102;
static i32 fcoder_metacmd_ID_move_line_up = 103;
static i32 fcoder_metacmd_ID_move_line_down = 104;
static i32 fcoder_metacmd_ID_duplicate_line = 105;
static i32 fcoder_metacmd_ID_delete_line = 106;
static i32 fcoder_metacmd_ID_open_file_in_quotes = 107;
static i32 fcoder_metacmd_ID_open_matching_file_cpp = 108;
static i32 fcoder_metacmd_ID_view_buffer_other_panel = 109;
static i32 fcoder_metacmd_ID_swap_panels = 110;
static i32 fcoder_metacmd_ID_kill_buffer = 111;
static i32 fcoder_metacmd_ID_save = 112;
static i32 fcoder_metacmd_ID_reopen = 113;
static i32 fcoder_metacmd_ID_undo = 114;
static i32 fcoder_metacmd_ID_redo = 115;
static i32 fcoder_metacmd_ID_undo_all_buffers = 116;
static i32 fcoder_metacmd_ID_redo_all_buffers = 117;
static i32 fcoder_metacmd_ID_open_in_other = 118;
static i32 fcoder_metacmd_ID_default_file_externally_modified = 119;
static i32 fcoder_metacmd_ID_set_eol_mode_to_crlf = 120;
static i32 fcoder_metacmd_ID_set_eol_mode_to_lf = 121;
static i32 fcoder_metacmd_ID_set_eol_mode_to_binary = 122;
static i32 fcoder_metacmd_ID_set_eol_mode_from_contents = 123;
static i32 fcoder_metacmd_ID_interactive_switch_buffer = 124;
static i32 fcoder_metacmd_ID_interactive_kill_buffer = 125;
static i32 fcoder_metacmd_ID_interactive_open_or_new = 126;
static i32 fcoder_metacmd_ID_interactive_new = 127;
static i32 fcoder_metacmd_ID_interactive_open = 128;
static i32 fcoder_metacmd_ID_command_lister = 129;
static i32 fcoder_metacmd_ID_auto_indent_whole_file = 130;
static i32 fcoder_metacmd_ID_auto_indent_line_at_cursor = 131;
static i32 fcoder_metacmd_ID_auto_indent_range = 132;
static i32 fcoder_metacmd_ID_write_text_and_auto_indent = 133;
static i32 fcoder_metacmd_ID_list_all_locations = 134;
static i32 fcoder_metacmd_ID_list_all_substring_locations = 135;
static i32 fcoder_metacmd_ID_list_all_locations_case_insensitive = 136;
static i32 fcoder_metacmd_ID_list_all_substring_locations_case_insensitive = 137;
static i32 fcoder_metacmd_ID_list_all_locations_of_identifier = 138;
static i32 fcoder_metacmd_ID_list_all_locations_of_identifier_case_insensitive = 139;
static i32 fcoder_metacmd_ID_list_all_locations_of_selection = 140;
static i32 fcoder_metacmd_ID_list_all_locations_of_selection_case_insensitive = 141;
static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition = 142;
static i32 fcoder_metacmd_ID_list_all_locations_of_type_definition_of_identifier = 143;
static i32 fcoder_metacmd_ID_word_complete = 144;
static i32 fcoder_metacmd_ID_word_complete_drop_down = 145;
static i32 fcoder_metacmd_ID_goto_jump_at_cursor = 146;
static i32 fcoder_metacmd_ID_goto_jump_at_cursor_same_panel = 147;
static i32 fcoder_metacmd_ID_goto_next_jump = 148;
static i32 fcoder_metacmd_ID_goto_prev_jump = 149;
static i32 fcoder_metacmd_ID_goto_next_jump_no_skips = 150;
static i32 fcoder_metacmd_ID_goto_prev_jump_no_skips = 151;
static i32 fcoder_metacmd_ID_goto_first_jump = 152;
static i32 fcoder_metacmd_ID_goto_first_jump_same_panel_sticky = 153;
static i32 fcoder_metacmd_ID_if_read_only_goto_position = 154;
static i32 fcoder_metacmd_ID_if_read_only_goto_position_same_panel = 155;
static i32 fcoder_metacmd_ID_view_jump_list_with_lister = 156;
static i32 fcoder_metacmd_ID_show_the_log_graph = 157;
static i32 fcoder_metacmd_ID_copy = 158;
static i32 fcoder_metacmd_ID_cut = 159;
static i32 fcoder_metacmd_ID_paste = 160;
static i32 fcoder_metacmd_ID_paste_next = 161;
static i32 fcoder_metacmd_ID_paste_and_indent = 162;
static i32 fcoder_metacmd_ID_paste_next_and_indent = 163;
static i32 fcoder_metacmd_ID_execute_previous_cli = 164;
static i32 fcoder_metacmd_ID_execute_any_cli = 165;
static i32 fcoder_metacmd_ID_build_search = 166;
static i32 fcoder_metacmd_ID_build_in_build_panel = 167;
static i32 fcoder_metacmd_ID_close_build_panel = 168;
static i32 fcoder_metacmd_ID_change_to_build_panel = 169;
static i32 fcoder_metacmd_ID_close_all_code = 170;
static i32 fcoder_metacmd_ID_open_all_code = 171;
static i32 fcoder_metacmd_ID_open_all_code_recursive = 172;
static i32 fcoder_metacmd_ID_load_project = 173;
static i32 fcoder_metacmd_ID_project_fkey_command = 174;
static i32 fcoder_metacmd_ID_project_go_to_root_directory = 175;
static i32 fcoder_metacmd_ID_setup_new_project = 176;
static i32 fcoder_metacmd_ID_setup_build_bat = 177;
static i32 fcoder_metacmd_ID_setup_build_sh = 178;
static i32 fcoder_metacmd_ID_setup_build_bat_and_sh = 179;
static i32 fcoder_metacmd_ID_project_command_lister = 180;
static i32 fcoder_metacmd_ID_list_all_functions_current_buffer = 181;
static i32 fcoder_metacmd_ID_list_all_functions_current_buffer_lister = 182;
static i32 fcoder_metacmd_ID_list_all_functions_all_buffers = 183;
static i32 fcoder_metacmd_ID_list_all_functions_all_buffers_lister = 184;
static i32 fcoder_metacmd_ID_select_surrounding_scope = 185;
static i32 fcoder_metacmd_ID_select_surrounding_scope_maximal = 186;
static i32 fcoder_metacmd_ID_select_next_scope_absolute = 187;
static i32 fcoder_metacmd_ID_select_next_scope_after_current = 188;
static i32 fcoder_metacmd_ID_select_prev_scope_absolute = 189;
static i32 fcoder_metacmd_ID_select_prev_top_most_scope = 190;
static i32 fcoder_metacmd_ID_place_in_scope = 191;
static i32 fcoder_metacmd_ID_delete_current_scope = 192;
static i32 fcoder_metacmd_ID_open_long_braces = 193;
static i32 fcoder_metacmd_ID_open_long_braces_semicolon = 194;
static i32 fcoder_metacmd_ID_open_long_braces_break = 195;
static i32 fcoder_metacmd_ID_if0_off = 196;
static i32 fcoder_metacmd_ID_write_todo = 197;
static i32 fcoder_metacmd_ID_write_hack = 198;
static i32 fcoder_metacmd_ID_write_note = 199;
static i32 fcoder_metacmd_ID_write_block = 200;
static i32 fcoder_metacmd_ID_write_zero_struct = 201;
static i32 fcoder_metacmd_ID_comment_line = 202;
static i32 fcoder_metacmd_ID_uncomment_line = 203;
static i32 fcoder_metacmd_ID_comment_line_toggle = 204;
static i32 fcoder_metacmd_ID_snippet_lister = 205;
static i32 fcoder_metacmd_ID_miblo_increment_basic = 206;
static i32 fcoder_metacmd_ID_miblo_decrement_basic = 207;
static i32 fcoder_metacmd_ID_miblo_increment_time_stamp = 208;
static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp = 209;
static i32 fcoder_metacmd_ID_miblo_increment_time_stamp_minute = 210;
static i32 fcoder_metacmd_ID_miblo_decrement_time_stamp_minute = 211;
static i32 fcoder_metacmd_ID_profile_inspect = 212;
static i32 fcoder_metacmd_ID_kill_tutorial = 213;
static i32 fcoder_metacmd_ID_hms_demo_tutorial = 214;
static i32 fcoder_metacmd_ID_default_startup = 215;
static i32 fcoder_metacmd_ID_default_try_exit = 216;
#endif