100 lines
3.1 KiB
C
100 lines
3.1 KiB
C
#include "../include/init.h"
|
|
#include "../include/builtins.h"
|
|
#include "../include/data.h"
|
|
#include "../include/terminal.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#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;
|
|
}
|