summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-10-22 11:25:19 +0100
committerBram Moolenaar <Bram@vim.org>2022-10-22 11:25:19 +0100
commitfb0cf2357e0c85bbfd9f9178705ad8d77b6b3b4e (patch)
tree25307998711d15645e29dac9ba83815a31f1fb4d
parent9c50eeb40117413bf59a9da904c8d0921ed0a6e6 (diff)
downloadvim-git-fb0cf2357e0c85bbfd9f9178705ad8d77b6b3b4e.tar.gz
patch 9.0.0817v9.0.0817v9.0.0816
-rw-r--r--runtime/doc/options.txt9
-rw-r--r--src/Makefile2
-rw-r--r--src/bufwrite.c4
-rw-r--r--src/ex_cmds.c2
-rw-r--r--src/fileio.c9
-rw-r--r--src/option.h2
-rw-r--r--src/optiondefs.h6
-rw-r--r--src/structs.h1
-rw-r--r--src/testdir/test_fixeol.vim12
-rw-r--r--src/version.c4
10 files changed, 37 insertions, 14 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 5beb6a283..de388bb5a 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -3052,6 +3052,13 @@ A jump table for the options with a short description can be found at |Q_op|.
'endofline' 'eol' boolean (default on)
local to buffer
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 for at the
+ end of the file.
+
+ *'endofline'* *'eol'* *'noendofline'* *'noeol'*
+'endofline' 'eol' boolean (default on)
+ local to buffer
+ When writing a file and this option is off and the 'binary' option
is on, or 'fixeol' option is off, no <EOL> will be written for the
last line in the file. This option is automatically set or reset when
starting to edit a new file, depending on whether file has an <EOL>
@@ -3452,7 +3459,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.
diff --git a/src/Makefile b/src/Makefile
index bd6c18755..4b342da6b 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -355,7 +355,7 @@ CClink = $(CC)
#CONF_OPT_GUI = --enable-gui=gnome2 --disable-gtktest
#CONF_OPT_GUI = --enable-gui=gtk3
#CONF_OPT_GUI = --enable-gui=gtk3 --disable-gtktest
-#CONF_OPT_GUI = --enable-gui=motif
+CONF_OPT_GUI = --enable-gui=motif
#CONF_OPT_GUI = --enable-gui=motif --with-motif-lib="-static -lXm -shared"
# Uncomment this line to run an individual test with gvim.
diff --git a/src/bufwrite.c b/src/bufwrite.c
index 3ff7fb339..713dac561 100644
--- a/src/bufwrite.c
+++ b/src/bufwrite.c
@@ -2050,6 +2050,10 @@ 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/ex_cmds.c b/src/ex_cmds.c
index 676ab704b..44333d514 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -929,8 +929,6 @@ do_bang(
STRCAT(t, newcmd);
if (ins_prevcmd)
STRCAT(t, prevcmd);
- else
- vim_free(t);
p = t + STRLEN(t);
STRCAT(t, trailarg);
vim_free(newcmd);
diff --git a/src/fileio.c b/src/fileio.c
index 701521a41..ab867b7c8 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -590,6 +590,7 @@ readfile(
if (!read_buffer)
{
curbuf->b_p_eol = TRUE;
+ curbuf->b_p_eof = FALSE;
curbuf->b_start_eol = TRUE;
}
curbuf->b_p_bomb = FALSE;
@@ -2278,13 +2279,15 @@ 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);
if (ml_append(lnum, line_start, len, newfile) == FAIL)
diff --git a/src/option.h b/src/option.h
index e266d387e..eed12e837 100644
--- a/src/option.h
+++ b/src/option.h
@@ -555,6 +555,7 @@ EXTERN char_u *p_efm; // 'errorformat'
EXTERN char_u *p_gefm; // 'grepformat'
EXTERN char_u *p_gp; // 'grepprg'
#endif
+EXTERN int p_eof; // 'endoffile'
EXTERN int p_eol; // 'endofline'
EXTERN int p_ek; // 'esckeys'
EXTERN char_u *p_ei; // 'eventignore'
@@ -1123,6 +1124,7 @@ enum
, BV_DEF
, BV_INC
#endif
+ , BV_EOF
, BV_EOL
, BV_FIXEOL
, BV_EP
diff --git a/src/optiondefs.h b/src/optiondefs.h
index 9ea860290..43a334fc0 100644
--- a/src/optiondefs.h
+++ b/src/optiondefs.h
@@ -61,6 +61,7 @@
# define PV_DEF OPT_BOTH(OPT_BUF(BV_DEF))
# define PV_INC OPT_BOTH(OPT_BUF(BV_INC))
#endif
+#define PV_EOF OPT_BUF(BV_EOF)
#define PV_EOL OPT_BUF(BV_EOL)
#define PV_FIXEOL OPT_BUF(BV_FIXEOL)
#define PV_EP OPT_BOTH(OPT_BUF(BV_EP))
@@ -846,7 +847,7 @@ static struct vimoption options[] =
{"edcompatible","ed", P_BOOL|P_VI_DEF,
(char_u *)&p_ed, PV_NONE,
{(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
- {"emoji", "emo", P_BOOL|P_VI_DEF|P_RCLR,
+ {"emoji", "emo", P_BOOL|P_VI_DEF|P_RCLR,
(char_u *)&p_emoji, PV_NONE,
{(char_u *)TRUE, (char_u *)0L}
SCTX_INIT},
@@ -854,6 +855,9 @@ static struct vimoption options[] =
(char_u *)&p_enc, PV_NONE,
{(char_u *)ENC_DFLT, (char_u *)0L}
SCTX_INIT},
+ {"endoffile", "eof", P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
+ (char_u *)&p_eof, PV_EOF,
+ {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
{"endofline", "eol", P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
(char_u *)&p_eol, PV_EOL,
{(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
diff --git a/src/structs.h b/src/structs.h
index bc3d8cb07..02c9c2ada 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -2999,6 +2999,7 @@ struct file_buffer
char_u *b_p_tfu; // 'tagfunc' option value
callback_T b_tfu_cb; // 'tagfunc' callback
#endif
+ int b_p_eof; // 'endoffile'
int b_p_eol; // 'endofline'
int b_p_fixeol; // 'fixendofline'
int b_p_et; // 'expandtab'
diff --git a/src/testdir/test_fixeol.vim b/src/testdir/test_fixeol.vim
index e97bf004f..3ede84f49 100644
--- a/src/testdir/test_fixeol.vim
+++ b/src/testdir/test_fixeol.vim
@@ -1,17 +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
@@ -44,7 +44,7 @@ func Test_fixeol()
call delete('XXNoEol')
call delete('XXTestEol')
call delete('XXTestNoEol')
- set ff& fixeol& eol&
+ set ff& fixeol& eof& eol&
enew!
endfunc
diff --git a/src/version.c b/src/version.c
index 237cd7c40..e9f9f1260 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,10 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 817,
+/**/
+ 816,
+/**/
815,
/**/
814,