aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-03-17 09:44:10 +0800
committerGitHub <noreply@github.com>2024-03-17 09:44:10 +0800
commitc52dfb6e840827a2de713e40ea8506491ec7ce0b (patch)
treee1fc46dfda47005588439c769cc4e75a51a08ca3
parentd114dbe9f79c1382298b04319b7ded88e95e3ee8 (diff)
downloadrneovim-c52dfb6e840827a2de713e40ea8506491ec7ce0b.tar.gz
rneovim-c52dfb6e840827a2de713e40ea8506491ec7ce0b.tar.bz2
rneovim-c52dfb6e840827a2de713e40ea8506491ec7ce0b.zip
fix(normal): don't check conceal when pressing 'r' (#27892)
Problem: Cursor line is unconcealed when pressing 'r' in Normal mode when 'concealcursor' contains 'n' but not 'i'. Solution: Don't check conceal when pressing 'r' in Normal mode. Vim doesn't have this problem because it doesn't call redrawWinline() in conceal_check_cursor_line() and instead sets a global variable.
-rw-r--r--src/nvim/normal.c2
-rw-r--r--src/nvim/ui.c11
-rw-r--r--test/functional/ui/syntax_conceal_spec.lua12
3 files changed, 23 insertions, 2 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c
index 3603a054b6..12f0bb631e 100644
--- a/src/nvim/normal.c
+++ b/src/nvim/normal.c
@@ -748,7 +748,7 @@ static void normal_get_additional_char(NormalState *s)
bool langmap_active = false; // using :lmap mappings
if (repl) {
State = MODE_REPLACE; // pretend Replace mode
- ui_cursor_shape(); // show different cursor shape
+ ui_cursor_shape_no_check_conceal(); // show different cursor shape
}
if (lang && curbuf->b_p_iminsert == B_IMODE_LMAP) {
// Allow mappings defined with ":lmap".
diff --git a/src/nvim/ui.c b/src/nvim/ui.c
index bddcf98b53..506bb93f5b 100644
--- a/src/nvim/ui.c
+++ b/src/nvim/ui.c
@@ -624,7 +624,7 @@ void ui_check_mouse(void)
/// Check if current mode has changed.
///
/// May update the shape of the cursor.
-void ui_cursor_shape(void)
+void ui_cursor_shape_no_check_conceal(void)
{
if (!full_screen) {
return;
@@ -635,6 +635,15 @@ void ui_cursor_shape(void)
ui_mode_idx = new_mode_idx;
pending_mode_update = true;
}
+}
+
+/// Check if current mode has changed.
+///
+/// May update the shape of the cursor.
+/// With concealing on, may conceal or unconceal the cursor line.
+void ui_cursor_shape(void)
+{
+ ui_cursor_shape_no_check_conceal();
conceal_check_cursor_line();
}
diff --git a/test/functional/ui/syntax_conceal_spec.lua b/test/functional/ui/syntax_conceal_spec.lua
index 5afc7dfe6c..ccf758bc07 100644
--- a/test/functional/ui/syntax_conceal_spec.lua
+++ b/test/functional/ui/syntax_conceal_spec.lua
@@ -435,6 +435,18 @@ describe('Screen', function()
{0:~ }|*3
|
]])
+
+ feed('r')
+ screen:expect_unchanged()
+
+ feed('m')
+ screen:expect([[
+ ^moo {1:b} bar {1:b} eggs |
+ foo {1:b} bar {1:b} eggs |*4
+ |
+ {0:~ }|*3
+ |
+ ]])
end)
it('and open line', function()