Branch: refs/heads/master Author: Jiří Techet techet@gmail.com Committer: Jiří Techet techet@gmail.com Date: Wed, 01 Sep 2021 13:44:09 UTC Commit: 718c7bef7e49b943aa922d7d4901a7644097b527 https://github.com/geany/geany-plugins/commit/718c7bef7e49b943aa922d7d4901a7...
Log Message: ----------- vimode: fix line operation problems when NL is missing at EOF
This patch adds \n if it's missing at the EOF before line operations like yank, delete or paste are parformed to make sure these operations always work the same way. If added, the extra \n is removed from the file when the operation is completed.
Modified Paths: -------------- vimode/src/cmds/edit.c
Modified: vimode/src/cmds/edit.c 45 lines changed, 45 insertions(+), 0 deletions(-) =================================================================== @@ -81,24 +81,60 @@ void cmd_clear_right(CmdContext *c, CmdParams *p) }
+static gboolean insert_eof_nl_if_missing(CmdParams *p) +{ + gint pos = SSM(p->sci, SCI_GETCURRENTPOS, 0, 0); + gint last_line = SSM(p->sci, SCI_GETLINECOUNT, 0, 0); + gint line_start_pos = SSM(p->sci, SCI_POSITIONFROMLINE, last_line, 0); + gint line_end_pos = SSM(p->sci, SCI_GETLINEENDPOSITION, last_line, 0); + + if (line_start_pos == line_end_pos) { + SET_POS(p->sci, line_end_pos, FALSE); + SSM(p->sci, SCI_NEWLINE, 0, 0); + SET_POS(p->sci, pos, FALSE); + return TRUE; + } + return FALSE; +} + + +static void remove_char_from_eof(CmdParams *p) +{ + gint pos = SSM(p->sci, SCI_GETCURRENTPOS, 0, 0); + gint last_line = SSM(p->sci, SCI_GETLINECOUNT, 0, 0); + gint line_end_pos = SSM(p->sci, SCI_GETLINEENDPOSITION, last_line, 0); + + SET_POS(p->sci, line_end_pos, FALSE); + SSM(p->sci, SCI_DELETEBACK, 0, 0); + SET_POS(p->sci, pos, FALSE); +} + + void cmd_delete_line(CmdContext *c, CmdParams *p) { + gboolean nl_inserted = insert_eof_nl_if_missing(p); gint num = get_line_number_rel(p->sci, p->num); gint end = SSM(p->sci, SCI_POSITIONFROMLINE, num, 0);
c->line_copy = TRUE; SSM(p->sci, SCI_COPYRANGE, p->line_start_pos, end); SSM(p->sci, SCI_DELETERANGE, p->line_start_pos, end - p->line_start_pos); + if (nl_inserted) + remove_char_from_eof(p); + goto_nonempty(p->sci, GET_CUR_LINE(p->sci), TRUE); }
void cmd_copy_line(CmdContext *c, CmdParams *p) { + gboolean nl_inserted = insert_eof_nl_if_missing(p); gint num = get_line_number_rel(p->sci, p->num); gint end = SSM(p->sci, SCI_POSITIONFROMLINE, num, 0);
c->line_copy = TRUE; SSM(p->sci, SCI_COPYRANGE, p->line_start_pos, end); + if (nl_inserted) + remove_char_from_eof(p); }
@@ -146,13 +182,17 @@ void cmd_redo(CmdContext *c, CmdParams *p)
static void paste(CmdContext *c, CmdParams *p, gboolean after) { + gboolean nl_inserted = FALSE; gint pos; gint i;
if (c->line_copy) { if (after) + { + nl_inserted = insert_eof_nl_if_missing(p); pos = SSM(p->sci, SCI_POSITIONFROMLINE, p->line+1, 0); + } else pos = p->line_start_pos; } @@ -167,7 +207,12 @@ static void paste(CmdContext *c, CmdParams *p, gboolean after) for (i = 0; i < p->num; i++) SSM(p->sci, SCI_PASTE, 0, 0); if (c->line_copy) + { SET_POS(p->sci, pos, TRUE); + if (nl_inserted) + remove_char_from_eof(p); + goto_nonempty(p->sci, GET_CUR_LINE(p->sci), TRUE); + } else if (!VI_IS_INSERT(vi_get_mode())) SSM(p->sci, SCI_CHARLEFT, 0, 0); }
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
plugins-commits@lists.geany.org