@@ -333,7 +333,7 @@ coladvance2(pos, addspaces, finetune, wcol)
333333#ifdef FEAT_MBYTE
334334 /* prevent from moving onto a trail byte */
335335 if (has_mbyte )
336- mb_adjustpos (pos );
336+ mb_adjustpos (curbuf , pos );
337337#endif
338338
339339 if (col < wcol )
@@ -543,17 +543,27 @@ check_cursor_lnum()
543543 */
544544 void
545545check_cursor_col ()
546+ {
547+ check_cursor_col_win (curwin );
548+ }
549+
550+ /*
551+ * Make sure win->w_cursor.col is valid.
552+ */
553+ void
554+ check_cursor_col_win (win )
555+ win_T * win ;
546556{
547557 colnr_T len ;
548558#ifdef FEAT_VIRTUALEDIT
549- colnr_T oldcol = curwin -> w_cursor .col ;
550- colnr_T oldcoladd = curwin -> w_cursor .col + curwin -> w_cursor .coladd ;
559+ colnr_T oldcol = win -> w_cursor .col ;
560+ colnr_T oldcoladd = win -> w_cursor .col + win -> w_cursor .coladd ;
551561#endif
552562
553- len = (colnr_T )STRLEN (ml_get_curline ( ));
563+ len = (colnr_T )STRLEN (ml_get_buf ( win -> w_buffer , win -> w_cursor . lnum , FALSE ));
554564 if (len == 0 )
555- curwin -> w_cursor .col = 0 ;
556- else if (curwin -> w_cursor .col >= len )
565+ win -> w_cursor .col = 0 ;
566+ else if (win -> w_cursor .col >= len )
557567 {
558568 /* Allow cursor past end-of-line when:
559569 * - in Insert mode or restarting Insert mode
@@ -567,33 +577,33 @@ check_cursor_col()
567577 || (ve_flags & VE_ONEMORE )
568578#endif
569579 || virtual_active ())
570- curwin -> w_cursor .col = len ;
580+ win -> w_cursor .col = len ;
571581 else
572582 {
573- curwin -> w_cursor .col = len - 1 ;
583+ win -> w_cursor .col = len - 1 ;
574584#ifdef FEAT_MBYTE
575- /* prevent cursor from moving on the trail byte */
585+ /* Move the cursor to the head byte. */
576586 if (has_mbyte )
577- mb_adjust_cursor ( );
587+ mb_adjustpos ( win -> w_buffer , & win -> w_cursor );
578588#endif
579589 }
580590 }
581- else if (curwin -> w_cursor .col < 0 )
582- curwin -> w_cursor .col = 0 ;
591+ else if (win -> w_cursor .col < 0 )
592+ win -> w_cursor .col = 0 ;
583593
584594#ifdef FEAT_VIRTUALEDIT
585595 /* If virtual editing is on, we can leave the cursor on the old position,
586596 * only we must set it to virtual. But don't do it when at the end of the
587597 * line. */
588598 if (oldcol == MAXCOL )
589- curwin -> w_cursor .coladd = 0 ;
599+ win -> w_cursor .coladd = 0 ;
590600 else if (ve_flags == VE_ALL )
591601 {
592- if (oldcoladd > curwin -> w_cursor .col )
593- curwin -> w_cursor .coladd = oldcoladd - curwin -> w_cursor .col ;
602+ if (oldcoladd > win -> w_cursor .col )
603+ win -> w_cursor .coladd = oldcoladd - win -> w_cursor .col ;
594604 else
595605 /* avoid weird number when there is a miscalculation or overflow */
596- curwin -> w_cursor .coladd = 0 ;
606+ win -> w_cursor .coladd = 0 ;
597607 }
598608#endif
599609}
0 commit comments