]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.4785: Visual mode not stopped if win_gotoid() goes to other buffer v8.2.4785
authorBram Moolenaar <Bram@vim.org>
Mon, 18 Apr 2022 17:32:19 +0000 (18:32 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 18 Apr 2022 17:32:19 +0000 (18:32 +0100)
Problem:    Visual mode not stopped early enough if win_gotoid() goes to
            another buffer. (Sergey Vlasov)
Solution:   Stop Visual mode before jumping to another buffer. (closes #10217)

src/evalwindow.c
src/testdir/dumps/Test_win_gotoid_1.dump [new file with mode: 0644]
src/testdir/dumps/Test_win_gotoid_2.dump [new file with mode: 0644]
src/testdir/dumps/Test_win_gotoid_3.dump [new file with mode: 0644]
src/testdir/test_vim9_builtin.vim
src/version.c

index f6bc79f9e8b1b713e55092147617d154f7b9037d..53fd1e3569d959560e399d35dfa4e40e0c1d46a6 100644 (file)
@@ -817,6 +817,9 @@ f_win_gotoid(typval_T *argvars, typval_T *rettv)
     FOR_ALL_TAB_WINDOWS(tp, wp)
        if (wp->w_id == id)
        {
+           // When jumping to another buffer stop Visual mode.
+           if (VIsual_active && wp->w_buffer != curbuf)
+               end_visual_mode();
            goto_tabpage_win(tp, wp);
            rettv->vval.v_number = 1;
            return;
diff --git a/src/testdir/dumps/Test_win_gotoid_1.dump b/src/testdir/dumps/Test_win_gotoid_1.dump
new file mode 100644 (file)
index 0000000..0faf579
--- /dev/null
@@ -0,0 +1,15 @@
+|0+0&#ffffff0| @73
+|1| @73
+|2| @73
+|3| @73
+|4| @73
+|[+1&&|N|o| |N|a|m|e|]| @47|1|,|1| @11|T|o|p
+>2+0&&|1| @72
+|2@1| @72
+|2|3| @72
+|2|4| @72
+|2|5| @72
+|2|6| @72
+|[+3&&|N|o| |N|a|m|e|]| @47|1|,|1| @11|T|o|p
+|r+0&&|e|g| |=| |"|f|o@1|"| @63
+@75
diff --git a/src/testdir/dumps/Test_win_gotoid_2.dump b/src/testdir/dumps/Test_win_gotoid_2.dump
new file mode 100644 (file)
index 0000000..7a778f5
--- /dev/null
@@ -0,0 +1,15 @@
+|0+0&#ffffff0| @73
+|1| @73
+|2| @73
+|3| @73
+|4| @73
+|[+1&&|N|o| |N|a|m|e|]| @47|1|,|1| @11|T|o|p
+|2+0&&|1| @72
+|2@1| @72
+|2+0&#e0e0e08>3+0&#ffffff0| @72
+|2|4| @72
+|2|5| @72
+|2|6| @72
+|[+3&&|N|o| |N|a|m|e|]| @47|3|,|2| @11|T|o|p
+|r+0&&|e|g| |=| |"|2|3|"| @64
+|-+2&&@1| |V|I|S|U|A|L| |-@1| +0&&@51|2| @9
diff --git a/src/testdir/dumps/Test_win_gotoid_3.dump b/src/testdir/dumps/Test_win_gotoid_3.dump
new file mode 100644 (file)
index 0000000..2de7346
--- /dev/null
@@ -0,0 +1,15 @@
+|0+0&#ffffff0| @73
+|1| @73
+>2| @73
+|3| @73
+|4| @73
+|[+3&&|N|o| |N|a|m|e|]| @47|3|,|1| @11|T|o|p
+|2+0&&|1| @72
+|2@1| @72
+|2|3| @72
+|2|4| @72
+|2|5| @72
+|2|6| @72
+|[+1&&|N|o| |N|a|m|e|]| @47|3|,|1| @11|T|o|p
+|r+0&&|e|g| |=| |"|2|3|"| @64
+@75
index 9e60666d3dc3ed78ccb37cffafb83eb317284740..7dde24c68ceab4b49fa71d153c1ff2c20d3ac2bf 100644 (file)
@@ -1,6 +1,7 @@
 " Test using builtin functions in the Vim9 script language.
 
 source check.vim
+source screendump.vim
 import './vim9.vim' as v9
 
 " Test for passing too many or too few arguments to builtin functions
@@ -4493,6 +4494,46 @@ def Test_win_gotoid()
   v9.CheckDefAndScriptFailure(['win_gotoid("x")'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1'])
 enddef
 
+func Test_win_gotoid_in_mapping()
+  CheckScreendump
+
+  if has('clipboard_working')
+    let @* = 'foo'
+    let lines =<< trim END
+        set cmdheight=2
+        func On_click()
+          call win_gotoid(getmousepos().winid)
+          execute "norm! \<LeftMouse>"
+        endfunc
+        noremap <LeftMouse> <Cmd>call On_click()<CR>
+
+        autocmd SafeState * echo 'reg = "' .. @* .. '"'
+
+        call setline(1, range(20))
+        set nomodified
+        botright new
+        call setline(1, range(21, 40))
+        set nomodified
+
+        func Click()
+          map <silent> <F3> :call test_setmouse(3, 1)<CR>
+         call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
+        endfunc
+    END
+    call writefile(lines, 'Xgotoscript')
+    let buf = RunVimInTerminal('-S Xgotoscript', #{rows: 15, wait_for_ruler: 0})
+    call VerifyScreenDump(buf, 'Test_win_gotoid_1', {})
+    call term_sendkeys(buf, "3Gvl")
+    call VerifyScreenDump(buf, 'Test_win_gotoid_2', {})
+
+    call term_sendkeys(buf, ":call Click()\<CR>")
+    call VerifyScreenDump(buf, 'Test_win_gotoid_3', {})
+
+    call StopVimInTerminal(buf)
+    call delete('Xgotoscript')
+  endif
+endfunc
+
 def Test_win_id2tabwin()
   v9.CheckDefAndScriptFailure(['win_id2tabwin("x")'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1'])
 enddef
index 285bced26de46fa72b17a6fc9915128b995c90b6..f3f88125b7c4aece3c640fae310ca7631cf48318 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4785,
 /**/
     4784,
 /**/