77617Re: Buggy "gj" behavior with breakindent and showbreak
- Aug 29, 2014On Do, 28 Aug 2014, Christian Brabandt wrote:
> On Do, 28 Aug 2014, Nazri Ramliy wrote:Better would be, to check, that the cursor is actually on a line, where
> > Here's how to reproduce it in an 80-column terminal:
> > $ vi --version|head -2
> > VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 27 2014 13:10:11)
> > Included patches: 1-417
> > $ echo $COLUMNS
> > 80
> > $ vi -u NONE -U NONE -c 'exec "normal 6i\<tab>\<esc>31Aa\<esc>A a"' -c
> > 'set breakindent showbreak=\> ' -c 'normal ^'
> > The cursor is now placed on the first "a" character on the first line,
> > preceeded with 6 tabs, and we can see that the last "a" character is
> > breakindent-ed with ">" showbreak character on the "virtual" line due
> > to the breakindent. So far so good.
> > Here's the bug: Pressing "gj" in normal mode should move the cursor to
> > the virtual line below but in this case the cursors jumps to the end
> > of the first line instead.
> Looks like a breakindent bug, but also isn't ;)
> you can also trigger the bug in a 80 column terminal with something like
> :let &sbr=repeat('>', 49)
> Here is a patch:
> diff --git a/src/normal.c b/src/normal.c
> --- a/src/normal.c
> +++ b/src/normal.c
> @@ -4515,7 +4515,8 @@ nv_screengo(oap, dir, dist)
> * screenline or move two screenlines.
> - if (curwin->w_virtcol > curwin->w_curswant
> + if ((curwin->w_virtcol - (*p_sbr != NUL ? vim_strsize(p_sbr) : 0))
> + > curwin->w_curswant
> && (curwin->w_curswant < (colnr_T)width1
> ? (curwin->w_curswant > (colnr_T)width1 / 2)
> : ((curwin->w_curswant - width1) % width2
'sbr' is set, so here is an update:
diff --git a/src/normal.c b/src/normal.c
@@ -4509,13 +4509,20 @@ nv_screengo(oap, dir, dist)
#if defined(FEAT_LINEBREAK) || defined(FEAT_MBYTE)
if (curwin->w_cursor.col > 0 && curwin->w_p_wrap)
+ colnr_T virtcol;
* Check for landing on a character that got split at the end of the
* last line. We want to advance a screenline, not end up in the same
* screenline or move two screenlines.
- if (curwin->w_virtcol > curwin->w_curswant
+ virtcol = curwin->w_virtcol;
+ if (virtcol > (colnr_T)width1 &&
+ *p_sbr != NUL)
+ virtcol -= vim_strsize(p_sbr);
+ if (virtcol > curwin->w_curswant
&& (curwin->w_curswant < (colnr_T)width1
? (curwin->w_curswant > (colnr_T)width1 / 2)
: ((curwin->w_curswant - width1) % width2
Bisher hat der Glaube der Massen noch immer über die Vernunft der wenigen gesiegt.
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
You received this message because you are subscribed to the Google Groups "vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscribe@....
For more options, visit https://groups.google.com/d/optout.
- << Previous post in topic