4coder/4coder_default_include.cpp

622 lines
21 KiB
C++
Raw Normal View History

/*
4coder_default_include.cpp - Default set of commands and setup used in 4coder.
TYPE: 'major-system-include'
*/
2016-06-28 22:58:50 +00:00
// TOP
#if !defined(FCODER_DEFAULT_INCLUDE_CPP)
#define FCODER_DEFAULT_INCLUDE_CPP
#include "4coder_API/custom.h"
#include "4coder_default_framework.h"
#include "4coder_base_commands.cpp"
#include "4coder_auto_indent.cpp"
#include "4coder_search.cpp"
#include "4coder_jump_direct.cpp"
#include "4coder_jump_sticky.cpp"
#include "4coder_clipboard.cpp"
#include "4coder_system_command.cpp"
#include "4coder_build_commands.cpp"
#include "4coder_project_commands.cpp"
#include "4coder_function_list.cpp"
2016-05-27 14:51:12 +00:00
// NOTE(allen): Define USE_OLD_STYLE_JUMPS before 4coder_default_include.cpp to get
// the direct jumps (instead of sticky jumps).
#if defined(USE_OLD_STYLE_JUMPS)
#define goto_jump_at_cursor CUSTOM_ALIAS(goto_jump_at_cursor_direct)
#define goto_jump_at_cursor_same_panel CUSTOM_ALIAS(goto_jump_at_cursor_same_panel_direct)
#define goto_next_jump CUSTOM_ALIAS(goto_next_jump_direct)
#define goto_prev_jump CUSTOM_ALIAS(goto_prev_jump_direct)
#define goto_next_jump_no_skips CUSTOM_ALIAS(goto_next_jump_no_skips_direct)
#define goto_prev_jump_no_skips CUSTOM_ALIAS(goto_prev_jump_no_skips_direct)
#define goto_first_jump CUSTOM_ALIAS(goto_first_jump_direct)
#define newline_or_goto_position CUSTOM_ALIAS(newline_or_goto_position_direct)
#define newline_or_goto_position_same_panel CUSTOM_ALIAS(newline_or_goto_position_same_panel_direct)
#else
#define goto_jump_at_cursor CUSTOM_ALIAS(goto_jump_at_cursor_sticky)
#define goto_jump_at_cursor_same_panel CUSTOM_ALIAS(goto_jump_at_cursor_same_panel_sticky)
#define goto_next_jump CUSTOM_ALIAS(goto_next_jump_sticky)
#define goto_prev_jump CUSTOM_ALIAS(goto_prev_jump_sticky)
#define goto_next_jump_no_skips CUSTOM_ALIAS(goto_next_jump_no_skips_sticky)
#define goto_prev_jump_no_skips CUSTOM_ALIAS(goto_prev_jump_no_skips_sticky)
#define goto_first_jump CUSTOM_ALIAS(goto_first_jump_sticky)
#define newline_or_goto_position CUSTOM_ALIAS(newline_or_goto_position_sticky)
#define newline_or_goto_position_same_panel CUSTOM_ALIAS(newline_or_goto_position_same_panel_sticky)
2017-05-29 18:43:59 +00:00
#endif
2017-05-27 20:04:13 +00:00
#define seek_error CUSTOM_ALIAS(seek_jump)
#define goto_next_error CUSTOM_ALIAS(goto_next_jump)
#define goto_prev_error CUSTOM_ALIAS(goto_prev_jump)
#define goto_next_error_no_skips CUSTOM_ALIAS(goto_next_jump_no_skips)
#define goto_prev_error_no_skips CUSTOM_ALIAS(goto_prev_jump_no_skips)
#define goto_first_error CUSTOM_ALIAS(goto_first_jump)
#include "4coder_default_hooks.cpp"
#include "4coder_helper/4coder_bind_helper.h"
#include "4coder_helper/4coder_helper.h"
#include "4coder_helper/4coder_streaming.h"
#include "4coder_helper/4coder_long_seek.h"
#define FSTRING_IMPLEMENTATION
#include "4coder_lib/4coder_string.h"
#include "4coder_lib/4coder_table.h"
#include "4coder_lib/4coder_mem.h"
2017-02-18 01:04:41 +00:00
#include "4coder_lib/4coder_utf8.h"
#include "4coder_lib/4cpp_lexer.h"
//
// Seeks Using Default Framework Memory
//
static int32_t
buffer_boundary_seek(Application_Links *app, Buffer_Summary *buffer, int32_t start_pos, bool32 seek_forward, Seek_Boundary_Flag flags){
int32_t result = buffer_boundary_seek(app, buffer, &global_part, start_pos, seek_forward, flags);
return(result);
}
static void
2017-03-29 16:32:06 +00:00
basic_seek(Application_Links *app, bool32 seek_forward, uint32_t flags){
View_Summary view = get_active_view(app, AccessProtected);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessProtected);
int32_t pos = buffer_boundary_seek(app, &buffer, view.cursor.pos, seek_forward, flags);
view_set_cursor(app, &view, seek_pos(pos), true);
2016-07-11 16:15:37 +00:00
}
#define right true
#define left false
2016-09-15 15:01:52 +00:00
CUSTOM_COMMAND_SIG(seek_whitespace_right)
CUSTOM_DOC("Seek right for the next boundary between whitespace and non-whitespace.")
{ basic_seek(app, right, BoundaryWhitespace); }
CUSTOM_COMMAND_SIG(seek_whitespace_left)
CUSTOM_DOC("Seek left for the next boundary between whitespace and non-whitespace.")
{ basic_seek(app, left, BoundaryWhitespace); }
CUSTOM_COMMAND_SIG(seek_token_right)
CUSTOM_DOC("Seek right for the next end of a token.")
{ basic_seek(app, right, BoundaryToken); }
CUSTOM_COMMAND_SIG(seek_token_left)
CUSTOM_DOC("Seek left for the next beginning of a token.")
{ basic_seek(app, left, BoundaryToken); }
CUSTOM_COMMAND_SIG(seek_white_or_token_right)
CUSTOM_DOC("Seek right for the next end of a token or boundary between whitespace and non-whitespace.")
{basic_seek(app, right, BoundaryToken | BoundaryWhitespace);}
CUSTOM_COMMAND_SIG(seek_white_or_token_left)
CUSTOM_DOC("Seek left for the next end of a token or boundary between whitespace and non-whitespace.")
{basic_seek(app, left, BoundaryToken | BoundaryWhitespace);}
CUSTOM_COMMAND_SIG(seek_alphanumeric_right)
CUSTOM_DOC("Seek right for boundary between alphanumeric characters and non-alphanumeric characters.")
{ basic_seek(app, right, BoundaryAlphanumeric); }
CUSTOM_COMMAND_SIG(seek_alphanumeric_left)
CUSTOM_DOC("Seek left for boundary between alphanumeric characters and non-alphanumeric characters.")
{ basic_seek(app, left, BoundaryAlphanumeric); }
CUSTOM_COMMAND_SIG(seek_alphanumeric_or_camel_right)
CUSTOM_DOC("Seek right for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.")
{ basic_seek(app, right, BoundaryAlphanumeric | BoundaryCamelCase); }
CUSTOM_COMMAND_SIG(seek_alphanumeric_or_camel_left)
CUSTOM_DOC("Seek left for boundary between alphanumeric characters or camel case word and non-alphanumeric characters.")
{ basic_seek(app, left, BoundaryAlphanumeric | BoundaryCamelCase); }
2016-09-15 15:01:52 +00:00
#undef right
#undef left
//
// Fast Deletes
//
CUSTOM_COMMAND_SIG(backspace_word)
CUSTOM_DOC("Delete characters between the cursor position and the first alphanumeric boundary to the left.")
{
uint32_t access = AccessOpen;
View_Summary view = get_active_view(app, access);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, access);
if (buffer.exists){
int32_t pos2 = 0, pos1 = 0;
pos2 = view.cursor.pos;
exec_command(app, seek_alphanumeric_left);
refresh_view(app, &view);
pos1 = view.cursor.pos;
buffer_replace_range(app, &buffer, pos1, pos2, 0, 0);
2016-09-15 15:01:52 +00:00
}
}
CUSTOM_COMMAND_SIG(delete_word)
CUSTOM_DOC("Delete characters between the cursor position and the first alphanumeric boundary to the right.")
{
uint32_t access = AccessOpen;
View_Summary view = get_active_view(app, access);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, access);
if (buffer.exists){
int32_t pos2 = 0, pos1 = 0;
pos1 = view.cursor.pos;
exec_command(app, seek_alphanumeric_right);
refresh_view(app, &view);
pos2 = view.cursor.pos;
buffer_replace_range(app, &buffer, pos1, pos2, 0, 0);
}
}
CUSTOM_COMMAND_SIG(snipe_token_or_word)
CUSTOM_DOC("Delete a single, whole token on or to the left of the cursor.")
{
uint32_t access = AccessOpen;
View_Summary view = get_active_view(app, access);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, access);
2017-11-07 21:35:26 +00:00
int32_t pos1 = buffer_boundary_seek(app, &buffer, view.cursor.pos, false, BoundaryToken | BoundaryWhitespace);
int32_t pos2 = buffer_boundary_seek(app, &buffer, pos1, true, BoundaryToken | BoundaryWhitespace);
Range range = make_range(pos1, pos2);
buffer_replace_range(app, &buffer, range.start, range.end, 0, 0);
}
CUSTOM_COMMAND_SIG(snipe_token_or_word_right)
CUSTOM_DOC("Delete a single, whole token on or to the right of the cursor.")
{
2017-11-07 21:35:26 +00:00
uint32_t access = AccessOpen;
View_Summary view = get_active_view(app, access);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, access);
int32_t pos2 = buffer_boundary_seek(app, &buffer, view.cursor.pos, true, BoundaryToken | BoundaryWhitespace);
int32_t pos1 = buffer_boundary_seek(app, &buffer, pos2, false, BoundaryToken | BoundaryWhitespace);
Range range = make_range(pos1, pos2);
buffer_replace_range(app, &buffer, range.start, range.end, 0, 0);
}
//
// Line Manipulation
//
CUSTOM_COMMAND_SIG(duplicate_line)
CUSTOM_DOC("Create a copy of the line on which the cursor sits.")
{
View_Summary view = get_active_view(app, AccessOpen);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessOpen);
Partition *part = &global_part;
Temp_Memory temp = begin_temp_memory(part);
String line_string = {0};
read_line(app, part, &buffer, view.cursor.line, &line_string);
push_array(part, char, 1);
++line_string.memory_size;
append_s_char(&line_string, '\n');
int32_t pos = buffer_get_line_end(app, &buffer, view.cursor.line) + 1;
buffer_replace_range(app, &buffer, pos, pos, line_string.str, line_string.size);
end_temp_memory(temp);
}
CUSTOM_COMMAND_SIG(delete_line)
CUSTOM_DOC("Delete the line the on which the cursor sits.")
{
View_Summary view = get_active_view(app, AccessOpen);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessOpen);
Partition *part = &global_part;
Temp_Memory temp = begin_temp_memory(part);
int32_t start = buffer_get_line_start(app, &buffer, view.cursor.line);
int32_t end = buffer_get_line_end(app, &buffer, view.cursor.line) + 1;
buffer_replace_range(app, &buffer, start, end, 0, 0);
end_temp_memory(temp);
}
//
// Clipboard + Indent Combo Command
//
CUSTOM_COMMAND_SIG(paste_and_indent)
CUSTOM_DOC("Paste from the top of clipboard and run auto-indent on the newly pasted text.")
{
exec_command(app, paste);
exec_command(app, auto_tab_range);
}
CUSTOM_COMMAND_SIG(paste_next_and_indent)
CUSTOM_DOC("Paste the next item on the clipboard and run auto-indent on the newly pasted text.")
{
exec_command(app, paste_next);
exec_command(app, auto_tab_range);
}
//
// Combined Write Commands
//
2016-10-25 02:45:34 +00:00
static void
write_string(Application_Links *app, View_Summary *view, Buffer_Summary *buffer, String string){
buffer_replace_range(app, buffer, view->cursor.pos, view->cursor.pos, string.str, string.size);
view_set_cursor(app, view, seek_pos(view->cursor.pos + string.size), 1);
}
static void
write_string(Application_Links *app, String string){
2016-08-29 01:03:26 +00:00
uint32_t access = AccessOpen;
2016-09-17 00:03:09 +00:00
View_Summary view = get_active_view(app, access);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, access);
2016-10-25 02:45:34 +00:00
write_string(app, &view, &buffer, string);
}
static void
2016-08-29 01:03:26 +00:00
long_braces(Application_Links *app, char *text, int32_t size){
uint32_t access = AccessOpen;
2016-09-17 00:03:09 +00:00
View_Summary view = get_active_view(app, access);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, access);
int32_t pos = view.cursor.pos;
2016-09-17 00:03:09 +00:00
buffer_replace_range(app, &buffer, pos, pos, text, size);
view_set_cursor(app, &view, seek_pos(pos + 2), true);
2016-12-18 20:42:11 +00:00
buffer_auto_indent(app, &buffer, pos, pos + size, DEF_TAB_WIDTH, DEFAULT_INDENT_FLAGS | AutoIndent_FullTokens);
2016-06-24 03:11:24 +00:00
move_past_lead_whitespace(app, &view, &buffer);
}
CUSTOM_COMMAND_SIG(open_long_braces)
CUSTOM_DOC("At the cursor, insert a '{' and '}' separated by a blank line.")
{
char text[] = "{\n\n}";
2016-08-29 01:03:26 +00:00
int32_t size = sizeof(text) - 1;
long_braces(app, text, size);
}
CUSTOM_COMMAND_SIG(open_long_braces_semicolon)
CUSTOM_DOC("At the cursor, insert a '{' and '};' separated by a blank line.")
{
char text[] = "{\n\n};";
2016-08-29 01:03:26 +00:00
int32_t size = sizeof(text) - 1;
long_braces(app, text, size);
}
CUSTOM_COMMAND_SIG(open_long_braces_break)
CUSTOM_DOC("At the cursor, insert a '{' and '}break;' separated by a blank line.")
{
char text[] = "{\n\n}break;";
2016-08-29 01:03:26 +00:00
int32_t size = sizeof(text) - 1;
long_braces(app, text, size);
}
CUSTOM_COMMAND_SIG(if0_off)
CUSTOM_DOC("Surround the range between the cursor and mark with an '#if 0' and an '#endif'")
{
char text1[] = "\n#if 0";
2016-08-29 01:03:26 +00:00
int32_t size1 = sizeof(text1) - 1;
2016-06-21 14:00:07 +00:00
char text2[] = "#endif\n";
2016-08-29 01:03:26 +00:00
int32_t size2 = sizeof(text2) - 1;
2016-06-21 14:00:07 +00:00
2016-09-17 00:03:09 +00:00
View_Summary view = get_active_view(app, AccessOpen);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessOpen);
2016-06-10 15:19:29 +00:00
Range range = get_range(&view);
2016-06-10 15:19:29 +00:00
if (range.min < range.max){
Buffer_Edit edits[2];
char *str = 0;
char *base = (char*)partition_current(&global_part);
str = push_array(&global_part, char, size1);
memcpy(str, text1, size1);
2016-08-29 01:03:26 +00:00
edits[0].str_start = (int32_t)(str - base);
edits[0].len = size1;
edits[0].start = range.min;
edits[0].end = range.min;
str = push_array(&global_part, char, size2);
memcpy(str, text2, size2);
2016-08-29 01:03:26 +00:00
edits[1].str_start = (int32_t)(str - base);
edits[1].len = size2;
edits[1].start = range.max;
edits[1].end = range.max;
buffer_batch_edit(app, &buffer, base, global_part.pos, edits, ArrayCount(edits), BatchEdit_Normal);
2016-09-17 00:03:09 +00:00
view = get_view(app, view.view_id, AccessAll);
if (view.cursor.pos > view.mark.pos){
2016-12-18 20:42:11 +00:00
view_set_cursor(app, &view, seek_line_char(view.cursor.line+1, view.cursor.character), 1);
}
else{
2016-12-18 20:42:11 +00:00
view_set_mark(app, &view, seek_line_char(view.mark.line+1, view.mark.character));
}
range = get_range(&view);
2016-12-18 20:42:11 +00:00
buffer_auto_indent(app, &buffer, range.min, range.max, DEF_TAB_WIDTH, DEFAULT_INDENT_FLAGS | AutoIndent_FullTokens);
move_past_lead_whitespace(app, &view, &buffer);
}
}
2017-07-11 21:41:25 +00:00
static void
write_named_comment_string(Application_Links *app, char *type_string){
char space[512];
String str = make_fixed_width_string(space);
2016-06-20 20:34:48 +00:00
char *name = 0;
int32_t name_len = 0;
if (get_current_name(&name, &name_len)){
2017-07-11 21:41:25 +00:00
append(&str, "// ");
append(&str, type_string);
append(&str, "(");
append(&str, make_string(name, name_len));
append(&str, "): ");
}
else{
2017-07-11 21:41:25 +00:00
append(&str, "// ");
append(&str, type_string);
append(&str, ": ");
}
write_string(app, str);
}
CUSTOM_COMMAND_SIG(write_todo)
CUSTOM_DOC("At the cursor, insert a '// TODO' comment, includes user name if it was specified in config.4coder.")
{
2017-07-11 21:41:25 +00:00
write_named_comment_string(app, "TODO");
}
CUSTOM_COMMAND_SIG(write_hack)
CUSTOM_DOC("At the cursor, insert a '// HACK' comment, includes user name if it was specified in config.4coder.")
{
2017-07-11 21:41:25 +00:00
write_named_comment_string(app, "HACK");
}
CUSTOM_COMMAND_SIG(write_note)
CUSTOM_DOC("At the cursor, insert a '// NOTE' comment, includes user name if it was specified in config.4coder.")
{
2017-07-11 21:41:25 +00:00
write_named_comment_string(app, "NOTE");
}
CUSTOM_COMMAND_SIG(write_block)
CUSTOM_DOC("At the cursor, insert a block comment.")
{
write_string(app, make_lit_string("/* */"));
}
CUSTOM_COMMAND_SIG(write_zero_struct)
CUSTOM_DOC("At the cursor, insert a ' = {0};'.")
{
write_string(app, make_lit_string(" = {0};"));
}
//
// Open File In Quotes
//
static bool32
file_name_in_quotes(Application_Links *app, String *file_name){
bool32 result = false;
uint32_t access = AccessProtected;
2016-06-20 20:34:48 +00:00
View_Summary view = get_active_view(app, access);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, access);
if (buffer.file_name != 0){
int32_t pos = view.cursor.pos;
int32_t start = 0, end = 0;
buffer_seek_delimiter_forward(app, &buffer, pos, '"', &end);
buffer_seek_delimiter_backward(app, &buffer, pos, '"', &start);
++start;
int32_t size = end - start;
char short_file_name[128];
// NOTE(allen): This check is necessary because buffer_read_range
// requiers that the output buffer you provide is at least (end - start) bytes long.
if (size < sizeof(short_file_name)){
if (buffer_read_range(app, &buffer, start, end, short_file_name)){
result = true;
copy_ss(file_name, make_string(buffer.file_name, buffer.file_name_len));
remove_last_folder(file_name);
append_ss(file_name, make_string(short_file_name, size));
}
}
}
2016-06-20 20:34:48 +00:00
return(result);
}
CUSTOM_COMMAND_SIG(open_file_in_quotes)
CUSTOM_DOC("Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.")
{
char file_name_[256];
String file_name = make_fixed_width_string(file_name_);
2016-06-20 20:34:48 +00:00
if (file_name_in_quotes(app, &file_name)){
exec_command(app, change_active_panel);
View_Summary view = get_active_view(app, AccessAll);
view_open_file(app, &view, expand_str(file_name), true);
}
}
CUSTOM_COMMAND_SIG(open_in_other)
CUSTOM_DOC("Reads a filename from surrounding '\"' characters and attempts to open the corresponding file, displaying it in the other view.")
{
exec_command(app, change_active_panel);
exec_command(app, interactive_open_or_new);
}
2017-02-06 13:49:00 +00:00
//
// File Navigating
//
static bool32
get_cpp_matching_file(Application_Links *app, Buffer_Summary buffer, Buffer_Summary *buffer_out){
bool32 result = false;
if (buffer.file_name != 0){
char space[512];
String file_name = make_string_cap(space, 0, sizeof(space));
append(&file_name, make_string(buffer.file_name, buffer.file_name_len));
String extension = file_extension(file_name);
String new_extensions[2] = {0};
int32_t new_extensions_count = 0;
if (match(extension, "cpp") || match(extension, "cc")){
new_extensions[0] = make_lit_string("h");
new_extensions[1] = make_lit_string("hpp");
new_extensions_count = 2;
}
else if (match(extension, "c")){
new_extensions[0] = make_lit_string("h");
new_extensions_count = 1;
}
else if (match(extension, "h")){
new_extensions[0] = make_lit_string("c");
new_extensions[1] = make_lit_string("cpp");
new_extensions_count = 2;
}
else if (match(extension, "hpp")){
new_extensions[0] = make_lit_string("cpp");
new_extensions_count = 1;
}
2017-02-06 13:49:00 +00:00
remove_extension(&file_name);
int32_t base_pos = file_name.size;
for (int32_t i = 0; i < new_extensions_count; ++i){
String ext = new_extensions[i];
file_name.size = base_pos;
append(&file_name, ext);
if (open_file(app, buffer_out, file_name.str, file_name.size, false, true)){
result = true;
break;
}
2017-02-06 13:49:00 +00:00
}
}
return(result);
}
CUSTOM_COMMAND_SIG(open_matching_file_cpp)
CUSTOM_DOC("If the current file is a *.cpp or *.h, attempts to open the corresponding *.h or *.cpp file in the other view.")
{
2017-02-06 13:49:00 +00:00
View_Summary view = get_active_view(app, AccessAll);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessAll);
Buffer_Summary new_buffer = {0};
if (get_cpp_matching_file(app, buffer, &new_buffer)){
get_view_next_looped(app, &view, AccessAll);
view_set_buffer(app, &view, new_buffer.buffer_id, 0);
set_active_view(app, &view);
}
}
//
// Execute Arbitrary Command
2016-09-01 19:40:25 +00:00
//
CUSTOM_COMMAND_SIG(execute_arbitrary_command)
CUSTOM_DOC("Execute a 'long form' command.")
{
// NOTE(allen): This isn't a super powerful version of this command, I will expand
// upon it so that it has all the cmdid_* commands by default. However, with this
// as an example you have everything you need to make it work already. You could
// even use app->memory to create a hash table in the start hook.
Query_Bar bar = {0};
char space[1024];
bar.prompt = make_lit_string("Command: ");
bar.string = make_fixed_width_string(space);
2016-09-01 19:40:25 +00:00
if (!query_user_string(app, &bar)) return;
2016-09-01 19:40:25 +00:00
// NOTE(allen): Here I chose to end this query bar because when I call another
// command it might ALSO have query bars and I don't want this one hanging
// around at that point. Since the bar exists on my stack the result of the query
// is still available in bar.string though.
end_query_bar(app, &bar, 0);
2016-09-01 19:40:25 +00:00
if (match_ss(bar.string, make_lit_string("load project"))){
exec_command(app, load_project);
2016-09-01 19:40:25 +00:00
}
else if (match_ss(bar.string, make_lit_string("open all code"))){
exec_command(app, open_all_code);
2016-09-01 19:40:25 +00:00
}
2017-02-06 13:49:00 +00:00
else if (match_ss(bar.string, make_lit_string("open all code recursive"))){
exec_command(app, open_all_code_recursive);
}
else if(match_ss(bar.string, make_lit_string("close all code"))){
exec_command(app, close_all_code);
2016-09-01 19:40:25 +00:00
}
else if (match_ss(bar.string, make_lit_string("dos lines")) ||
match_ss(bar.string, make_lit_string("dosify"))){
exec_command(app, eol_dosify);
2016-09-01 19:40:25 +00:00
}
else if (match_ss(bar.string, make_lit_string("nix lines")) ||
match_ss(bar.string, make_lit_string("nixify"))){
exec_command(app, eol_nixify);
2016-12-24 21:09:53 +00:00
}
else if (match_ss(bar.string, make_lit_string("remap"))){
exec_command(app, remap_interactive);
}
else if (match_ss(bar.string, make_lit_string("new project"))){
exec_command(app, setup_new_project);
}
2016-12-24 21:09:53 +00:00
else{
print_message(app, literal("unrecognized command\n"));
}
}
#include "4coder_remapping_commands.cpp"
#endif
// BOTTOM
2016-08-22 19:31:19 +00:00