aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-10-29 09:03:15 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-10-30 08:07:50 +0800
commitfeabc1c98cb077f60fde1a14e8540f2cf99eb8d2 (patch)
tree7cf648efe976fbac85e36f62964f1146b046aa54 /src
parent8d38e1ad34552293de9e562b73c727ec119fd847 (diff)
downloadrneovim-feabc1c98cb077f60fde1a14e8540f2cf99eb8d2.tar.gz
rneovim-feabc1c98cb077f60fde1a14e8540f2cf99eb8d2.tar.bz2
rneovim-feabc1c98cb077f60fde1a14e8540f2cf99eb8d2.zip
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. https://github.com/vim/vim/commit/fb0cf2357e0c85bbfd9f9178705ad8d77b6b3b4e vim-patch:f0b567e32a46 Revert unintended Makefile change https://github.com/vim/vim/commit/f0b567e32a462fe838170a202919d18b53eff987 vim-patch:72c8e3c070b3 Fix wrong struct access for member. https://github.com/vim/vim/commit/72c8e3c070b30f82bc0d203a62c168e43a13e99b vim-patch:3f68a4136eb9 Add missing entry for the 'endoffile' option. https://github.com/vim/vim/commit/3f68a4136eb99840d739af5133ab31948f273f63 Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat (limited to 'src')
-rw-r--r--src/nvim/buffer_defs.h1
-rw-r--r--src/nvim/fileio.c13
-rw-r--r--src/nvim/option.c2
-rw-r--r--src/nvim/option_defs.h2
-rw-r--r--src/nvim/options.lua9
-rw-r--r--src/nvim/testdir/test_fixeol.vim15
6 files changed, 33 insertions, 9 deletions
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index 043a31bf16..8e29edc0f5 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -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'
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c
index cfdd6fe697..ae0340cdc6 100644
--- a/src/nvim/fileio.c
+++ b/src/nvim/fileio.c
@@ -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
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 06662afd08..8de86ce76e 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -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:
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h
index 19e4780e0a..7c33773e41 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -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,
diff --git a/src/nvim/options.lua b/src/nvim/options.lua
index ba483d3714..088aa40fda 100644
--- a/src/nvim/options.lua
+++ b/src/nvim/options.lua
@@ -641,6 +641,15 @@ return {
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"),
type='bool', scope={'buffer'},
diff --git a/src/nvim/testdir/test_fixeol.vim b/src/nvim/testdir/test_fixeol.vim
index 32cb059e26..3ede84f49e 100644
--- a/src/nvim/testdir/test_fixeol.vim
+++ b/src/nvim/testdir/test_fixeol.vim
@@ -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