diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/buffer.c | 2 | ||||
| -rw-r--r-- | src/nvim/buffer_defs.h | 1 | ||||
| -rw-r--r-- | src/nvim/change.c | 4 | ||||
| -rw-r--r-- | src/nvim/fileio.c | 10 | ||||
| -rw-r--r-- | src/nvim/testdir/test_fixeol.vim | 8 | 
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') | 
