To: vim_dev@googlegroups.com Subject: Patch 8.1.2140 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.2140 Problem: "gk" and "gj" do not work correctly in number column. Solution: Allow for a negative "curswant". (Zach Wegner, closes #4969) Files: src/testdir/test_normal.vim, src/misc2.c, src/normal.c *** ../vim-8.1.2139/src/testdir/test_normal.vim 2019-09-24 22:47:42.578098633 +0200 --- src/testdir/test_normal.vim 2019-10-12 16:00:01.759345020 +0200 *************** *** 2654,2657 **** --- 2654,2682 ---- call assert_equal(95, virtcol('.')) bw! bw! + + " needs 80 column new window + new + vert 80new + set number + set numberwidth=10 + set cpoptions+=n + put =[repeat('0',90), repeat('1',90)] + norm! 075l + call assert_equal(76, col('.')) + norm! gk + call assert_equal(1, col('.')) + norm! gk + call assert_equal(76, col('.')) + norm! gk + call assert_equal(1, col('.')) + norm! gj + call assert_equal(76, col('.')) + norm! gj + call assert_equal(1, col('.')) + norm! gj + call assert_equal(76, col('.')) + bw! + bw! + set cpoptions& number& numberwidth& endfunc *** ../vim-8.1.2139/src/misc2.c 2019-09-28 15:51:33.818357228 +0200 --- src/misc2.c 2019-10-12 15:57:06.400003966 +0200 *************** *** 119,128 **** static int coladvance2( pos_T *pos, ! int addspaces, /* change the text to achieve our goal? */ ! int finetune, /* change char offset for the exact column */ ! colnr_T wcol) /* column to move to */ { int idx; char_u *ptr; char_u *line; --- 119,129 ---- static int coladvance2( pos_T *pos, ! int addspaces, // change the text to achieve our goal? ! int finetune, // change char offset for the exact column ! colnr_T wcol_arg) // column to move to (can be negative) { + colnr_T wcol = wcol_arg; int idx; char_u *ptr; char_u *line; *************** *** 136,142 **** one_more = (State & INSERT) || restart_edit != NUL || (VIsual_active && *p_sel != 'o') ! || ((ve_flags & VE_ONEMORE) && wcol < MAXCOL) ; line = ml_get_buf(curbuf, pos->lnum, FALSE); if (wcol >= MAXCOL) --- 137,143 ---- one_more = (State & INSERT) || restart_edit != NUL || (VIsual_active && *p_sel != 'o') ! || ((ve_flags & VE_ONEMORE) && wcol < MAXCOL); line = ml_get_buf(curbuf, pos->lnum, FALSE); if (wcol >= MAXCOL) *************** *** 206,211 **** --- 207,213 ---- if (virtual_active() && addspaces + && wcol >= 0 && ((col != wcol && col != wcol + 1) || csize > 1)) { /* 'virtualedit' is set: The difference between wcol and col is *************** *** 305,311 **** if (has_mbyte) mb_adjustpos(curbuf, pos); ! if (col < wcol) return FAIL; return OK; } --- 307,313 ---- if (has_mbyte) mb_adjustpos(curbuf, pos); ! if (wcol < 0 || col < wcol) return FAIL; return OK; } *** ../vim-8.1.2139/src/normal.c 2019-09-30 23:12:10.874289153 +0200 --- src/normal.c 2019-10-12 15:59:32.791449044 +0200 *************** *** 2499,2515 **** n = ((linelen - width1 - 1) / width2 + 1) * width2 + width1; else n = width1; ! if (curwin->w_curswant > (colnr_T)n + 1) ! curwin->w_curswant -= ((curwin->w_curswant - n) / width2 + 1) ! * width2; } while (dist--) { if (dir == BACKWARD) { ! if ((long)curwin->w_curswant > width2) ! // move back within line curwin->w_curswant -= width2; else { --- 2499,2516 ---- n = ((linelen - width1 - 1) / width2 + 1) * width2 + width1; else n = width1; ! if (curwin->w_curswant >= (colnr_T)n) ! curwin->w_curswant = n - 1; } while (dist--) { if (dir == BACKWARD) { ! if ((long)curwin->w_curswant >= width1) ! // Move back within the line. This can give a negative value ! // for w_curswant if width1 < width2 (with cpoptions+=n), ! // which will get clipped to column 0. curwin->w_curswant -= width2; else { *************** *** 2557,2562 **** --- 2558,2569 ---- } curwin->w_cursor.lnum++; curwin->w_curswant %= width2; + // Check if the cursor has moved below the number display + // when width1 < width2 (with cpoptions+=n). Subtract width2 + // to get a negative value for w_curswant, which will get + // clipped to column 0. + if (curwin->w_curswant >= width1) + curwin->w_curswant -= width2; linelen = linetabsize(ml_get_curline()); } } *** ../vim-8.1.2139/src/version.c 2019-10-12 15:36:06.236897202 +0200 --- src/version.c 2019-10-12 16:00:34.915225464 +0200 *************** *** 755,756 **** --- 755,758 ---- { /* Add new patch number below this line */ + /**/ + 2140, /**/ -- You can be stopped by the police for biking over 65 miles per hour. You are not allowed to walk across a street on your hands. [real standing laws in Connecticut, United States of America] /// 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 ///