mirror of
https://github.com/neovim/neovim.git
synced 2025-10-12 04:46:10 +00:00
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 changef0b567e32a
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:
@@ -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'
|
||||
|
@@ -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
|
||||
|
@@ -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:
|
||||
|
@@ -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,
|
||||
|
@@ -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"),
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user