#include "../include/init.h" #include "../include/builtins.h" #include "../include/data.h" #include "../include/terminal.h" #include #include #define LISP_IMPLEMENTATION #include "../include/lisp.h" #include "../include/lisp_lib.h" struct editorConfig; void registerBuiltin(char *key_sequence, LispCFunc f) { lisp_env_define(E.ctx.p->env, lisp_make_symbol(key_sequence, E.ctx), lisp_make_func(f), E.ctx); } void initBuiltins() { // move cursor registerBuiltin("move-cursor", moveCursor); registerBuiltin("map-key", mapKey); registerBuiltin("editor-quit", editorQuit); registerBuiltin("editor-save", l_editorSave); registerBuiltin("editor-insert-new-line", l_editorInsertNewLine); registerBuiltin("move-cursor-beg-line", moveCursorBeginLine); registerBuiltin("move-cursor-end-line", moveCursorEndLine); registerBuiltin("editor-delete-previous-char", deletePreviousChar); registerBuiltin("move-cursor-page-up", editorMoveCursorPageUp); registerBuiltin("move-cursor-page-down", editorMoveCursorPageDown); registerBuiltin("editor-open-file", editorOpenFile); registerBuiltin("editor-insert-char", editorPrintC); registerBuiltin("add-package", addPackage); registerBuiltin("editor-del-row", editorDelRow_L); registerBuiltin("editor-find", editorFind_L); registerBuiltin("editor-read-char", editorReadChar_L); registerBuiltin("add-prefix", editorPrefix); registerBuiltin("editor-set-prefix", editorSetPrefix); registerBuiltin("editor-insert-tab", l_editorInserTab); } void initEditor() { E.init_file_path = (char *)calloc(256, sizeof(char)); E.cursor_x = 0; E.cursor_y = 0; E.rx = 0; E.row_offset = 0; E.col_offset = 0; E.numrows = 0; E.row = NULL; E.dirty = 0; E.filename = NULL; E.state = READ_ONLY; E.status_msg[0] = '\0'; E.status_msg_time = 0; if (getWindowSize(&E.screenrows, &E.screencols) == -1) { die("getWindowSize"); } E.screenrows -= 2; E.number_of_keybinds = 0; E.number_of_prefix = 0; // General prefix is 0 (no prefix) E.prefix = (struct prefix_t *)malloc(sizeof(struct prefix_t)); E.prefix[0].prefix_id = 0; strncpy(E.prefix[0].prefix_name, "no-prefix", 64); E.prefix_state = 0; strcat(E.init_file_path, getenv("HOME")); strcat(E.init_file_path, "/.beluga/config/init.lisp"); // printf("%s\n", init_file_path); E.fd_init_file = fopen(E.init_file_path, "r"); E.ctx = lisp_init(); E.env = lisp_env(E.ctx); lisp_lib_load(E.ctx); // Init builtins lisp functions initBuiltins(); // Read config file E.ctx_data = lisp_read_file(E.fd_init_file, &E.ctx_error, E.ctx); if (E.ctx_error != LISP_ERROR_NONE) { die("init failed"); } lisp_eval(E.ctx_data, &E.ctx_error, E.ctx); // To modify E.constantes.TAB_LENGTH = (int)lisp_eval(lisp_read("TAB-LENGTH", &E.ctx_error, E.ctx), &E.ctx_error, E.ctx) .val.int_val; E.constantes.QUIT_TIMES = (int)lisp_eval(lisp_read("QUIT-TIMES", &E.ctx_error, E.ctx), &E.ctx_error, E.ctx) .val.int_val; E.quit_times_buffer = E.constantes.QUIT_TIMES; }