temp commit

This commit is contained in:
2026-05-22 13:40:03 +02:00
parent bc66e673fa
commit edb5384f0e
23 changed files with 848 additions and 621 deletions
+46 -60
View File
@@ -2,17 +2,18 @@
* @file builtins.c
* @brief Built-in Lisp functions for editor operations
* @details Provides Lisp bindings for core editor functionality including
* cursor movement, file operations, keybinding management, and text manipulation
* cursor movement, file operations, keybinding management, and text
* manipulation
*/
#include "../include/builtins.h"
#include "../include/buffer.h"
#include "../include/data.h"
#include "../include/define.h"
#include "../include/editor_op.h"
#include "../include/file_io.h"
#include "../include/input.h"
#include "../include/row_op.h"
#include "../include/buffer.h"
#include "../include/split_screen.h"
#include <stdio.h>
@@ -57,7 +58,7 @@ Lisp mapKey(Lisp args, LispError *e, LispContext ctx) {
const char *key_sequence = lisp_string(lisp_car(args));
args = lisp_cdr(args);
// second argument
Lisp func = lisp_car(args);
const Lisp func = lisp_car(args);
E.key_binds = (struct keyBind_t *)realloc(
E.key_binds, ++E.number_of_keybinds * sizeof(struct keyBind_t));
@@ -74,13 +75,14 @@ Lisp mapKey(Lisp args, LispError *e, LispContext ctx) {
struct prefix_t prefix = find_prefix(prefix_name);
E.key_binds[E.number_of_keybinds - 1].prefix_id = prefix.prefix_id;
return lisp_null();
}
/**
* @brief Lisp function to move cursor in a specified direction
* @details Moves the editor cursor up, down, left, or right based on direction string.
* @details Moves the editor cursor up, down, left, or right based on direction
* string.
* @param args Lisp list with one argument: direction string
* - "u": up, "d": down, "r": right, "l": left
* @param e Error pointer for Lisp error handling
@@ -106,7 +108,7 @@ Lisp moveCursor(Lisp args, LispError *e, LispContext ctx) {
is_in = editorMoveCursor(ARROW_LEFT);
break;
}
fprintf(stderr, "move lisp %d\n", is_in);
appDebug("move lisp %d\n", is_in);
return lisp_make_bool(is_in);
}
@@ -130,21 +132,20 @@ void free_structs(void) {
for (i = 0; i < E.number_of_buffer; ++i) {
free(E.buffers[i].filename);
for (j = 0; j < E.buffers[i].numrows; ++j) {
free(E.buffers[i].row[j].render);
free(E.buffers[i].row[j].chars);
}
free(E.buffers[i].row);
}
free(E.init_file_path);
fclose(E.fd_init_file);
}
/**
* @brief Lisp function to quit the editor
* @details Closes editor with unsaved changes protection. Prompts user to confirm
* quit after multiple attempts if file is dirty. Cleans up resources and restores terminal.
* @details Closes editor with unsaved changes protection. Prompts user to
* confirm quit after multiple attempts if file is dirty. Cleans up resources
* and restores terminal.
* @param args Lisp arguments (unused)
* @param e Error pointer for Lisp error handling
* @param ctx Lisp context
@@ -182,10 +183,10 @@ Lisp editorQuit(Lisp args, LispError *e, LispContext ctx) {
Lisp l_editorSplitScreenVertical(Lisp args, LispError *e, LispContext ctx) {
if (E.number_of_buffer >= 2) {
splitScreenVertical(E.buffers[0].buffer_id, E.buffers[1].buffer_id);
} else {
editorSetStatusMessage("Need at least 2 buffers open");
}
splitScreenVertical(E.buffers[0].buffer_id, E.buffers[1].buffer_id);
} else {
editorSetStatusMessage("Need at least 2 buffers open");
}
return lisp_null();
}
@@ -222,9 +223,10 @@ Lisp l_editorInsertNewLine(Lisp args, LispError *e, LispContext ctx) {
* @note Uses E.constantes.TAB_LENGTH for indentation width
*/
Lisp l_editorInserTab(Lisp args, LispError *e, LispContext ctx) {
for (int i = 0; i<E.constantes.TAB_LENGTH; ++i) {
bufferInsertChar(' ');
EditorPane *active = splitScreenGetActivePane();
struct buffer_t *buf = bufferFindById(active->buffer_id);
for (int i = 0; i < E.constantes.TAB_LENGTH; ++i) {
bufferInsertBytes(" ", 1);
}
return lisp_null();
@@ -240,7 +242,9 @@ Lisp l_editorInserTab(Lisp args, LispError *e, LispContext ctx) {
* @note Updates global editor state E
*/
Lisp moveCursorBeginLine(Lisp args, LispError *e, LispContext ctx) {
E.layout.panes[E.layout.active_pane].cursor_x = 0;
EditorPane *active = splitScreenGetActivePane();
struct buffer_t *buf = bufferFindById(active->buffer_id);
buf->x = 0;
return lisp_null();
}
@@ -256,9 +260,7 @@ Lisp moveCursorBeginLine(Lisp args, LispError *e, LispContext ctx) {
Lisp moveCursorEndLine(Lisp args, LispError *e, LispContext ctx) {
EditorPane *active = splitScreenGetActivePane();
struct buffer_t *buf = bufferFindById(active->buffer_id);
if (active->cursor_y < buf->numrows) {
active->cursor_x = buf->row[active->cursor_y].size;
}
buf->x = buf->row[buf->y].size;
return lisp_null();
}
@@ -272,13 +274,14 @@ Lisp moveCursorEndLine(Lisp args, LispError *e, LispContext ctx) {
* @see editorDelChar()
*/
Lisp deletePreviousChar(Lisp args, LispError *e, LispContext ctx) {
bufferDelChar();
bufferDelBytes();
return lisp_null();
}
/**
* @brief Lisp function to move cursor up by one screen
* @details Scrolls up one full screen height, moving cursor to top of visible area.
* @details Scrolls up one full screen height, moving cursor to top of visible
* area.
* @param args Lisp arguments (unused)
* @param e Error pointer for Lisp error handling
* @param ctx Lisp context
@@ -288,7 +291,7 @@ Lisp deletePreviousChar(Lisp args, LispError *e, LispContext ctx) {
*/
Lisp editorMoveCursorPageUp(Lisp args, LispError *e, LispContext ctx) {
EditorPane *active = splitScreenGetActivePane();
active->cursor_y = active->row_offset;
active->cursor_y = active->y_offset;
int times = E.screenrows;
while (--times) {
editorMoveCursor(ARROW_UP);
@@ -298,7 +301,8 @@ Lisp editorMoveCursorPageUp(Lisp args, LispError *e, LispContext ctx) {
/**
* @brief Lisp function to move cursor down by one screen
* @details Scrolls down one full screen height, moving cursor to bottom of visible area.
* @details Scrolls down one full screen height, moving cursor to bottom of
* visible area.
* @param args Lisp arguments (unused)
* @param e Error pointer for Lisp error handling
* @param ctx Lisp context
@@ -309,7 +313,7 @@ Lisp editorMoveCursorPageUp(Lisp args, LispError *e, LispContext ctx) {
Lisp editorMoveCursorPageDown(Lisp args, LispError *e, LispContext ctx) {
EditorPane *active = splitScreenGetActivePane();
struct buffer_t *buffer = bufferFindById(active->buffer_id);
active->cursor_y = active->row_offset + E.screenrows - 1;
active->cursor_y = active->y_offset + E.screenrows - 1;
if (active->cursor_y > buffer->numrows) {
active->cursor_y = buffer->numrows;
}
@@ -334,20 +338,20 @@ Lisp editorMoveCursorPageDown(Lisp args, LispError *e, LispContext ctx) {
*/
Lisp editorOpenFile(Lisp args, LispError *e, LispContext ctx) {
char *filename = editorPrompt("Open : %s", getenv("PWD"), 1);
if (filename){
if (filename) {
// editorOpen(filename);
EditorPane *active = splitScreenGetActivePane();
active->buffer_id = bufferCreate(filename);
}
free(filename);
return lisp_null();
}
/**
* @brief Lisp function to insert a character
* @details Extracts a character from Lisp string argument and inserts it at cursor.
* @details Extracts a character from Lisp string argument and inserts it at
* cursor.
* @param args Lisp list with one string argument
* @param e Error pointer for Lisp error handling
* @param ctx Lisp context
@@ -355,8 +359,8 @@ Lisp editorOpenFile(Lisp args, LispError *e, LispContext ctx) {
* @note Uses first character of the string argument
*/
Lisp editorPrintC(Lisp args, LispError *e, LispContext ctx) {
char c = lisp_string(lisp_car(args))[0];
bufferInsertChar(c);
char *src = lisp_string(lisp_car(args));
bufferInsertBytes(src, strlen(src));
return lisp_null();
}
@@ -373,14 +377,14 @@ Lisp editorPrintC(Lisp args, LispError *e, LispContext ctx) {
*/
Lisp addPackage(Lisp args, LispError *e, LispContext ctx) {
const char *package_name = lisp_string(lisp_car(args));
fprintf(stderr, "%s\n", package_name);
appDebug("%s\n", package_name);
char *package_dir = (char *)calloc(256, sizeof(char));
FILE *fd_package = NULL;
strcat(package_dir, getenv("HOME"));
strcat(package_dir, "/.beluga/packages/");
strcat(package_dir, package_name);
strcat(package_dir, "/init.lisp");
fprintf(stderr, "%s\n", package_dir);
appDebug("%s\n", package_dir);
fd_package = fopen(package_dir, "r");
lisp_eval(lisp_read_file(fd_package, &E.ctx_error, E.ctx), &E.ctx_error,
E.ctx);
@@ -390,30 +394,13 @@ Lisp addPackage(Lisp args, LispError *e, LispContext ctx) {
return lisp_null();
}
/**
* @brief Lisp function to delete the current row
* @details Removes the line at the current cursor position.
* @param args Lisp arguments (unused)
* @param e Error pointer for Lisp error handling
* @param ctx Lisp context
* @return lisp_null()
* @note Updates global editor state E
* @see editorDelRow()
*/
Lisp editorDelRow_L(Lisp args, LispError *e, LispContext ctx) {
EditorPane *active = splitScreenGetActivePane();
struct buffer_t *buffer = bufferFindById(active->buffer_id);
bufferDelRow(buffer, active->cursor_y);
return lisp_null();
}
Lisp editorSwitchNextBuffer(Lisp args, LispError *e, LispContext ctx) {
fprintf(stderr, "switch buffer\n");
appDebug("switch buffer\n");
if (E.number_of_buffer > 0) {
EditorPane *active = splitScreenGetActivePane();
int next_idx = (active->buffer_id + 1) % E.number_of_buffer;
active->buffer_id = next_idx;
}
}
return lisp_null();
}
@@ -440,7 +427,7 @@ Lisp editorUnifiedPanes(Lisp args, LispError *e, LispContext ctx) {
* @see editorFind()
*/
Lisp bufferFind_L(Lisp args, LispError *e, LispContext ctx) {
fprintf(stderr, "LispFind\n");
appDebug("LispFind\n");
EditorPane *active = splitScreenGetActivePane();
struct buffer_t *buffer = bufferFindById(active->buffer_id);
bufferFind(buffer);
@@ -449,8 +436,8 @@ Lisp bufferFind_L(Lisp args, LispError *e, LispContext ctx) {
/**
* @brief Lisp function to read character at cursor
* @details Returns the character at the current cursor position as a Lisp character.
* Returns 'a' if at end of line.
* @details Returns the character at the current cursor position as a Lisp
* character. Returns 'a' if at end of line.
* @param args Lisp arguments (unused)
* @param e Error pointer for Lisp error handling
* @param ctx Lisp context
@@ -460,11 +447,10 @@ Lisp editorReadChar_L(Lisp args, LispError *e, LispContext ctx) {
Lisp returned_char;
EditorPane *active = splitScreenGetActivePane();
struct buffer_t *buffer = bufferFindById(active->buffer_id);
if (buffer->row[active->cursor_y].render[active->cursor_x] == 0) {
if (buffer->row[buffer->y].chars[buffer->x] == 0) {
returned_char = lisp_make_char('a');
} else {
returned_char = lisp_make_char(buffer->row[active->cursor_y].render[active->cursor_x]);
returned_char = lisp_make_char(buffer->row[buffer->y].chars[buffer->x]);
}
return returned_char;
}
@@ -488,7 +474,7 @@ Lisp editorSetPrefix(Lisp args, LispError *e, LispContext ctx) {
struct prefix_t prefix = find_prefix(prefix_name);
E.prefix_state = prefix.prefix_id;
editorSetStatusMessage("prefix %s", prefix.prefix_name);
fprintf(stderr, "%s set\n", prefix_name);
appDebug("%s set\n", prefix_name);
return lisp_null();
}