tFix positioning of cursor after deleting characters - 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 b4ed6ddf9920d90814860156ed32a40404ece243 | |
parent 3895a14f2fb3bcc35ba842e259074a67adddb8a1 | |
Author: lumidify <[email protected]> | |
Date: Fri, 14 May 2021 21:22:31 +0200 | |
Fix positioning of cursor after deleting characters | |
Diffstat: | |
M buffer.c | 28 +++++++++++++++++++--------- | |
1 file changed, 19 insertions(+), 9 deletions(-) | |
--- | |
diff --git a/buffer.c b/buffer.c | |
t@@ -494,15 +494,6 @@ ledit_delete_range( | |
} | |
delete_line_section(buffer, line_index1, b1, b2 - b1); | |
*new_line_ret = line_index1; | |
- ledit_line *ll = ledit_get_line(buffer, line_index1); | |
- /* FIXME: where should this be done? */ | |
- /* FIXME: also do this below in the else statement */ | |
- if (buffer->state->mode == NORMAL && b1 == ll->len && … | |
- /* FIXME: use grapheme instead of character! */ | |
- b1 = ll->len - 1; | |
- while (b1 > 0 && ((ll->text[b1] & 0xC0) == 0x8… | |
- b1--; | |
- } | |
*new_byte_ret = b1; | |
} else { | |
int l1, l2, b1, b2; | |
t@@ -531,5 +522,24 @@ ledit_delete_range( | |
*new_byte_ret = b1; | |
ledit_delete_line_entries(buffer, l1 + 1, l2); | |
} | |
+ /* move back one grapheme if at end of line and in normal mode… | |
+ ledit_line *final_line = ledit_get_line(buffer, *new_line_ret); | |
+ if (buffer->state->mode == NORMAL && | |
+ *new_byte_ret == final_line->len && | |
+ *new_byte_ret > 0) { | |
+ int nattrs; | |
+ const PangoLogAttr *attrs = | |
+ pango_layout_get_log_attrs_readonly(final_line->la… | |
+ int cur = nattrs - 2; | |
+ (*new_byte_ret)--; | |
+ while (*new_byte_ret > 0 && ((final_line->text[*new_by… | |
+ (*new_byte_ret)--; | |
+ while (*new_byte_ret > 0 && cur > 0 && !attrs[cur].is_… | |
+ cur--; | |
+ (*new_byte_ret)--; | |
+ while (*new_byte_ret > 0 && ((final_line->text… | |
+ (*new_byte_ret)--; | |
+ } | |
+ } | |
} | |
} |