There is a bug in the 'cursorbind' feature of Vim 7.3.470 when 'virtualedit' is "all". The cursor position in the inactive window(s) is supposed to track the cursor position in the active window so that when one of the inactive windows is entered, the cursor position in that window will match the position in the previous active window.
What happens instead is that if the user has been moving the cursor around in the region to the right of the ends of the lines, entering another window will cause the cursor to jump to a column far to the right of the correct column, often to a column number in the hundreds or thousands. One way to observe this bug is with the following command. vim -O2 -N -u NONE -c 'set ruler' -c 'windo set cursorbind ve=all' -c 'normal Iline' Scroll the cursor back and forth in the empty region to the right of "line" and observe the rulers in the two status lines. The column number in the right window will accurately follow the cursor position while the column number in the left window will continually increase. When Vim updates the cursor location, it keeps separate values for where the cursor would be in the actual line and where it is in the "virtual line". One of Vim's functions was not properly copying this latter value from the active window to the inactive windows. The attached patch fixes this problem. The patch is in two formats. The move.c.hgdiff file is the output of "hg diff" and the move.c.diff-c file is a context diff. Regards, Gary -- 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
diff -r b3ccae22bae7 src/move.c --- a/src/move.c Wed Mar 07 22:55:21 2012 +0100 +++ b/src/move.c Fri Mar 09 18:23:52 2012 -0800 @@ -2844,6 +2844,7 @@ { linenr_T line = curwin->w_cursor.lnum; colnr_T col = curwin->w_cursor.col; + colnr_T coladd = curwin->w_cursor.coladd; win_T *old_curwin = curwin; buf_T *old_curbuf = curbuf; int restart_edit_save; @@ -2875,6 +2876,7 @@ # endif curwin->w_cursor.lnum = line; curwin->w_cursor.col = col; + curwin->w_cursor.coladd = coladd; /* Make sure the cursor is in a valid position. Temporarily set * "restart_edit" to allow the cursor to be beyond the EOL. */
*** - 2012-03-09 18:23:03.407497626 -0800 --- move.c 2012-03-09 10:47:07.075133000 -0800 *************** *** 2844,2849 **** --- 2844,2850 ---- { linenr_T line = curwin->w_cursor.lnum; colnr_T col = curwin->w_cursor.col; + colnr_T coladd = curwin->w_cursor.coladd; win_T *old_curwin = curwin; buf_T *old_curbuf = curbuf; int restart_edit_save; *************** *** 2875,2880 **** --- 2876,2882 ---- # endif curwin->w_cursor.lnum = line; curwin->w_cursor.col = col; + curwin->w_cursor.coladd = coladd; /* Make sure the cursor is in a valid position. Temporarily set * "restart_edit" to allow the cursor to be beyond the EOL. */