diff options
author | K.Takata <kentkt@csc.jp> | 2022-11-01 20:36:19 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-11-01 20:36:19 +0000 |
commit | 3af982196b1b973e953c35351961f2a96fe34172 (patch) | |
tree | 8b2bc31d033187b17b4c5fb6e51350f833cd984b /src/fileio.c | |
parent | 8e0ccb6bc21a446e5c6375b7fdf200fb53a129da (diff) | |
download | vim-git-3af982196b1b973e953c35351961f2a96fe34172.tar.gz |
patch 9.0.0826: if 'endofline' is set CTRL-Z may be written in a wrong placev9.0.0826
Problem: If 'endofline' is set the CTRL-Z may be written in the wrong
place.
Solution: Write CTRL-Z at the end of the file. Update the help to explain
the possibilities better. (Ken Takata, closes #11486)
Diffstat (limited to 'src/fileio.c')
-rw-r--r-- | src/fileio.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/src/fileio.c b/src/fileio.c index bca827152..9916de8a6 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -2271,27 +2271,32 @@ failed: if (error && read_count == 0) error = FALSE; - /* - * If we get EOF in the middle of a line, note the fact and - * complete the line ourselves. - * In Dos format ignore a trailing CTRL-Z, unless 'binary' set. - */ + // In Dos format ignore a trailing CTRL-Z, unless 'binary' is set. + // In old days the file length was in sector count and the CTRL-Z the + // marker where the file really ended. Assuming we write it to a file + // system that keeps file length properly the CTRL-Z should be dropped. + // Set the 'endoffile' option so the user can decide what to write later. + // In Unix format the CTRL-Z is just another character. + if (linerest != 0 + && !curbuf->b_p_bin + && fileformat == EOL_DOS + && ptr[-1] == Ctrl_Z) + { + ptr--; + linerest--; + if (set_options) + curbuf->b_p_eof = TRUE; + } + + // If we get EOF in the middle of a line, note the fact by resetting + // 'endofline' and add the line normally. if (!error && !got_int - && linerest != 0 - // TODO: should we handle CTRL-Z differently here for 'endoffile'? - && !(!curbuf->b_p_bin - && fileformat == EOL_DOS - && *line_start == Ctrl_Z - && ptr == line_start + 1)) + && linerest != 0) { // 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 = TRUE; - } *ptr = NUL; len = (colnr_T)(ptr - line_start + 1); if (ml_append(lnum, line_start, len, newfile) == FAIL) |