+110
-41
@@ -1,87 +1,127 @@
|
||||
#include "../include/builtins.h"
|
||||
#include "../include/define.h"
|
||||
#include "../include/input.h"
|
||||
#include "../include/file_io.h"
|
||||
#include "../include/editor_op.h"
|
||||
#include "../include/row_op.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/output.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
struct prefix_t find_prefix(const char prefix_name[64]) {
|
||||
int i = E.number_of_prefix + 1;
|
||||
while (i--) {
|
||||
if (!strcmp(prefix_name, E.prefix[i].prefix_name)) {
|
||||
return E.prefix[i];
|
||||
}
|
||||
}
|
||||
return E.prefix[0];
|
||||
}
|
||||
|
||||
Lisp mapKey(Lisp args, LispError *e, LispContext ctx) {
|
||||
/*
|
||||
* 3 arguments keybind command prefix
|
||||
*/
|
||||
const char *key_sequence = lisp_string(lisp_car(args));
|
||||
args = lisp_cdr(args);
|
||||
// second argument
|
||||
Lisp func = lisp_car(args);
|
||||
|
||||
E.key_binds =
|
||||
(struct keyBind_t *)realloc(E.key_binds, ++E.number_of_keybinds * sizeof(struct keyBind_t));
|
||||
E.key_binds[E.number_of_keybinds - 1].key_sequence = (char *) malloc(50 * sizeof(char));
|
||||
E.key_binds = (struct keyBind_t *)realloc(
|
||||
E.key_binds, ++E.number_of_keybinds * sizeof(struct keyBind_t));
|
||||
E.key_binds[E.number_of_keybinds - 1].key_sequence =
|
||||
(char *)malloc(50 * sizeof(char));
|
||||
|
||||
strncpy(E.key_binds[E.number_of_keybinds - 1].key_sequence, key_sequence, 50);
|
||||
|
||||
E.key_binds[E.number_of_keybinds - 1].command = func;
|
||||
|
||||
// Third argument
|
||||
args = lisp_cdr(args);
|
||||
const char *prefix_name = lisp_string(lisp_car(args));
|
||||
struct prefix_t prefix = find_prefix(prefix_name);
|
||||
|
||||
E.key_binds[E.number_of_keybinds - 1].prefix_id = prefix.prefix_id;
|
||||
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
Lisp moveCursor(Lisp args, LispError *e, LispContext ctx) {
|
||||
const char *direction = lisp_string(lisp_car(args));
|
||||
int is_in = 0;
|
||||
switch (direction[0]) {
|
||||
case 'u':
|
||||
editorMoveCursor(ARROW_UP);
|
||||
is_in = editorMoveCursor(ARROW_UP);
|
||||
break;
|
||||
case 'd':
|
||||
editorMoveCursor(ARROW_DOWN);
|
||||
is_in = editorMoveCursor(ARROW_DOWN);
|
||||
break;
|
||||
case 'r':
|
||||
editorMoveCursor(ARROW_RIGHT);
|
||||
is_in = editorMoveCursor(ARROW_RIGHT);
|
||||
break;
|
||||
case 'l':
|
||||
editorMoveCursor(ARROW_LEFT);
|
||||
is_in = editorMoveCursor(ARROW_LEFT);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return lisp_null();
|
||||
fprintf(stderr, "move lisp %d\n", is_in);
|
||||
return lisp_make_bool(is_in);
|
||||
}
|
||||
|
||||
Lisp editorQuit(Lisp args, LispError* e, LispContext ctx) {
|
||||
void free_structs(void) {
|
||||
int i;
|
||||
free(E.prefix);
|
||||
for (i = 0; i < E.number_of_keybinds; ++i) {
|
||||
free(E.key_binds[i].key_sequence);
|
||||
}
|
||||
free(E.key_binds);
|
||||
free(E.filename);
|
||||
free(E.row->chars);
|
||||
free(E.row->render);
|
||||
free(E.row);
|
||||
|
||||
}
|
||||
|
||||
Lisp editorQuit(Lisp args, LispError *e, LispContext ctx) {
|
||||
if (E.dirty && E.quit_times_buffer > 0) {
|
||||
editorSetStatusMessage("WARNING! Changes hasn't been saved. Press Ctrl-Q "
|
||||
"another time to quit.");
|
||||
--E.quit_times_buffer;
|
||||
return lisp_null();
|
||||
}
|
||||
free_structs();
|
||||
write(STDOUT_FILENO, "\x1b[2J", 4);
|
||||
write(STDOUT_FILENO, CURSOR_TOP_LEFT, 3);
|
||||
disableRawMode();
|
||||
lisp_shutdown(E.ctx);
|
||||
exit(0);
|
||||
|
||||
return lisp_null();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
Lisp l_editorSave(Lisp args, LispError* e, LispContext ctx) {
|
||||
Lisp l_editorSave(Lisp args, LispError *e, LispContext ctx) {
|
||||
|
||||
editorSave();
|
||||
|
||||
return lisp_null();
|
||||
|
||||
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
Lisp l_editorInsertNewLine(Lisp args, LispError* e, LispContext ctx) {
|
||||
Lisp l_editorInsertNewLine(Lisp args, LispError *e, LispContext ctx) {
|
||||
|
||||
editorInsertNewLine();
|
||||
|
||||
return lisp_null();
|
||||
|
||||
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
Lisp l_editorInserTab(Lisp args, LispError *e, LispContext ctx) {
|
||||
|
||||
for (int i = 0; i<E.constantes.TAB_LENGTH; ++i) {
|
||||
editorInsertChar(' ');
|
||||
}
|
||||
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
Lisp moveCursorBeginLine(Lisp args, LispError *e, LispContext ctx) {
|
||||
@@ -89,20 +129,19 @@ Lisp moveCursorBeginLine(Lisp args, LispError *e, LispContext ctx) {
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
Lisp moveCursorEndLine(Lisp args, LispError* e, LispContext ctx) {
|
||||
Lisp moveCursorEndLine(Lisp args, LispError *e, LispContext ctx) {
|
||||
if (E.cursor_y < E.numrows) {
|
||||
E.cursor_x = E.row[E.cursor_y].size;
|
||||
}
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
|
||||
Lisp deletePreviousChar(Lisp args, LispError* e, LispContext ctx) {
|
||||
Lisp deletePreviousChar(Lisp args, LispError *e, LispContext ctx) {
|
||||
editorDelChar();
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
Lisp editorMoveCursorPageUp(Lisp args, LispError* e, LispContext ctx) {
|
||||
Lisp editorMoveCursorPageUp(Lisp args, LispError *e, LispContext ctx) {
|
||||
E.cursor_y = E.row_offset;
|
||||
int times = E.screenrows;
|
||||
while (--times) {
|
||||
@@ -111,7 +150,7 @@ Lisp editorMoveCursorPageUp(Lisp args, LispError* e, LispContext ctx) {
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
Lisp editorMoveCursorPageDown(Lisp args, LispError* e, LispContext ctx) {
|
||||
Lisp editorMoveCursorPageDown(Lisp args, LispError *e, LispContext ctx) {
|
||||
E.cursor_y = E.row_offset + E.screenrows - 1;
|
||||
if (E.cursor_y > E.numrows) {
|
||||
E.cursor_y = E.numrows;
|
||||
@@ -126,13 +165,15 @@ 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);
|
||||
}
|
||||
free(filename);
|
||||
|
||||
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
|
||||
Lisp editorPrintC(Lisp args, LispError *e, LispContext ctx) {
|
||||
char c = lisp_string(lisp_car(args))[0];
|
||||
editorInsertChar(c);
|
||||
@@ -141,20 +182,21 @@ 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));
|
||||
char *package_dir = (char *) calloc(256, sizeof(char));
|
||||
fprintf(stderr, "%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);
|
||||
fd_package = fopen(package_dir, "r");
|
||||
lisp_eval(lisp_read_file(fd_package, &E.ctx_error, E.ctx), &E.ctx_error,
|
||||
E.ctx);
|
||||
fclose(fd_package);
|
||||
free(package_dir);
|
||||
|
||||
|
||||
return lisp_null();
|
||||
|
||||
}
|
||||
|
||||
Lisp editorDelRow_L(Lisp args, LispError *e, LispContext ctx) {
|
||||
@@ -163,12 +205,39 @@ Lisp editorDelRow_L(Lisp args, LispError *e, LispContext ctx) {
|
||||
}
|
||||
|
||||
Lisp editorFind_L(Lisp args, LispError *e, LispContext ctx) {
|
||||
editorFind();
|
||||
return lisp_null();
|
||||
editorFind();
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
Lisp editorReadChar_L(Lisp args, LispError *e, LispContext ctx) {
|
||||
fprintf(stderr, "char read : %c\n", E.row[E.cursor_y].render[E.cursor_x]);
|
||||
return lisp_make_char(E.row[E.cursor_y].render[E.cursor_x]);
|
||||
Lisp returned_char;
|
||||
if (E.row[E.cursor_y].render[E.cursor_x] == 0) {
|
||||
returned_char = lisp_make_char('a');
|
||||
} else {
|
||||
|
||||
returned_char = lisp_make_char(E.row[E.cursor_y].render[E.cursor_x]);
|
||||
}
|
||||
return returned_char;
|
||||
}
|
||||
|
||||
Lisp editorSetPrefix(Lisp args, LispError *e, LispContext ctx) {
|
||||
/*
|
||||
* Set the prefix state of editor to the prefix in argument
|
||||
*/
|
||||
const char *prefix_name = lisp_string(lisp_car(args));
|
||||
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);
|
||||
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
Lisp editorPrefix(Lisp args, LispError *e, LispContext ctx) {
|
||||
E.prefix = (struct prefix_t *)realloc(E.prefix, (++(E.number_of_prefix) + 1) *
|
||||
sizeof(struct prefix_t));
|
||||
E.prefix[E.number_of_prefix].prefix_id = E.number_of_prefix;
|
||||
strncpy(E.prefix[E.number_of_prefix].prefix_name, lisp_string(lisp_car(args)),
|
||||
64);
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
@@ -13,6 +13,10 @@ void editorInsertChar(int c) {
|
||||
}
|
||||
|
||||
void editorInsertNewLine() {
|
||||
/*
|
||||
* Add new line and place the cursor at the beginning of it
|
||||
*/
|
||||
fprintf(stderr, "Inserting new line\n");
|
||||
erow *row;
|
||||
if (!E.cursor_x) {
|
||||
editorInsertRow(E.cursor_y, "", 0);
|
||||
@@ -27,6 +31,7 @@ void editorInsertNewLine() {
|
||||
}
|
||||
++E.cursor_y;
|
||||
E.cursor_x = 0;
|
||||
fprintf(stderr, "Insert new line done\n");
|
||||
}
|
||||
|
||||
void editorDelChar() {
|
||||
|
||||
+30
-21
@@ -1,8 +1,9 @@
|
||||
#include "../include/init.h"
|
||||
#include "../include/builtins.h"
|
||||
#include "../include/data.h"
|
||||
#include "../include/terminal.h"
|
||||
#include "../include/builtins.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define LISP_IMPLEMENTATION
|
||||
#include "../include/lisp.h"
|
||||
@@ -10,35 +11,36 @@
|
||||
|
||||
extern 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("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() {
|
||||
char * init_file_path = (char *) calloc(256, sizeof(char));
|
||||
char *init_file_path = (char *)calloc(256, sizeof(char));
|
||||
E.cursor_x = 0;
|
||||
E.cursor_y = 0;
|
||||
E.rx = 0;
|
||||
@@ -57,6 +59,13 @@ void initEditor() {
|
||||
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(init_file_path, getenv("HOME"));
|
||||
strcat(init_file_path, "/.beluga/config/init.lisp");
|
||||
@@ -75,7 +84,7 @@ void initEditor() {
|
||||
die("init failed");
|
||||
}
|
||||
lisp_eval(E.ctx_data, &E.ctx_error, E.ctx);
|
||||
|
||||
|
||||
// To modify
|
||||
|
||||
E.constantes.TAB_LENGTH =
|
||||
|
||||
+78
-74
@@ -1,84 +1,82 @@
|
||||
#include "../include/input.h"
|
||||
#include "../include/define.h"
|
||||
#include "../include/editor_op.h"
|
||||
#include "../include/output.h"
|
||||
#include "../include/define.h"
|
||||
#include <ctype.h>
|
||||
#include <sys/stat.h>
|
||||
#include <dirent.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern struct editorConfig E;
|
||||
|
||||
char * file_completion(const char *path) {
|
||||
DIR * dir;
|
||||
struct dirent *entry;
|
||||
char directory[128];
|
||||
char predict[128];
|
||||
int predict_len = 0;
|
||||
char *file_completion(const char *path) {
|
||||
DIR *dir;
|
||||
struct dirent *entry;
|
||||
char directory[128];
|
||||
char predict[128];
|
||||
int predict_len = 0;
|
||||
|
||||
if (path[strlen(path) - 1] == '/') {
|
||||
return path;
|
||||
}
|
||||
|
||||
// Find dir name
|
||||
char * last_slash = strrchr(path, '/');
|
||||
if (last_slash) {
|
||||
size_t dir_len = last_slash - path + 1; // length of dir_path
|
||||
strncpy(directory, path, dir_len);
|
||||
predict_len = strlen(path) - dir_len - 1;
|
||||
strncpy(predict, last_slash + 1, predict_len);
|
||||
directory[dir_len] = '\0';
|
||||
predict[predict_len] = '\0';
|
||||
fprintf(stderr, "%s %s\n", directory, predict);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Find dir name
|
||||
char *last_slash = strrchr(path, '/');
|
||||
if (last_slash) {
|
||||
size_t dir_len = last_slash - path + 1; // length of dir_path
|
||||
strncpy(directory, path, dir_len);
|
||||
predict_len = strlen(path) - dir_len - 1;
|
||||
strncpy(predict, last_slash + 1, predict_len);
|
||||
directory[dir_len] = '\0';
|
||||
predict[predict_len] = '\0';
|
||||
fprintf(stderr, "%s %s\n", directory, predict);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dir = opendir(directory);
|
||||
if (!dir)
|
||||
return NULL;
|
||||
|
||||
while ((entry = readdir(dir)) != NULL) {
|
||||
if (strncmp(entry->d_name, predict, predict_len) == 0) {
|
||||
static char full_path[128];
|
||||
snprintf(full_path, sizeof(full_path), "%s%s", directory, entry->d_name);
|
||||
|
||||
struct stat st;
|
||||
if (stat(full_path, &st) == 0 && S_ISDIR(st.st_mode)) {
|
||||
strcat(full_path, "/"); // add slash for directories
|
||||
}
|
||||
|
||||
return strdup(full_path);
|
||||
}
|
||||
}
|
||||
|
||||
// Cleanup when no more entries
|
||||
closedir(dir);
|
||||
dir = NULL;
|
||||
return NULL;
|
||||
|
||||
while ((entry = readdir(dir)) != NULL) {
|
||||
if (strncmp(entry->d_name, predict, predict_len) == 0) {
|
||||
static char full_path[128];
|
||||
snprintf(full_path, sizeof(full_path), "%s%s", directory, entry->d_name);
|
||||
|
||||
struct stat st;
|
||||
if (stat(full_path, &st) == 0 && S_ISDIR(st.st_mode)) {
|
||||
strcat(full_path, "/"); // add slash for directories
|
||||
}
|
||||
|
||||
return strdup(full_path);
|
||||
}
|
||||
}
|
||||
|
||||
// Cleanup when no more entries
|
||||
closedir(dir);
|
||||
dir = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn char * editorPrompt(struct editorConfig *E, char *prompt, char bPathMode)
|
||||
* \brief Return user input in a prompt when enter is hit. */
|
||||
|
||||
char *editorPrompt(char *prompt, char * placeHolder, char bPathMode) {
|
||||
char *editorPrompt(char *prompt, char *placeHolder, char bPathMode) {
|
||||
size_t buf_size = 128;
|
||||
char *buf = malloc(buf_size);
|
||||
size_t buf_len = 0;
|
||||
int c = 0;
|
||||
buf[0] = '\0';
|
||||
strcpy(buf, placeHolder);
|
||||
buf_len = strlen(placeHolder);
|
||||
strcpy(buf, placeHolder);
|
||||
buf_len = strlen(placeHolder);
|
||||
|
||||
while (1) {
|
||||
editorSetStatusMessage(prompt, buf);
|
||||
editorSetStatusMessage(prompt, buf);
|
||||
editorRefreshScreen();
|
||||
c = editorReadKey();
|
||||
if (c == DEL_KEY || c == CTRL_KEY('h') || c == BACKSPACE) {
|
||||
@@ -95,23 +93,23 @@ char *editorPrompt(char *prompt, char * placeHolder, char bPathMode) {
|
||||
return buf;
|
||||
}
|
||||
} else if (bPathMode && c == '\t') {
|
||||
char path[128];
|
||||
char * pwd;
|
||||
if (buf[0] != '/') {
|
||||
pwd = getenv("PWD");
|
||||
fprintf(stderr, "%s\n", pwd);
|
||||
memcpy(path, pwd, strlen(pwd));
|
||||
path[strlen(pwd)] = '/';
|
||||
strncat(path, buf, buf_len);
|
||||
} else {
|
||||
strcpy(path, buf);
|
||||
}
|
||||
memset(buf, 0, 128);
|
||||
buf_len = 0;
|
||||
strcpy(buf, file_completion(path));
|
||||
buf_len = strlen(buf);
|
||||
buf[buf_len] = '\0';
|
||||
|
||||
char path[128];
|
||||
char *pwd;
|
||||
if (buf[0] != '/') {
|
||||
pwd = getenv("PWD");
|
||||
fprintf(stderr, "%s\n", pwd);
|
||||
memcpy(path, pwd, strlen(pwd));
|
||||
path[strlen(pwd)] = '/';
|
||||
strncat(path, buf, buf_len);
|
||||
} else {
|
||||
strcpy(path, buf);
|
||||
}
|
||||
memset(buf, 0, 128);
|
||||
buf_len = 0;
|
||||
strcpy(buf, file_completion(path));
|
||||
buf_len = strlen(buf);
|
||||
buf[buf_len] = '\0';
|
||||
|
||||
} else if (!iscntrl(c) && c < 128) {
|
||||
if (buf_len == buf_size - 1) {
|
||||
buf_size *= 2;
|
||||
@@ -129,11 +127,12 @@ char *key_to_string(int key) {
|
||||
char tmp[10];
|
||||
sprintf(tmp, "%d", key);
|
||||
|
||||
|
||||
// First test enter key
|
||||
|
||||
if (key == '\r') {
|
||||
strcpy(key_str, "ENTER");
|
||||
} else if (key == '\t') {
|
||||
strcpy(key_str, "TAB");
|
||||
} else if (key >= 1 && key <= 26) { // CTRL keys
|
||||
snprintf(key_str, sizeof(key_str), "CTRL-%c", 'a' + key - 1);
|
||||
} else {
|
||||
@@ -158,9 +157,8 @@ char *key_to_string(int key) {
|
||||
strcpy(key_str, "PAGE-DOWN");
|
||||
break;
|
||||
case DEL_KEY:
|
||||
fprintf(stderr, "delete key\n");
|
||||
strcpy(key_str, "DEL");
|
||||
|
||||
|
||||
break;
|
||||
case BACKSPACE:
|
||||
strcpy(key_str, "BACKSPACE");
|
||||
@@ -189,8 +187,7 @@ char *key_to_string(int key) {
|
||||
return key_str;
|
||||
}
|
||||
|
||||
|
||||
void editorMoveCursor(int key) {
|
||||
int editorMoveCursor(int key) {
|
||||
erow *row = (E.cursor_y >= E.numrows) ? NULL : &E.row[E.cursor_y];
|
||||
int row_len;
|
||||
switch (key) {
|
||||
@@ -226,19 +223,27 @@ void editorMoveCursor(int key) {
|
||||
row_len = row ? row->size : 0;
|
||||
if (E.cursor_x > row_len) {
|
||||
E.cursor_x = row_len;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int executeKeyBind(char *key_sequence) {
|
||||
int i;
|
||||
int previous_state = 0;
|
||||
fprintf(stderr, "pressed %s\n", key_sequence);
|
||||
for (i = 0; i < E.number_of_keybinds; ++i) {
|
||||
if (!strcmp(key_sequence, E.key_binds[i].key_sequence)) {
|
||||
|
||||
fprintf(stderr, "lisp function %s\n", key_sequence);
|
||||
// It's a symbol, create a function call
|
||||
lisp_eval(lisp_cons(E.key_binds[i].command, lisp_null(), E.ctx),
|
||||
&E.ctx_error, E.ctx);
|
||||
return 1;
|
||||
if (E.prefix_state != E.key_binds[i].prefix_id) {
|
||||
return 0;
|
||||
}
|
||||
previous_state = E.prefix_state;
|
||||
// It's a symbol, create a function call
|
||||
lisp_eval(lisp_cons(E.key_binds[i].command, lisp_null(), E.ctx),
|
||||
&E.ctx_error, E.ctx);
|
||||
if (E.prefix_state == previous_state)
|
||||
E.prefix_state = 0;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -252,5 +257,4 @@ void editorProcessKeypress() {
|
||||
}
|
||||
editorInsertChar(c);
|
||||
E.quit_times_buffer = E.constantes.QUIT_TIMES;
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user