aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/buffer.c2
-rw-r--r--src/nvim/buffer_defs.h1
-rw-r--r--src/nvim/change.c4
-rw-r--r--src/nvim/fileio.c10
-rw-r--r--src/nvim/testdir/test_fixeol.vim8
5 files changed, 17 insertions, 8 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index 8016904702..ade5c35450 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -689,6 +689,8 @@ void buf_clear_file(buf_T *buf)
{
buf->b_ml.ml_line_count = 1;
unchanged(buf, true, true);
+ 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;
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index 8e29edc0f5..52449faa5b 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -794,6 +794,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 *b_start_fenc; // 'fileencoding' when edit started or NULL
diff --git a/src/nvim/change.c b/src/nvim/change.c
index 2424a8a2eb..c6df98651d 100644
--- a/src/nvim/change.c
+++ b/src/nvim/change.c
@@ -539,6 +539,7 @@ void unchanged(buf_T *buf, int ff, bool always_inc_changedtick)
void save_file_ff(buf_T *buf)
{
buf->b_start_ffc = (unsigned char)(*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;
@@ -573,7 +574,8 @@ bool file_ff_differs(buf_T *buf, bool ignore_empty)
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) {
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c
index ae0340cdc6..2ba2f4c9c9 100644
--- a/src/nvim/fileio.c
+++ b/src/nvim/fileio.c
@@ -524,8 +524,9 @@ int readfile(char *fname, char *sfname, linenr_T from, linenr_T lines_to_skip,
// Don't change 'eol' if reading from buffer as it will already be
// correctly set when reading stdin.
if (!read_buffer) {
- curbuf->b_p_eol = true;
curbuf->b_p_eof = false;
+ curbuf->b_start_eof = false;
+ curbuf->b_p_eol = true;
curbuf->b_start_eol = true;
}
curbuf->b_p_bomb = false;
@@ -1629,13 +1630,16 @@ failed:
if (!error
&& !got_int
&& linerest != 0
+ // TODO(vim): 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;
diff --git a/src/nvim/testdir/test_fixeol.vim b/src/nvim/testdir/test_fixeol.vim
index 3ede84f49e..9d6c900bdb 100644
--- a/src/nvim/testdir/test_fixeol.vim
+++ b/src/nvim/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')