diff --git a/src/charset.c b/src/charset.c index eb8baa9465..984d7653e7 100644 --- a/src/charset.c +++ b/src/charset.c @@ -1296,6 +1296,10 @@ getvcol( posptr = NULL; /* continue until the NUL */ else { + /* Special check for an empty line, which can happen on exit, when + * ml_get_buf() always returns an empty string. */ + if (*ptr == NUL) + pos->col = 0; posptr = ptr + pos->col; #ifdef FEAT_MBYTE if (has_mbyte) diff --git a/src/os_amiga.c b/src/os_amiga.c index 9266380d6d..87fcca97e1 100644 --- a/src/os_amiga.c +++ b/src/os_amiga.c @@ -889,6 +889,8 @@ mch_early_init(void) void mch_exit(int r) { + exiting = TRUE; + if (raw_in) /* put terminal in 'normal' mode */ { settmode(TMODE_COOK); diff --git a/src/os_mswin.c b/src/os_mswin.c index 14fe8c6a22..5f6e11dab6 100644 --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -201,6 +201,8 @@ int _stricoll(char *a, char *b) void mch_exit(int r) { + exiting = TRUE; + display_errors(); ml_close_all(TRUE); /* remove all memfiles */ diff --git a/src/os_win32.c b/src/os_win32.c index d35061fbf1..adbb199b9d 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -2538,8 +2538,9 @@ mch_init(void) void mch_exit(int r) { - stoptermcap(); + exiting = TRUE; + stoptermcap(); if (g_fWindInitCalled) settmode(TMODE_COOK); diff --git a/src/version.c b/src/version.c index e0fa3cb395..5627b3db62 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 307, /**/ 306, /**/ diff --git a/src/window.c b/src/window.c index ee5f7aa8aa..6b7bd353a4 100644 --- a/src/window.c +++ b/src/window.c @@ -5708,7 +5708,10 @@ win_new_height(win_T *wp, int height) wp->w_height = height; wp->w_skipcol = 0; - scroll_to_fraction(wp, prev_height); + /* There is no point in adjusting the scroll position when exiting. Some + * values might be invalid. */ + if (!exiting) + scroll_to_fraction(wp, prev_height); } void