Introduction
Introduction Statistics Contact Development Disclaimer Help
tFix a few bugs - ledit - Text editor (WIP)
git clone git://lumidify.org/ledit.git (fast, but not encrypted)
git clone https://lumidify.org/git/ledit.git (encrypted, but very slow)
Log
Files
Refs
README
LICENSE
---
commit e822581bc43838987d8830b54c5e2103056a1b18
parent 8c56c0d034a6e99583be2d9926946997c8fa82bb
Author: lumidify <[email protected]>
Date: Thu, 23 Dec 2021 21:06:42 +0100
Fix a few bugs
Diffstat:
M README | 2 ++
M buffer.h | 2 +-
M keys_basic.c | 27 ++++++++++++++++++++-------
M ledit.1 | 3 +++
M view.c | 7 ++++---
5 files changed, 30 insertions(+), 11 deletions(-)
---
diff --git a/README b/README
t@@ -5,6 +5,8 @@ ledit is a vi-like text editor for people who switch between k…
layouts frequently and/or work with languages that require complex text
layout.
+REQUIREMENTS: pango, xlib (extensions: xkb, xdbe)
+
The documentation can be viewed in ledit.1 or at the following locations:
gopher://lumidify.org/0/doc/ledit/ledit-current.txt
diff --git a/buffer.h b/buffer.h
t@@ -32,7 +32,7 @@ typedef struct {
ledit_buffer_mark *marks;
} ledit_buffer_marklist;
-/* TODO: advisory lock on file? also check if modification date changed before…
+/* TODO: advisory lock on file */
struct ledit_buffer {
ledit_common *common; /* common stuff, e.g. display, etc. */
char *filename; /* last opened filename */
diff --git a/keys_basic.c b/keys_basic.c
t@@ -9,6 +9,8 @@
and being deleted at some later time even though they're not shown anymore …
/* FIXME: delete everything concerned with selections in insert mode since
they are now not allowed at all */
+/* FIXME: a lot of error checking in the individual functions may be redundant
+ now that more checking is done beforehand for the allowed keys */
#include <stdio.h>
#include <stdlib.h>
t@@ -479,6 +481,7 @@ delete_selection(ledit_view *view) {
return 0;
}
+/* FIXME: should these delete characters or graphemes? */
static struct action
delete_chars_forwards(ledit_view *view, char *text, size_t len) {
(void)text;
t@@ -936,7 +939,7 @@ change(ledit_view *view, char *text, size_t len) {
return err_invalid_key(view);
} else {
struct key_stack_elem *e = push_key_stack();
- e->key = KEY_MOTIONALLOWED;
+ e->key = KEY_MOTIONALLOWED|KEY_NUMBERALLOWED;
e->count = num;
e->motion_cb = &change_cb;
}
t@@ -999,9 +1002,11 @@ yank(ledit_view *view, char *text, size_t len) {
} else {
motion_callback cb = NULL;
int num = get_key_repeat_and_motion_cb(view, &cb);
- if (num == 0)
- num = 1;
+ if (num == -1)
+ return err_invalid_key(view);
if (cb == &yank_cb) {
+ if (num == 0)
+ num = 1;
size_t new_line;
int new_softline;
get_new_line_softline(
t@@ -1014,10 +1019,11 @@ yank(ledit_view *view, char *text, size_t len) {
clear_key_stack();
} else if (cb == NULL) {
struct key_stack_elem *e = push_key_stack();
- e->key = KEY_MOTIONALLOWED;
+ e->key = KEY_MOTIONALLOWED|KEY_NUMBERALLOWED;
e->count = num;
e->motion_cb = &yank_cb;
} else {
+ /* FIXME: proper error */
clear_key_stack();
}
}
t@@ -1120,7 +1126,7 @@ delete(ledit_view *view, char *text, size_t len) {
return err_invalid_key(view);
} else {
struct key_stack_elem *e = push_key_stack();
- e->key = KEY_MOTIONALLOWED;
+ e->key = KEY_MOTIONALLOWED|KEY_NUMBERALLOWED;
e->count = num;
e->motion_cb = &delete_cb;
}
t@@ -1561,6 +1567,7 @@ move_cursor_left_right(ledit_view *view, int dir, int al…
} else if (view->mode == NORMAL) {
view_set_line_cursor_attrs(view, view->cur_line, view-…
}
+ view->redraw = 1;
discard_repetition_stack();
}
clear_key_stack();
t@@ -1683,6 +1690,7 @@ move_cursor_up_down(ledit_view *view, int dir) {
} else if (view->mode == NORMAL) {
view_set_line_cursor_attrs(view, view->cur_line, view-…
}
+ view->redraw = 1;
discard_repetition_stack();
}
clear_key_stack();
t@@ -1951,6 +1959,7 @@ jump_to_mark(ledit_view *view, char *text, size_t len) {
(void)text;
(void)len;
grab_char_cb = &jump_to_mark_cb;
+ /* FIXME: should it be discarded here? */
discard_repetition_stack();
return (struct action){ACTION_NONE, NULL};
}
t@@ -2061,7 +2070,7 @@ search_str_backwards(char *haystack, size_t hlen, char *…
size_t new_index = start_index;
for (; new_index > 0; new_index--) {
if (!strncmp(haystack + new_index - 1, needle, nlen)) {
- *ret = new_index;
+ *ret = new_index - 1;
return 0;
}
}
t@@ -2189,6 +2198,7 @@ replace_cb(ledit_view *view, char *text, size_t len) {
CHECK_VIEW_LOCKED(view);
size_t start_index = view->cur_index;
/* FIXME: replace with (key repeat) * text instead of just text */
+ /* FIXME: cursor pos or char? */
size_t end_index = view_next_cursor_pos(
view, view->cur_line, view->cur_index, 1
);
t@@ -2339,7 +2349,10 @@ basic_key_handler(ledit_view *view, XEvent *event, int …
if (found && (type & KEY_ENSURE_CURSOR_SHOWN))
view_ensure_cursor_shown(view);
- if (!found && n > 0)
+ if (!found && n > 0) {
window_show_message(view->window, "Invalid key", -1);
+ discard_repetition_stack();
+ clear_key_stack();
+ }
return act;
}
diff --git a/ledit.1 b/ledit.1
t@@ -3,6 +3,9 @@
.\" bigword, etc.
.\" commands - no good way for mapping found
.\" difference between unicode char and grapheme
+.\" x, X currently delete graphemes
+.\" everything assumed to be utf8
+.\" marks sometimes char, sometimes line based
.\"
.\" WARNING: Some parts of this are stolen shamelessly from OpenBSD's
.\" vi(1) manpage!
diff --git a/view.c b/view.c
t@@ -1191,7 +1191,7 @@ view_delete_range_base(
size_t new_line = 0, new_byte = 0;
ledit_assert(line_index1 < view->lines_num);
ledit_assert(line_index2 < view->lines_num);
- ledit_range cur_range = {0, 0, 0, 0};
+ ledit_range cur_range = {view->cur_line, view->cur_index, 0, 0};
/* FIXME: could this be simplified by just calculating the range and t…
the non-line-based version? */
if (delmode == DELETE_HARDLINE) {
t@@ -1443,8 +1443,9 @@ view_delete_range_base(
rgl1, rgb1, rgl2, rgb2, text_ret
);
}
- cur_range.line1 = view->cur_line;
- cur_range.byte1 = view->cur_index;
+ /* note: line1/byte1 need to be set at the top since deleting text
+ might change the current line/byte of the view through the notify
+ functions */
cur_range.line2 = new_line;
cur_range.byte2 = new_byte;
undo_change_last_cur_range(view->buffer->undo, cur_range);
You are viewing proxied material from lumidify.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.