Branch: refs/heads/master Author: Jiří Techet techet@gmail.com Committer: Jiří Techet techet@gmail.com Date: Wed, 24 Nov 2021 15:36:27 UTC Commit: 5a071ebc873dec9b34888a60deb1c24e5ce50ca3 https://github.com/geany/geany-osx/commit/5a071ebc873dec9b34888a60deb1c24e5c...
Log Message: ----------- Add latest vimode fixes
Modified Paths: -------------- geany.modules geany_patches/03-geany_plugins_vimode_eol_eof_fix.patch geany_patches/04-geany_plugins_vimode_caret_fix.patch geany_patches/05-geany_plugins_vimode_numlock_fix.patch
Modified: geany.modules 6 lines changed, 6 insertions(+), 0 deletions(-) =================================================================== @@ -146,6 +146,9 @@ <patch file="https://github.com/geany/geany-osx/raw/master/geany_patches/01-geany_plugins_spellcheck_relocation.patch" strip="1" /> <!-- TODO: remove once merged upstream --> <patch file="https://github.com/geany/geany-osx/raw/master/geany_patches/02-geany_plugins_vimode_height.patch" strip="1" /> + <patch file="https://github.com/geany/geany-osx/raw/master/geany_patches/03-geany_plugins_vimode_eol_eof_fix.patch" strip="1" /> + <patch file="https://github.com/geany/geany-osx/raw/master/geany_patches/04-geany_plugins_vimode_caret_fix.patch" strip="1" /> + <patch file="https://github.com/geany/geany-osx/raw/master/geany_patches/05-geany_plugins_vimode_numlock_fix.patch" strip="1" /> </branch> <dependencies> <dep package="geany-git" /> @@ -163,6 +166,9 @@ <patch file="https://github.com/geany/geany-osx/raw/master/geany_patches/01-geany_plugins_spellcheck_relocation.patch" strip="1" /> <!-- TODO: remove once merged upstream --> <patch file="https://github.com/geany/geany-osx/raw/master/geany_patches/02-geany_plugins_vimode_height.patch" strip="1" /> + <patch file="https://github.com/geany/geany-osx/raw/master/geany_patches/03-geany_plugins_vimode_eol_eof_fix.patch" strip="1" /> + <patch file="https://github.com/geany/geany-osx/raw/master/geany_patches/04-geany_plugins_vimode_caret_fix.patch" strip="1" /> + <patch file="https://github.com/geany/geany-osx/raw/master/geany_patches/05-geany_plugins_vimode_numlock_fix.patch" strip="1" /> </branch> <dependencies> <dep package="geany-release" />
Modified: geany_patches/03-geany_plugins_vimode_eol_eof_fix.patch 54 lines changed, 54 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,54 @@ +From c1e848aca29ef9b673b1378da10cb8e625668779 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ji=C5=99=C3=AD=20Techet?= techet@gmail.com +Date: Tue, 23 Nov 2021 23:17:49 +0100 +Subject: [PATCH] vimode: fix detection of missing EOL at EOF + +The previous code was incorrect. The new code just + +1. Goes to the last position in document +2. Goes one position before that +3. Checks if the lines corresponding to (1) and (2) are identical - in this +case the NL is missing at EOF +--- + vimode/src/cmds/edit.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/vimode/src/cmds/edit.c b/vimode/src/cmds/edit.c +index d23b8e82..8e687257 100644 +--- a/vimode/src/cmds/edit.c ++++ b/vimode/src/cmds/edit.c +@@ -84,12 +84,13 @@ 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); ++ gint eof_pos = SSM(p->sci, SCI_GETLENGTH, 0, 0); ++ gint eof_line_num = SSM(p->sci, SCI_LINEFROMPOSITION, eof_pos, 0); ++ gint before_eof = PREV(p->sci, eof_pos); ++ gint before_eof_line_num = SSM(p->sci, SCI_LINEFROMPOSITION, before_eof, 0); + +- if (line_start_pos == line_end_pos) { +- SET_POS(p->sci, line_end_pos, FALSE); ++ if (eof_line_num == before_eof_line_num) { ++ SET_POS(p->sci, eof_pos, FALSE); + SSM(p->sci, SCI_NEWLINE, 0, 0); + SET_POS(p->sci, pos, FALSE); + return TRUE; +@@ -101,10 +102,9 @@ static gboolean insert_eof_nl_if_missing(CmdParams *p) + 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); ++ gint eof_pos = SSM(p->sci, SCI_GETLENGTH, 0, 0); + +- SET_POS(p->sci, line_end_pos, FALSE); ++ SET_POS(p->sci, eof_pos, FALSE); + SSM(p->sci, SCI_DELETEBACK, 0, 0); + SET_POS(p->sci, pos, FALSE); + } +-- +2.31.1 +
Modified: geany_patches/04-geany_plugins_vimode_caret_fix.patch 65 lines changed, 65 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,65 @@ +From cb28b2f334d38bb78bcb15efd37f2c20172c499b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ji=C5=99=C3=AD=20Techet?= techet@gmail.com +Date: Wed, 24 Nov 2021 00:13:29 +0100 +Subject: [PATCH] vimode: avoid caret position change when inserting EOL at EOF + +When current position is changed in the document and this position is +outside the visibility of the current screen, when returning +back, the call of SCI_GOTOPOS causes window scroll to a different position +than before. + +To avoid this problem, insert_eof_nl_if_missing() and remove_char_from_eof() +avoid setting the position now and, instead, insert/remove the EOL +character using operations that don't change caret position. +--- + vimode/src/cmds/edit.c | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +diff --git a/vimode/src/cmds/edit.c b/vimode/src/cmds/edit.c +index 8e687257..ecdd0dd1 100644 +--- a/vimode/src/cmds/edit.c ++++ b/vimode/src/cmds/edit.c +@@ -83,16 +83,21 @@ 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 eof_pos = SSM(p->sci, SCI_GETLENGTH, 0, 0); + gint eof_line_num = SSM(p->sci, SCI_LINEFROMPOSITION, eof_pos, 0); + gint before_eof = PREV(p->sci, eof_pos); + gint before_eof_line_num = SSM(p->sci, SCI_LINEFROMPOSITION, before_eof, 0); + + if (eof_line_num == before_eof_line_num) { +- SET_POS(p->sci, eof_pos, FALSE); +- SSM(p->sci, SCI_NEWLINE, 0, 0); +- SET_POS(p->sci, pos, FALSE); ++ const gchar *nl = "\n"; ++ gint eol_mode = SSM(p->sci, SCI_GETEOLMODE, 0, 0); ++ if (eol_mode == SC_EOL_CRLF) { ++ nl = "\r\n"; ++ } ++ else if (eol_mode == SC_EOL_CR) { ++ nl = "\r"; ++ } ++ SSM(p->sci, SCI_INSERTTEXT, eof_pos, (sptr_t)nl); + return TRUE; + } + return FALSE; +@@ -101,12 +106,10 @@ static gboolean insert_eof_nl_if_missing(CmdParams *p) + + static void remove_char_from_eof(CmdParams *p) + { +- gint pos = SSM(p->sci, SCI_GETCURRENTPOS, 0, 0); + gint eof_pos = SSM(p->sci, SCI_GETLENGTH, 0, 0); ++ gint before_eof_pos = PREV(p->sci, eof_pos); + +- SET_POS(p->sci, eof_pos, FALSE); +- SSM(p->sci, SCI_DELETEBACK, 0, 0); +- SET_POS(p->sci, pos, FALSE); ++ SSM(p->sci, SCI_DELETERANGE, before_eof_pos, eof_pos - before_eof_pos); + } + + +-- +2.31.1 +
Modified: geany_patches/05-geany_plugins_vimode_numlock_fix.patch 30 lines changed, 30 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,30 @@ +From 856f3f7ceaf54561a6fcca8707fe7ab5b444444c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ji=C5=99=C3=AD=20Techet?= techet@gmail.com +Date: Wed, 24 Nov 2021 15:48:55 +0100 +Subject: [PATCH] vimode: fix escape not working when numlock is on + +It seems that GDK_MOD2_MASK isn't the right modifier to check for +command pressed - its mapping is platform-specific and while this works +on macOS, it has undesirable side-effects on linux. Use GDK_META_MASK +instead which based on my testing seems to do the right thing both on +macOS and linux. +--- + vimode/src/keypress.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/vimode/src/keypress.c b/vimode/src/keypress.c +index 66139a99..525c5ce3 100644 +--- a/vimode/src/keypress.c ++++ b/vimode/src/keypress.c +@@ -26,7 +26,7 @@ KeyPress *kp_from_event_key(GdkEventKey *ev) + KeyPress *kp; + + /* ignore keypresses containing Alt and Command on macOS - no Vim command uses them */ +- if (ev->state & (GDK_MOD1_MASK | GDK_MOD2_MASK)) ++ if (ev->state & (GDK_MOD1_MASK | GDK_META_MASK)) + return NULL; + + switch (ev->keyval) +-- +2.31.1 +
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).