# HG changeset patch # User Bram Moolenaar # Date 1650303904 -7200 # Node ID da28696e53400113ec73dc8d152fee4aa0070569 # Parent 74a4e4c0fc6a4094f83fb4b141ea661a49de3bb4 patch 8.2.4785: Visual mode not stopped if win_gotoid() goes to other buffer Commit: https://github.com/vim/vim/commit/3aca0916f0dba6114ae0f7d5458763a934fe7a02 Author: Bram Moolenaar Date: Mon Apr 18 18:32:19 2022 +0100 patch 8.2.4785: Visual mode not stopped if win_gotoid() goes to other buffer 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) diff --git a/src/evalwindow.c b/src/evalwindow.c --- a/src/evalwindow.c +++ b/src/evalwindow.c @@ -817,6 +817,9 @@ f_win_gotoid(typval_T *argvars, typval_T 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 --- /dev/null +++ b/src/testdir/dumps/Test_win_gotoid_1.dump @@ -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 --- /dev/null +++ b/src/testdir/dumps/Test_win_gotoid_2.dump @@ -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 --- /dev/null +++ b/src/testdir/dumps/Test_win_gotoid_3.dump @@ -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 diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -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! \" + endfunc + noremap call On_click() + + autocmd SafeState * echo 'reg = "' .. @* .. '"' + + call setline(1, range(20)) + set nomodified + botright new + call setline(1, range(21, 40)) + set nomodified + + func Click() + map :call test_setmouse(3, 1) + call feedkeys("\\\", "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()\") + 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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4785, +/**/ 4784, /**/ 4783,