mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06: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:
parent
8d38e1ad34
commit
feabc1c98c
@ -2135,6 +2135,15 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
|
||||
See 'fileencoding' to control file-content encoding.
|
||||
|
||||
*'endoffile'* *'eof'* *'noendoffile'* *'noeof'*
|
||||
'endoffile' 'eof' boolean (default on)
|
||||
local to buffer
|
||||
Indicates that a CTRL-Z character was found at the end of the file
|
||||
when reading it. Normally only happens when 'fileformat' is "dos".
|
||||
When writing a file and this option is off and the 'binary' option
|
||||
is on, or 'fixeol' option is off, no CTRL-Z will be written at the
|
||||
end of the file.
|
||||
|
||||
*'endofline'* *'eol'* *'noendofline'* *'noeol'*
|
||||
'endofline' 'eol' boolean (default on)
|
||||
local to buffer
|
||||
@ -2490,7 +2499,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
'fixendofline' 'fixeol' boolean (default on)
|
||||
local to buffer
|
||||
When writing a file and this option is on, <EOL> at the end of file
|
||||
will be restored if missing. Turn this option off if you want to
|
||||
will be restored if missing. Turn this option off if you want to
|
||||
preserve the situation from the original file.
|
||||
When the 'binary' option is set the value of this option doesn't
|
||||
matter.
|
||||
|
@ -689,6 +689,7 @@ Short explanation of each option: *option-list*
|
||||
'display' 'dy' list of flags for how to display text
|
||||
'eadirection' 'ead' in which direction 'equalalways' works
|
||||
'encoding' 'enc' encoding used internally
|
||||
'endoffile' 'eof' write CTRL-Z at end of the file
|
||||
'endofline' 'eol' write <EOL> for last line in file
|
||||
'equalalways' 'ea' windows are automatically made the same size
|
||||
'equalprg' 'ep' external program to use for "=" command
|
||||
|
@ -1,7 +1,7 @@
|
||||
" These commands create the option window.
|
||||
"
|
||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||
" Last Change: 2022 Oct 15
|
||||
" Last Change: 2022 Oct 28
|
||||
|
||||
" If there already is an option window, jump to that one.
|
||||
let buf = bufnr('option-window')
|
||||
@ -956,6 +956,9 @@ call <SID>BinOptionL("bin")
|
||||
call <SID>AddOption("endofline", gettext("last line in the file has an end-of-line"))
|
||||
call append("$", "\t" .. s:local_to_buffer)
|
||||
call <SID>BinOptionL("eol")
|
||||
call <SID>AddOption("endoffile", gettext("last line in the file followed by CTRL-Z"))
|
||||
call append("$", "\t" .. s:local_to_buffer)
|
||||
call <SID>BinOptionL("eof")
|
||||
call <SID>AddOption("fixendofline", gettext("fixes missing end-of-line at end of text file"))
|
||||
call append("$", "\t" .. s:local_to_buffer)
|
||||
call <SID>BinOptionL("fixeol")
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user