vim-patch:9.0.0816: CTRL-Z at end of file is always dropped

Problem:    CTRL-Z at end of file is always dropped.
Solution:   Add the 'endoffile' option, like the 'endofline' option.
            (closes vim/vim#11408, closes vim/vim#11397)

Cherry-pick test_fixeol.vim changes from patch 8.2.1432.
Cherry-pick 'endoffile' changes from latest Vim runtime update.

fb0cf2357e

vim-patch:f0b567e32a46

Revert unintended Makefile change

f0b567e32a

vim-patch:72c8e3c070b3

Fix wrong struct access for member.

72c8e3c070

vim-patch:3f68a4136eb9

Add missing entry for the 'endoffile' option.

3f68a4136e

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq
2022-10-29 09:03:15 +08:00
parent 8d38e1ad34
commit feabc1c98c
9 changed files with 48 additions and 11 deletions

View File

@@ -675,6 +675,7 @@ struct file_buffer {
char *b_p_cfu; ///< 'completefunc'
char *b_p_ofu; ///< 'omnifunc'
char *b_p_tfu; ///< 'tagfunc'
int b_p_eof; ///< 'endoffile'
int b_p_eol; ///< 'endofline'
int b_p_fixeol; ///< 'fixendofline'
int b_p_et; ///< 'expandtab'

View File

@@ -525,6 +525,7 @@ int readfile(char *fname, char *sfname, linenr_T from, linenr_T lines_to_skip,
// correctly set when reading stdin.
if (!read_buffer) {
curbuf->b_p_eol = true;
curbuf->b_p_eof = false;
curbuf->b_start_eol = true;
}
curbuf->b_p_bomb = false;
@@ -1629,12 +1630,13 @@ failed:
&& !got_int
&& linerest != 0
&& !(!curbuf->b_p_bin
&& fileformat == EOL_DOS
&& *line_start == Ctrl_Z
&& ptr == line_start + 1)) {
&& fileformat == EOL_DOS)) {
// 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;
}
}
*ptr = NUL;
len = (colnr_T)(ptr - line_start + 1);
@@ -3191,6 +3193,11 @@ restore_backup:
len = 0;
write_info.bw_start_lnum = lnum;
}
if (!buf->b_p_fixeol && buf->b_p_eof) {
// write trailing CTRL-Z
(void)write_eintr(write_info.bw_fd, "\x1a", 1);
}
// write failed or last line has no EOL: stop here
if (end == 0
|| (lnum == end

View File

@@ -3978,6 +3978,8 @@ static char_u *get_varp(vimoption_T *p)
return (char_u *)&(curbuf->b_p_cfu);
case PV_OFU:
return (char_u *)&(curbuf->b_p_ofu);
case PV_EOF:
return (char_u *)&(curbuf->b_p_eof);
case PV_EOL:
return (char_u *)&(curbuf->b_p_eol);
case PV_FIXEOL:

View File

@@ -497,6 +497,7 @@ EXTERN char_u *p_ef; // 'errorfile'
EXTERN char *p_efm; // 'errorformat'
EXTERN char *p_gefm; // 'grepformat'
EXTERN char *p_gp; // 'grepprg'
EXTERN int p_eof; ///< 'endoffile'
EXTERN int p_eol; ///< 'endofline'
EXTERN char *p_ei; // 'eventignore'
EXTERN int p_et; ///< 'expandtab'
@@ -858,6 +859,7 @@ enum {
BV_CFU,
BV_DEF,
BV_INC,
BV_EOF,
BV_EOL,
BV_FIXEOL,
BV_EP,

View File

@@ -640,6 +640,15 @@ return {
varname='p_enc',
defaults={if_true=macros('ENC_DFLT')}
},
{
full_name='endoffile', abbreviation='eof',
short_desc=N_("write CTRL-Z for last line in file"),
type='bool', scope={'buffer'},
no_mkrc=true,
redraw={'statuslines'},
varname='p_eof',
defaults={if_true=true}
},
{
full_name='endofline', abbreviation='eol',
short_desc=N_("write <EOL> for last line in file"),

View File

@@ -1,16 +1,17 @@
" Tests for 'fixeol' and 'eol'
" Tests for 'fixeol', 'eof' and 'eol'
func Test_fixeol()
" first write two test files with and without trailing EOL
" use Unix fileformat for consistency
set ff=unix
enew!
call setline('.', 'with eol')
call setline('.', 'with eol or eof')
w! XXEol
enew!
set noeol nofixeol
call setline('.', 'without eol')
set noeof noeol nofixeol
call setline('.', 'without eol or eof')
w! XXNoEol
set eol fixeol
set eol eof fixeol
bwipe XXEol XXNoEol
" try editing files with 'fixeol' disabled
@@ -43,6 +44,8 @@ func Test_fixeol()
call delete('XXNoEol')
call delete('XXTestEol')
call delete('XXTestNoEol')
set ff& fixeol& eol&
set ff& fixeol& eof& eol&
enew!
endfunc
" vim: shiftwidth=2 sts=2 expandtab