Loading ...
Sorry, an error occurred while loading the content.

77617Re: Buggy "gj" behavior with breakindent and showbreak

Expand Messages
  • Christian Brabandt
    Aug 29, 2014
    • 0 Attachment
      On Do, 28 Aug 2014, Christian Brabandt wrote:

      > On Do, 28 Aug 2014, Nazri Ramliy wrote:
      >
      > > 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
      > this:
      > :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.
      > */
      > validate_virtcol();
      > - 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

      Better would be, to check, that the cursor is actually on a line, where
      'sbr' is set, so here is an update:

      diff --git a/src/normal.c b/src/normal.c
      --- 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.
      */
      validate_virtcol();
      - 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


      Best,
      Christian
      --
      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.
    • Show all 3 messages in this topic