changeset 30968:35265d9d24df v9.0.0819

patch 9.0.0819 Commit: https://github.com/vim/vim/commit/1577537f109d97a975fda9a899cacfb598617767 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Oct 29 20:01:52 2022 +0100 patch 9.0.0819
author Bram Moolenaar <Bram@vim.org>
date Wed, 02 Nov 2022 11:18:48 +0100
parents eb2638f278bf
children 1a69f54ebb23
files src/buffer.c src/change.c src/fileio.c src/structs.h src/testdir/test_fixeol.vim src/version.c
diffstat 6 files changed, 20 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -790,6 +790,8 @@ buf_clear_file(buf_T *buf)
     buf->b_ml.ml_line_count = 1;
     unchanged(buf, TRUE, TRUE);
     buf->b_shortname = FALSE;
+    buf->b_p_eof = FALSE;
+    buf->b_start_eof = FALSE;
     buf->b_p_eol = TRUE;
     buf->b_start_eol = TRUE;
     buf->b_p_bomb = FALSE;
--- a/src/change.c
+++ b/src/change.c
@@ -921,6 +921,7 @@ unchanged(buf_T *buf, int ff, int always
 save_file_ff(buf_T *buf)
 {
     buf->b_start_ffc = *buf->b_p_ff;
+    buf->b_start_eof = buf->b_p_eof;
     buf->b_start_eol = buf->b_p_eol;
     buf->b_start_bomb = buf->b_p_bomb;
 
@@ -955,7 +956,9 @@ file_ff_differs(buf_T *buf, int ignore_e
 	return FALSE;
     if (buf->b_start_ffc != *buf->b_p_ff)
 	return TRUE;
-    if ((buf->b_p_bin || !buf->b_p_fixeol) && buf->b_start_eol != buf->b_p_eol)
+    if ((buf->b_p_bin || !buf->b_p_fixeol)
+	    && (buf->b_start_eof != buf->b_p_eof
+		|| buf->b_start_eol != buf->b_p_eol))
 	return TRUE;
     if (!buf->b_p_bin && buf->b_start_bomb != buf->b_p_bomb)
 	return TRUE;
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -589,8 +589,9 @@ readfile(
 	// correctly set when reading stdin.
 	if (!read_buffer)
 	{
+	    curbuf->b_p_eof = FALSE;
+	    curbuf->b_start_eof = FALSE;
 	    curbuf->b_p_eol = TRUE;
-	    curbuf->b_p_eof = FALSE;
 	    curbuf->b_start_eol = TRUE;
 	}
 	curbuf->b_p_bomb = FALSE;
@@ -2278,15 +2279,18 @@ failed:
     if (!error
 	    && !got_int
 	    && linerest != 0
+	    // TODO: should we handle CTRL-Z differently here for 'endoffile'?
 	    && !(!curbuf->b_p_bin
-		&& fileformat == EOL_DOS))
+		&& fileformat == EOL_DOS
+		&& *line_start == Ctrl_Z
+		&& ptr == line_start + 1))
     {
 	// remember for when writing
 	if (set_options)
 	{
 	    curbuf->b_p_eol = FALSE;
 	    if (*line_start == Ctrl_Z && ptr == line_start + 1)
-		curbuf->b_p_eof = FALSE;
+		curbuf->b_p_eof = TRUE;
 	}
 	*ptr = NUL;
 	len = (colnr_T)(ptr - line_start + 1);
--- a/src/structs.h
+++ b/src/structs.h
@@ -3150,6 +3150,7 @@ struct file_buffer
     linenr_T	b_no_eol_lnum;	// non-zero lnum when last line of next binary
 				// write should not have an end-of-line
 
+    int		b_start_eof;	// last line had eof (CTRL-Z) when it was read
     int		b_start_eol;	// last line had eol when it was read
     int		b_start_ffc;	// first char of 'ff' when edit started
     char_u	*b_start_fenc;	// 'fileencoding' when edit started or NULL
--- a/src/testdir/test_fixeol.vim
+++ b/src/testdir/test_fixeol.vim
@@ -34,10 +34,10 @@ func Test_fixeol()
   w >>XXTestEol
   w >>XXTestNoEol
 
-  call assert_equal(['with eol', 'END'], readfile('XXEol'))
-  call assert_equal(['without eolEND'], readfile('XXNoEol'))
-  call assert_equal(['with eol', 'stays eol', 'END'], readfile('XXTestEol'))
-  call assert_equal(['without eol', 'stays withoutEND'],
+  call assert_equal(['with eol or eof', 'END'], readfile('XXEol'))
+  call assert_equal(['without eol or eofEND'], readfile('XXNoEol'))
+  call assert_equal(['with eol or eof', 'stays eol', 'END'], readfile('XXTestEol'))
+  call assert_equal(['without eol or eof', 'stays withoutEND'],
 	      \ readfile('XXTestNoEol'))
 
   call delete('XXEol')
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    819,
+/**/
     818,
 /**/
     817,