To: vim_dev@googlegroups.com Subject: Patch 8.1.0514 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0514 Problem: CTRL-W ^ does not work when alternate buffer has no name. Solution: Use another method to split and edit the alternate buffer. (Jason Franklin) Files: src/testdir/test_normal.vim, src/testdir/test_window_cmd.vim, src/normal.c, src/window.c, runtime/doc/windows.txt *** ../vim-8.1.0513/src/testdir/test_normal.vim 2018-09-03 22:08:05.676736128 +0200 --- src/testdir/test_normal.vim 2018-11-10 15:55:36.238319451 +0100 *************** *** 1,11 **** " Test for various Normal mode commands ! func! Setup_NewWindow() 10new call setline(1, range(1,100)) endfunc ! func! MyFormatExpr() " Adds '->$' at lines having numbers followed by trailing whitespace for ln in range(v:lnum, v:lnum+v:count-1) let line = getline(ln) --- 1,11 ---- " Test for various Normal mode commands ! func Setup_NewWindow() 10new call setline(1, range(1,100)) endfunc ! func MyFormatExpr() " Adds '->$' at lines having numbers followed by trailing whitespace for ln in range(v:lnum, v:lnum+v:count-1) let line = getline(ln) *************** *** 15,21 **** endfor endfunc ! func! CountSpaces(type, ...) " for testing operatorfunc " will count the number of spaces " and return the result in g:a --- 15,21 ---- endfor endfunc ! func CountSpaces(type, ...) " for testing operatorfunc " will count the number of spaces " and return the result in g:a *************** *** 35,41 **** let @@ = reg_save endfunc ! func! OpfuncDummy(type, ...) " for testing operatorfunc let g:opt=&linebreak --- 35,41 ---- let @@ = reg_save endfunc ! func OpfuncDummy(type, ...) " for testing operatorfunc let g:opt=&linebreak *************** *** 78,84 **** bw! endfunc ! func! Test_normal01_keymodel() call Setup_NewWindow() " Test 1: depending on 'keymodel' does something different 50 --- 78,84 ---- bw! endfunc ! func Test_normal01_keymodel() call Setup_NewWindow() " Test 1: depending on 'keymodel' does something different 50 *************** *** 112,118 **** bw! endfunc ! func! Test_normal02_selectmode() " some basic select mode tests call Setup_NewWindow() 50 --- 112,118 ---- bw! endfunc ! func Test_normal02_selectmode() " some basic select mode tests call Setup_NewWindow() 50 *************** *** 126,132 **** bw! endfunc ! func! Test_normal02_selectmode2() " some basic select mode tests call Setup_NewWindow() 50 --- 126,132 ---- bw! endfunc ! func Test_normal02_selectmode2() " some basic select mode tests call Setup_NewWindow() 50 *************** *** 136,142 **** bw! endfunc ! func! Test_normal03_join() " basic join test call Setup_NewWindow() 50 --- 136,142 ---- bw! endfunc ! func Test_normal03_join() " basic join test call Setup_NewWindow() 50 *************** *** 156,162 **** bw! endfunc ! func! Test_normal04_filter() " basic filter test " only test on non windows platform if has('win32') --- 156,162 ---- bw! endfunc ! func Test_normal04_filter() " basic filter test " only test on non windows platform if has('win32') *************** *** 182,188 **** bw! endfunc ! func! Test_normal05_formatexpr() " basic formatexpr test call Setup_NewWindow() %d_ --- 182,188 ---- bw! endfunc ! func Test_normal05_formatexpr() " basic formatexpr test call Setup_NewWindow() %d_ *************** *** 219,225 **** set formatexpr= endfunc ! func! Test_normal06_formatprg() " basic test for formatprg " only test on non windows platform if has('win32') --- 219,225 ---- set formatexpr= endfunc ! func Test_normal06_formatprg() " basic test for formatprg " only test on non windows platform if has('win32') *************** *** 253,259 **** call delete('Xsed_format.sh') endfunc ! func! Test_normal07_internalfmt() " basic test for internal formmatter to textwidth of 12 let list=range(1,11) call map(list, 'v:val." "') --- 253,259 ---- call delete('Xsed_format.sh') endfunc ! func Test_normal07_internalfmt() " basic test for internal formmatter to textwidth of 12 let list=range(1,11) call map(list, 'v:val." "') *************** *** 267,273 **** bw! endfunc ! func! Test_normal08_fold() " basic tests for foldopen/folddelete if !has("folding") return --- 267,273 ---- bw! endfunc ! func Test_normal08_fold() " basic tests for foldopen/folddelete if !has("folding") return *************** *** 326,332 **** bw! endfunc ! func! Test_normal09_operatorfunc() " Test operatorfunc call Setup_NewWindow() " Add some spaces for counting --- 326,332 ---- bw! endfunc ! func Test_normal09_operatorfunc() " Test operatorfunc call Setup_NewWindow() " Add some spaces for counting *************** *** 356,362 **** bw! endfunc ! func! Test_normal09a_operatorfunc() " Test operatorfunc call Setup_NewWindow() " Add some spaces for counting --- 356,362 ---- bw! endfunc ! func Test_normal09a_operatorfunc() " Test operatorfunc call Setup_NewWindow() " Add some spaces for counting *************** *** 382,388 **** unlet! g:opt endfunc ! func! Test_normal10_expand() " Test for expand() 10new call setline(1, ['1', 'ifooar,,cbar']) --- 382,388 ---- unlet! g:opt endfunc ! func Test_normal10_expand() " Test for expand() 10new call setline(1, ['1', 'ifooar,,cbar']) *************** *** 417,423 **** bw! endfunc ! func! Test_normal11_showcmd() " test for 'showcmd' 10new exe "norm! ofoobar\" --- 417,423 ---- bw! endfunc ! func Test_normal11_showcmd() " test for 'showcmd' 10new exe "norm! ofoobar\" *************** *** 432,438 **** bw! endfunc ! func! Test_normal12_nv_error() " Test for nv_error 10new call setline(1, range(1,5)) --- 432,438 ---- bw! endfunc ! func Test_normal12_nv_error() " Test for nv_error 10new call setline(1, range(1,5)) *************** *** 442,448 **** bw! endfunc ! func! Test_normal13_help() " Test for F1 call assert_equal(1, winnr()) call feedkeys("\", 'txi') --- 442,448 ---- bw! endfunc ! func Test_normal13_help() " Test for F1 call assert_equal(1, winnr()) call feedkeys("\", 'txi') *************** *** 451,457 **** bw! endfunc ! func! Test_normal14_page() " basic test for Ctrl-F and Ctrl-B call Setup_NewWindow() exe "norm! \" --- 451,457 ---- bw! endfunc ! func Test_normal14_page() " basic test for Ctrl-F and Ctrl-B call Setup_NewWindow() exe "norm! \" *************** *** 485,491 **** bw! endfunc ! func! Test_normal14_page_eol() 10new norm oxxxxxxx exe "norm 2\" --- 485,491 ---- bw! endfunc ! func Test_normal14_page_eol() 10new norm oxxxxxxx exe "norm 2\" *************** *** 494,500 **** bw! endfunc ! func! Test_normal15_z_scroll_vert() " basic test for z commands that scroll the window call Setup_NewWindow() 100 --- 494,500 ---- bw! endfunc ! func Test_normal15_z_scroll_vert() " basic test for z commands that scroll the window call Setup_NewWindow() 100 *************** *** 583,589 **** bw! endfunc ! func! Test_normal16_z_scroll_hor() " basic test for z commands that scroll the window 10new 15vsp --- 583,589 ---- bw! endfunc ! func Test_normal16_z_scroll_hor() " basic test for z commands that scroll the window 10new 15vsp *************** *** 649,655 **** bw! endfunc ! func! Test_normal17_z_scroll_hor2() " basic test for z commands that scroll the window " using 'sidescrolloff' setting 10new --- 649,655 ---- bw! endfunc ! func Test_normal17_z_scroll_hor2() " basic test for z commands that scroll the window " using 'sidescrolloff' setting 10new *************** *** 716,722 **** bw! endfunc ! func! Test_normal18_z_fold() " basic tests for foldopen/folddelete if !has("folding") return --- 716,722 ---- bw! endfunc ! func Test_normal18_z_fold() " basic tests for foldopen/folddelete if !has("folding") return *************** *** 1087,1093 **** bw! endfunc ! func! Test_normal19_z_spell() if !has("spell") || !has('syntax') return endif --- 1087,1093 ---- bw! endfunc ! func Test_normal19_z_spell() if !has("spell") || !has('syntax') return endif *************** *** 1241,1247 **** bw! endfunc ! func! Test_normal20_exmode() if !has("unix") " Reading from redirected file doesn't work on MS-Windows return --- 1241,1247 ---- bw! endfunc ! func Test_normal20_exmode() if !has("unix") " Reading from redirected file doesn't work on MS-Windows return *************** *** 1259,1282 **** bw! endfunc ! func! Test_normal21_nv_hat() ! set hidden ! new ! " to many buffers opened already, will not work ! "call assert_fails(":b#", 'E23') ! "call assert_equal('', @#) ! e Xfoobar ! e Xfile2 ! call feedkeys("\", 't') ! call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t')) ! call feedkeys("f\", 't') ! call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t')) ! " clean up ! set nohidden ! bw! endfunc ! func! Test_normal22_zet() " Test for ZZ " let shell = &shell " let &shell = 'sh' --- 1259,1296 ---- bw! endfunc ! func Test_normal21_nv_hat() ! ! " Edit a fresh file and wipe the buffer list so that there is no alternate ! " file present. Next, check for the expected command failures. ! edit Xfoo | %bw ! call assert_fails(':buffer #', 'E86') ! call assert_fails(':execute "normal! \"', 'E23') ! ! " Test for the expected behavior when switching between two named buffers. ! edit Xfoo | edit Xbar ! call feedkeys("\", 'tx') ! call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t')) ! call feedkeys("\", 'tx') ! call assert_equal('Xbar', fnamemodify(bufname('%'), ':t')) ! ! " Test for the expected behavior when only one buffer is named. ! enew | let l:nr = bufnr('%') ! call feedkeys("\", 'tx') ! call assert_equal('Xbar', fnamemodify(bufname('%'), ':t')) ! call feedkeys("\", 'tx') ! call assert_equal('', bufname('%')) ! call assert_equal(l:nr, bufnr('%')) ! ! " Test that no action is taken by "" when an operator is pending. ! edit Xfoo ! call feedkeys("ci\", 'tx') ! call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t')) ! ! %bw! endfunc ! func Test_normal22_zet() " Test for ZZ " let shell = &shell " let &shell = 'sh' *************** *** 1298,1304 **** " let &shell = shell endfunc ! func! Test_normal23_K() " Test for K command new call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd']) --- 1312,1318 ---- " let &shell = shell endfunc ! func Test_normal23_K() " Test for K command new call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd']) *************** *** 1353,1359 **** bw! endfunc ! func! Test_normal24_rot13() " This test uses multi byte characters if !has("multi_byte") return --- 1367,1373 ---- bw! endfunc ! func Test_normal24_rot13() " This test uses multi byte characters if !has("multi_byte") return *************** *** 1371,1377 **** bw! endfunc ! func! Test_normal25_tag() " Testing for CTRL-] g CTRL-] g] " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-] h --- 1385,1391 ---- bw! endfunc ! func Test_normal25_tag() " Testing for CTRL-] g CTRL-] g] " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-] h *************** *** 1438,1444 **** helpclose endfunc ! func! Test_normal26_put() " Test for ]p ]P [p and [P new call append(0, ['while read LINE', 'do', ' ((count++))', ' if [ $? -ne 0 ]; then', " echo 'Error writing file'", ' fi', 'done']) --- 1452,1458 ---- helpclose endfunc ! func Test_normal26_put() " Test for ]p ]P [p and [P new call append(0, ['while read LINE', 'do', ' ((count++))', ' if [ $? -ne 0 ]; then', " echo 'Error writing file'", ' fi', 'done']) *************** *** 1457,1463 **** bw! endfunc ! func! Test_normal27_bracket() " Test for [' [` ]' ]` call Setup_NewWindow() 1,21s/.\+/ & b/ --- 1471,1477 ---- bw! endfunc ! func Test_normal27_bracket() " Test for [' [` ]' ]` call Setup_NewWindow() 1,21s/.\+/ & b/ *************** *** 1508,1514 **** bw! endfunc ! func! Test_normal28_parenthesis() " basic testing for ( and ) new call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here']) --- 1522,1528 ---- bw! endfunc ! func Test_normal28_parenthesis() " basic testing for ( and ) new call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here']) *************** *** 1705,1711 **** bw! endfunc ! func! Test_normal32_g_cmd1() " Test for g*, g# new call append(0, ['abc.x_foo', 'x_foobar.abc']) --- 1719,1725 ---- bw! endfunc ! func Test_normal32_g_cmd1() " Test for g*, g# new call append(0, ['abc.x_foo', 'x_foobar.abc']) *************** *** 1836,1842 **** bw! endfunc ! func! Test_g_ctrl_g() new let a = execute(":norm! g\") --- 1850,1856 ---- bw! endfunc ! func Test_g_ctrl_g() new let a = execute(":norm! g\") *************** *** 2134,2140 **** bw! endfunc ! func! Test_normal42_halfpage() " basic test for Ctrl-D and Ctrl-U call Setup_NewWindow() call assert_equal(5, &scroll) --- 2148,2154 ---- bw! endfunc ! func Test_normal42_halfpage() " basic test for Ctrl-D and Ctrl-U call Setup_NewWindow() call assert_equal(5, &scroll) *************** *** 2202,2208 **** bw! endfunc ! func! Test_normal44_textobjects2() " basic testing for is and as text objects new call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here']) --- 2216,2222 ---- bw! endfunc ! func Test_normal44_textobjects2() " basic testing for is and as text objects new call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here']) *************** *** 2257,2263 **** bw! endfunc ! func! Test_normal45_drop() if !has('dnd') " The ~ register does not exist call assert_beeps('norm! "~') --- 2271,2277 ---- bw! endfunc ! func Test_normal45_drop() if !has('dnd') " The ~ register does not exist call assert_beeps('norm! "~') *************** *** 2275,2281 **** bw! endfunc ! func! Test_normal46_ignore() " This test uses multi byte characters if !has("multi_byte") return --- 2289,2295 ---- bw! endfunc ! func Test_normal46_ignore() " This test uses multi byte characters if !has("multi_byte") return *************** *** 2299,2305 **** bw! endfunc ! func! Test_normal47_visual_buf_wipe() " This was causing a crash or ml_get error. enew! call setline(1,'xxx') --- 2313,2319 ---- bw! endfunc ! func Test_normal47_visual_buf_wipe() " This was causing a crash or ml_get error. enew! call setline(1,'xxx') *************** *** 2313,2319 **** set nomodified endfunc ! func! Test_normal47_autocmd() " disabled, does not seem to be possible currently throw "Skipped: not possible to test cursorhold autocmd while waiting for input in normal_cmd" new --- 2327,2333 ---- set nomodified endfunc ! func Test_normal47_autocmd() " disabled, does not seem to be possible currently throw "Skipped: not possible to test cursorhold autocmd while waiting for input in normal_cmd" new *************** *** 2331,2344 **** bw! endfunc ! func! Test_normal48_wincmd() new exe "norm! \c" call assert_equal(1, winnr('$')) call assert_fails(":norm! \c", "E444") endfunc ! func! Test_normal49_counts() new call setline(1, 'one two three four five six seven eight nine ten') 1 --- 2345,2358 ---- bw! endfunc ! func Test_normal48_wincmd() new exe "norm! \c" call assert_equal(1, winnr('$')) call assert_fails(":norm! \c", "E444") endfunc ! func Test_normal49_counts() new call setline(1, 'one two three four five six seven eight nine ten') 1 *************** *** 2347,2353 **** bw! endfunc ! func! Test_normal50_commandline() if !has("timers") || !has("cmdline_hist") return endif --- 2361,2367 ---- bw! endfunc ! func Test_normal50_commandline() if !has("timers") || !has("cmdline_hist") return endif *************** *** 2378,2384 **** bw! endfunc ! func! Test_normal51_FileChangedRO() if !has("autocmd") return endif --- 2392,2398 ---- bw! endfunc ! func Test_normal51_FileChangedRO() if !has("autocmd") return endif *************** *** 2398,2404 **** call delete("Xreadonly.log") endfunc ! func! Test_normal52_rl() if !has("rightleft") return endif --- 2412,2418 ---- call delete("Xreadonly.log") endfunc ! func Test_normal52_rl() if !has("rightleft") return endif *************** *** 2431,2437 **** bw! endfunc ! func! Test_normal53_digraph() if !has('digraphs') return endif --- 2445,2451 ---- bw! endfunc ! func Test_normal53_digraph() if !has('digraphs') return endif *************** *** 2532,2534 **** --- 2546,2571 ---- %bwipe! let &ul = save_ul endfunc + + func Test_nv_hat_count() + %bwipeout! + let l:nr = bufnr('%') + 1 + call assert_fails(':execute "normal! ' . l:nr . '\"', 'E92') + + edit Xfoo + let l:foo_nr = bufnr('Xfoo') + + edit Xbar + let l:bar_nr = bufnr('Xbar') + + " Make sure we are not just using the alternate file. + edit Xbaz + + call feedkeys(l:foo_nr . "\", 'tx') + call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t')) + + call feedkeys(l:bar_nr . "\", 'tx') + call assert_equal('Xbar', fnamemodify(bufname('%'), ':t')) + + %bwipeout! + endfunc *** ../vim-8.1.0513/src/testdir/test_window_cmd.vim 2018-05-10 18:19:36.000000000 +0200 --- src/testdir/test_window_cmd.vim 2018-11-10 15:47:05.614643165 +0100 *************** *** 103,117 **** bw endfunc func Test_window_split_edit_alternate() - e Xa - e Xb wincmd ^ ! call assert_equal('Xa', bufname(winbufnr(1))) ! call assert_equal('Xb', bufname(winbufnr(2))) ! bw Xa Xb endfunc func Test_window_preview() --- 103,167 ---- bw endfunc + " Test the ":wincmd ^" and "^" commands. func Test_window_split_edit_alternate() + " Test for failure when the alternate buffer/file no longer exists. + edit Xfoo | %bw + call assert_fails(':wincmd ^', 'E23') + + " Test for the expected behavior when we have two named buffers. + edit Xfoo | edit Xbar wincmd ^ ! call assert_equal('Xfoo', bufname(winbufnr(1))) ! call assert_equal('Xbar', bufname(winbufnr(2))) ! only ! ! " Test for the expected behavior when the alternate buffer is not named. ! enew | let l:nr1 = bufnr('%') ! edit Xfoo | let l:nr2 = bufnr('%') ! wincmd ^ ! call assert_equal(l:nr1, winbufnr(1)) ! call assert_equal(l:nr2, winbufnr(2)) ! only ! ! " Test the Normal mode command. ! call feedkeys("\\", 'tx') ! call assert_equal(l:nr2, winbufnr(1)) ! call assert_equal(l:nr1, winbufnr(2)) ! ! %bw! ! endfunc ! ! " Test the ":[count]wincmd ^" and "[count]^" commands. ! func Test_window_split_edit_bufnr() ! ! %bwipeout ! let l:nr = bufnr('%') + 1 ! call assert_fails(':execute "normal! ' . l:nr . '\\"', 'E92') ! call assert_fails(':' . l:nr . 'wincmd ^', 'E16') ! call assert_fails(':0wincmd ^', 'E16') ! ! edit Xfoo | edit Xbar | edit Xbaz ! let l:foo_nr = bufnr('Xfoo') ! let l:bar_nr = bufnr('Xbar') ! let l:baz_nr = bufnr('Xbaz') ! ! call feedkeys(l:foo_nr . "\\", 'tx') ! call assert_equal('Xfoo', bufname(winbufnr(1))) ! call assert_equal('Xbaz', bufname(winbufnr(2))) ! only ! ! call feedkeys(l:bar_nr . "\\", 'tx') ! call assert_equal('Xbar', bufname(winbufnr(1))) ! call assert_equal('Xfoo', bufname(winbufnr(2))) ! only ! ! execute l:baz_nr . 'wincmd ^' ! call assert_equal('Xbaz', bufname(winbufnr(1))) ! call assert_equal('Xbar', bufname(winbufnr(2))) ! %bw! endfunc func Test_window_preview() *************** *** 322,328 **** set equalalways vsplit windo split ! split wincmd J " now we have a frame top-left with two windows, a frame top-right with two " windows and a frame at the bottom, full-width. --- 372,378 ---- set equalalways vsplit windo split ! split wincmd J " now we have a frame top-left with two windows, a frame top-right with two " windows and a frame at the bottom, full-width. *** ../vim-8.1.0513/src/normal.c 2018-09-30 21:43:17.199693265 +0200 --- src/normal.c 2018-11-10 15:47:05.610643198 +0100 *************** *** 5496,5502 **** } /* ! * CTRL-^ command, short for ":e #" */ static void nv_hat(cmdarg_T *cap) --- 5496,5503 ---- } /* ! * CTRL-^ command, short for ":e #". Works even when the alternate buffer is ! * not named. */ static void nv_hat(cmdarg_T *cap) *** ../vim-8.1.0513/src/window.c 2018-09-30 21:43:17.207693209 +0200 --- src/window.c 2018-11-10 15:53:58.843143892 +0100 *************** *** 151,158 **** case '^': CHECK_CMDWIN; reset_VIsual_and_resel(); /* stop Visual mode */ ! cmd_with_count("split #", cbuf, sizeof(cbuf), Prenum); ! do_cmdline_cmd(cbuf); break; /* open new window */ --- 151,171 ---- case '^': CHECK_CMDWIN; reset_VIsual_and_resel(); /* stop Visual mode */ ! ! if (buflist_findnr(Prenum == 0 ! ? curwin->w_alt_fnum : Prenum) == NULL) ! { ! if (Prenum == 0) ! EMSG(_(e_noalt)); ! else ! EMSGN(_("E92: Buffer %ld not found"), Prenum); ! break; ! } ! ! if (!curbuf_locked() && win_split(0, 0) == OK) ! (void)buflist_getfile( ! Prenum == 0 ? curwin->w_alt_fnum : Prenum, ! (linenr_T)0, GETF_ALT, FALSE); break; /* open new window */ *** ../vim-8.1.0513/runtime/doc/windows.txt 2018-05-17 13:42:04.000000000 +0200 --- runtime/doc/windows.txt 2018-11-10 15:47:05.614643165 +0100 *************** *** 81,86 **** --- 81,90 ---- functions can be used to convert between the window/tab number and the identifier. There is also the window number, which may change whenever windows are opened or closed, see |winnr()|. + The window number is only valid in one specific tab. The window ID is valid + across tabs. For most functions that take a window ID or a window number, the + window number only applies to the current tab, while the window ID can refer + to a window in any tab. Each buffer has a unique number and the number will not change within a Vim session. The |bufnr()| and |bufname()| functions can be used to convert *************** *** 218,231 **** |:find|. Doesn't split if {file} is not found. CTRL-W CTRL-^ *CTRL-W_CTRL-^* *CTRL-W_^* ! CTRL-W ^ Does ":split #", split window in two and edit alternate file. ! When a count is given, it becomes ":split #N", split window ! and edit buffer N. *CTRL-W_:* ! CTRL-W : Does the same as typing |:| : edit a command line. Useful in a terminal window, where all Vim commands must be preceded with ! CTRL-W or 'termkey'. Note that the 'splitbelow' and 'splitright' options influence where a new window will appear. --- 222,237 ---- |:find|. Doesn't split if {file} is not found. CTRL-W CTRL-^ *CTRL-W_CTRL-^* *CTRL-W_^* ! CTRL-W ^ Split the current window in two and edit the alternate file. ! When a count N is given, split the current window and edit ! buffer N. Similar to ":sp #" and ":sp #N", but it allows the ! other buffer to be unnamed. This command matches the behavior ! of |CTRL-^|, except that it splits a window first. *CTRL-W_:* ! CTRL-W : Does the same as typing |:| - enter a command line. Useful in a terminal window, where all Vim commands must be preceded with ! CTRL-W or 'termwinkey'. Note that the 'splitbelow' and 'splitright' options influence where a new window will appear. *** ../vim-8.1.0513/src/version.c 2018-11-05 21:21:29.800286334 +0100 --- src/version.c 2018-11-10 15:49:12.537568074 +0100 *************** *** 794,795 **** --- 794,797 ---- { /* Add new patch number below this line */ + /**/ + 514, /**/ -- The question is: What do you do with your life? The wrong answer is: Become the richest guy in the graveyard. (billionaire and Oracle founder Larry Ellison) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///