#include "ecex.h" #include "buffers.h" #define C(x) ((float)(x) / 255.0f) #define RGB(r, g, b) C(r), C(g), C(b) /* Gruvbox dark palette */ #define GB_DARK0_HARD RGB(0x1d, 0x20, 0x21) #define GB_DARK0 RGB(0x28, 0x28, 0x28) #define GB_DARK1 RGB(0x3c, 0x38, 0x36) #define GB_DARK2 RGB(0x50, 0x49, 0x45) #define GB_LIGHT0 RGB(0xfb, 0xf1, 0xc7) #define GB_LIGHT1 RGB(0xeb, 0xdb, 0xb2) #define GB_LIGHT2 RGB(0xd5, 0xc4, 0xa1) #define GB_RED RGB(0xfb, 0x49, 0x34) #define GB_GREEN RGB(0xb8, 0xbb, 0x26) #define GB_YELLOW RGB(0xfa, 0xbd, 0x2f) #define GB_BLUE RGB(0x83, 0xa5, 0x98) #define GB_PURPLE RGB(0xd3, 0x86, 0x9b) #define GB_AQUA RGB(0x8e, 0xc0, 0x7c) #define GB_ORANGE RGB(0xfe, 0x80, 0x19) static int hello_command(ecex_t *ed) { buffer_t *buf = ecex_current_buffer(ed); buffer_insert(buf, "Hello from Gruvbox ecex config!\n"); return 0; } static int make_notes_command(ecex_t *ed) { buffer_t *notes = ecex_find_buffer(ed, "*notes*"); if (!notes) { notes = ecex_create_buffer(ed, "*notes*", NULL, 0); } if (notes) { buffer_insert(notes, "Created or reused *notes* from command.\n"); ecex_switch_buffer(ed, "*notes*"); } return 0; } static int demo_line_action(ecex_t *ed, buffer_t *buffer, size_t line, const char *payload, void *userdata) { (void)buffer; (void)line; (void)userdata; buffer_t *notes = ecex_find_buffer(ed, "*notes*"); if (!notes) { notes = ecex_create_buffer(ed, "*notes*", NULL, 0); } if (!notes) return -1; ecex_switch_buffer(ed, "*notes*"); buffer_insert(notes, payload ? payload : "selected an interactive line\n"); return 0; } static int demo_interactive_command(ecex_t *ed) { buffer_t *menu = ecex_create_interactive_buffer(ed, "*demo-menu*"); if (!menu) return -1; buffer_clear(menu); buffer_set_interactive(menu, 1); buffer_append(menu, "Demo interactive buffer\n"); buffer_append(menu, "Move to a line and press ENTER.\n\n"); ecex_interactive_append_line(ed, menu, "Insert hello into *notes*", demo_line_action, "hello from an interactive config buffer!\n", NULL); ecex_interactive_append_line(ed, menu, "Insert gruvbox note into *notes*", demo_line_action, "gruvbox menu action selected\n", NULL); ecex_switch_buffer(ed, "*demo-menu*"); return 0; } int ecex_config_init(ecex_t *ed) { ecex_set_font_size(ed, 20.0f); ecex_set_bg_color(ed, GB_DARK0_HARD); ecex_set_fg_color(ed, GB_LIGHT1); ecex_set_status_bg_color(ed, GB_DARK0); ecex_set_status_fg_color(ed, GB_YELLOW); ecex_set_status_border_color(ed, GB_DARK1); ecex_set_minibuffer_bg_color(ed, GB_DARK1); ecex_set_minibuffer_fg_color(ed, GB_LIGHT0); ecex_set_completion_enabled(ed, 1); ecex_set_completion_fg_color(ed, GB_DARK2); ecex_set_interactive_highlight_bg_color(ed, GB_DARK1); ecex_set_interactive_highlight_fg_color(ed, GB_YELLOW); ecex_set_cursor_color(ed, GB_AQUA); ecex_set_region_bg_color(ed, GB_DARK2); ecex_register_command(ed, "hello", hello_command); ecex_register_command(ed, "make-notes", make_notes_command); ecex_register_command(ed, "demo-interactive", demo_interactive_command); ecex_bind_key(ed, "C-h", "hello"); ecex_bind_key(ed, "C-m", "make-notes"); ecex_bind_key(ed, "F2", "list-commands"); ecex_bind_key(ed, "F3", "list-buffers"); ecex_bind_key(ed, "F4", "demo-interactive"); ecex_bind_key(ed, "C-q", "quit"); ecex_bind_key(ed, "C-x h", "beginning-of-buffer"); ecex_bind_key(ed, "C-x b n", "next-buffer"); ecex_bind_key(ed, "C-x b p", "previous-buffer"); buffer_t *scratch = ecex_current_buffer(ed); buffer_insert(scratch, "ecex config loaded with Gruvbox colors!\n"); buffer_insert(scratch, "Try F1 M-x, C-x C-f, C-x C-s, F2 commands, F3 buffers, F4 demo menu, C-x b n/p.\n"); buffer_insert(scratch, "Eval live C snippets with C-x C-e (line), C-x e r (marked region), C-x e b (buffer), C-x e f (file).\n"); buffer_insert(scratch, "Example line to edit then C-x C-e: ecex_set_font_size(ed, 28.0f);\n"); buffer_insert(scratch, "Example relative change: ecex_adjust_font_size(ed, 2.0f);\n\n"); return 0; }