Merge #3443 'vim-patch:7.4.{785,795,898}'

This commit is contained in:
Justin M. Keyes
2015-12-13 00:09:07 -05:00
13 changed files with 121 additions and 27 deletions

View File

@@ -1,4 +1,4 @@
*options.txt* For Vim version 7.4. Last change: 2014 Dec 17 *options.txt* For Vim version 7.4. Last change: 2015 Oct 15
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -2178,15 +2178,16 @@ A jump table for the options with a short description can be found at |Q_op|.
'endofline' 'eol' boolean (default on) 'endofline' 'eol' boolean (default on)
local to buffer local to buffer
When writing a file and this option is off and the 'binary' option When writing a file and this option is off and the 'binary' option
is on, no <EOL> will be written for the last line in the file. This is on, or 'fixeol' option is off, no <EOL> will be written for the
option is automatically set when starting to edit a new file, unless last line in the file. This option is automatically set or reset when
the file does not have an <EOL> for the last line in the file, in starting to edit a new file, depending on whether file has an <EOL>
which case it is reset. Normally you don't have to set or reset this for the last line in the file. Normally you don't have to set or
option. When 'binary' is off the value is not used when writing the reset this option.
file. When 'binary' is on it is used to remember the presence of a When 'binary' is off and 'fixeol' is on the value is not used when
<EOL> for the last line in the file, so that when you write the file writing the file. When 'binary' is on or 'fixeol' is off it is used
the situation from the original file can be kept. But you can change to remember the presence of a <EOL> for the last line in the file, so
it if you want to. that when you write the file the situation from the original file can
be kept. But you can change it if you want to.
*'equalalways'* *'ea'* *'noequalalways'* *'noea'* *'equalalways'* *'ea'* *'noequalalways'* *'noea'*
'equalalways' 'ea' boolean (default on) 'equalalways' 'ea' boolean (default on)
@@ -2541,6 +2542,17 @@ A jump table for the options with a short description can be found at |Q_op|.
fold:c Folded |hl-Folded| fold:c Folded |hl-Folded|
diff:c DiffDelete |hl-DiffDelete| diff:c DiffDelete |hl-DiffDelete|
*'fixendofline'* *'fixeol'* *'nofixendofline'* *'nofixeol'*
'fixendofline' 'fixeol' boolean (default on)
local to buffer
{not in Vi}
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
preserve the situation from the original file.
When the 'binary' option is set the value of this option doesn't
matter.
See the 'endofline' option.
*'fkmap'* *'fk'* *'nofkmap'* *'nofk'* *'fkmap'* *'fk'* *'nofkmap'* *'nofk'*
'fkmap' 'fk' boolean (default off) *E198* 'fkmap' 'fk' boolean (default off) *E198*
global global

View File

@@ -926,6 +926,9 @@ call <SID>BinOptionL("bin")
call append("$", "endofline\tlast line in the file has an end-of-line") call append("$", "endofline\tlast line in the file has an end-of-line")
call append("$", "\t(local to buffer)") call append("$", "\t(local to buffer)")
call <SID>BinOptionL("eol") call <SID>BinOptionL("eol")
call append("$", "fixeol\tfixes missing end-of-line at end of text file")
call append("$", "\t(local to buffer)")
call <SID>BinOptionL("fixeol")
if has("multi_byte") if has("multi_byte")
call append("$", "bomb\tprepend a Byte Order Mark to the file") call append("$", "bomb\tprepend a Byte Order Mark to the file")
call append("$", "\t(local to buffer)") call append("$", "\t(local to buffer)")

View File

@@ -612,6 +612,7 @@ struct file_buffer {
char_u *b_p_cfu; /* 'completefunc' */ char_u *b_p_cfu; /* 'completefunc' */
char_u *b_p_ofu; /* 'omnifunc' */ char_u *b_p_ofu; /* 'omnifunc' */
int b_p_eol; /* 'endofline' */ int b_p_eol; /* 'endofline' */
int b_p_fixeol; /* 'fixendofline' */
int b_p_et; /* 'expandtab' */ int b_p_et; /* 'expandtab' */
int b_p_et_nobin; /* b_p_et saved for binary mode */ int b_p_et_nobin; /* b_p_et saved for binary mode */
char_u *b_p_fenc; /* 'fileencoding' */ char_u *b_p_fenc; /* 'fileencoding' */

View File

@@ -1922,10 +1922,10 @@ failed:
check_marks_read(); check_marks_read();
/* /*
* Trick: We remember if the last line of the read didn't have * We remember if the last line of the read didn't have
* an eol even when 'binary' is off, for when writing it again with * an eol even when 'binary' is off, to support turning 'fixeol' off,
* 'binary' on. This is required for * or writing the read again with 'binary' on. The latter is required
* ":autocmd FileReadPost *.gz set bin|'[,']!gunzip" to work. * for ":autocmd FileReadPost *.gz set bin|'[,']!gunzip" to work.
*/ */
curbuf->b_no_eol_lnum = read_no_eol_lnum; curbuf->b_no_eol_lnum = read_no_eol_lnum;
@@ -3310,7 +3310,7 @@ restore_backup:
/* write failed or last line has no EOL: stop here */ /* write failed or last line has no EOL: stop here */
if (end == 0 if (end == 0
|| (lnum == end || (lnum == end
&& write_bin && (write_bin || !buf->b_p_fixeol)
&& (lnum == buf->b_no_eol_lnum && (lnum == buf->b_no_eol_lnum
|| (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol)))) { || (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol)))) {
++lnum; /* written the line, count it */ ++lnum; /* written the line, count it */

View File

@@ -3954,8 +3954,10 @@ long ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp)
if (ffdos) if (ffdos)
size += lnum - 1; size += lnum - 1;
/* Don't count the last line break if 'bin' and 'noeol'. */ /* Don't count the last line break if 'noeol' and ('bin' or
if (buf->b_p_bin && !buf->b_p_eol && buf->b_ml.ml_line_count == lnum) { * 'nofixeol'). */
if ((!buf->b_p_fixeol || buf->b_p_bin) && !buf->b_p_eol
&& buf->b_ml.ml_line_count == lnum) {
size -= ffdos + 1; size -= ffdos + 1;
} }
} }

View File

@@ -41,7 +41,7 @@ typedef struct memline {
int ml_flags; int ml_flags;
infoptr_T *ml_stack; /* stack of pointer blocks (array of IPTRs) */ infoptr_T *ml_stack; /* stack of pointer blocks (array of IPTRs) */
int ml_stack_top; /* current top if ml_stack */ int ml_stack_top; /* current top of ml_stack */
int ml_stack_size; /* total number of entries in ml_stack */ int ml_stack_size; /* total number of entries in ml_stack */
linenr_T ml_line_lnum; /* line number of cached line, 0 if not valid */ linenr_T ml_line_lnum; /* line number of cached line, 0 if not valid */

View File

@@ -4964,7 +4964,7 @@ void cursor_pos_info(void)
&char_count_cursor, len, eol_size); &char_count_cursor, len, eol_size);
if (lnum == curbuf->b_ml.ml_line_count if (lnum == curbuf->b_ml.ml_line_count
&& !curbuf->b_p_eol && !curbuf->b_p_eol
&& curbuf->b_p_bin && (curbuf->b_p_bin || !curbuf->b_p_fixeol)
&& (long)STRLEN(s) < len) && (long)STRLEN(s) < len)
byte_count_cursor -= eol_size; byte_count_cursor -= eol_size;
} }
@@ -4985,7 +4985,7 @@ void cursor_pos_info(void)
} }
/* Correction for when last line doesn't have an EOL. */ /* Correction for when last line doesn't have an EOL. */
if (!curbuf->b_p_eol && curbuf->b_p_bin) if (!curbuf->b_p_eol && (curbuf->b_p_bin || !curbuf->b_p_fixeol))
byte_count -= eol_size; byte_count -= eol_size;
if (l_VIsual_active) { if (l_VIsual_active) {

View File

@@ -122,6 +122,7 @@ static char_u *p_cpt;
static char_u *p_cfu; static char_u *p_cfu;
static char_u *p_ofu; static char_u *p_ofu;
static int p_eol; static int p_eol;
static int p_fixeol;
static int p_et; static int p_et;
static char_u *p_fenc; static char_u *p_fenc;
static char_u *p_ff; static char_u *p_ff;
@@ -3592,6 +3593,9 @@ set_bool_option (
/* when 'endofline' is changed, redraw the window title */ /* when 'endofline' is changed, redraw the window title */
else if ((int *)varp == &curbuf->b_p_eol) { else if ((int *)varp == &curbuf->b_p_eol) {
redraw_titles(); redraw_titles();
} else if ((int *)varp == &curbuf->b_p_fixeol) {
// when 'fixeol' is changed, redraw the window title
redraw_titles();
} }
/* when 'bomb' is changed, redraw the window title and tab page text */ /* when 'bomb' is changed, redraw the window title and tab page text */
else if ((int *)varp == &curbuf->b_p_bomb) { else if ((int *)varp == &curbuf->b_p_bomb) {
@@ -5304,6 +5308,7 @@ static char_u *get_varp(vimoption_T *p)
case PV_CFU: return (char_u *)&(curbuf->b_p_cfu); case PV_CFU: return (char_u *)&(curbuf->b_p_cfu);
case PV_OFU: return (char_u *)&(curbuf->b_p_ofu); case PV_OFU: return (char_u *)&(curbuf->b_p_ofu);
case PV_EOL: return (char_u *)&(curbuf->b_p_eol); case PV_EOL: return (char_u *)&(curbuf->b_p_eol);
case PV_FIXEOL: return (char_u *)&(curbuf->b_p_fixeol);
case PV_ET: return (char_u *)&(curbuf->b_p_et); case PV_ET: return (char_u *)&(curbuf->b_p_et);
case PV_FENC: return (char_u *)&(curbuf->b_p_fenc); case PV_FENC: return (char_u *)&(curbuf->b_p_fenc);
case PV_FF: return (char_u *)&(curbuf->b_p_ff); case PV_FF: return (char_u *)&(curbuf->b_p_ff);
@@ -5548,6 +5553,7 @@ void buf_copy_options(buf_T *buf, int flags)
buf->b_p_bin = p_bin; buf->b_p_bin = p_bin;
buf->b_p_bomb = p_bomb; buf->b_p_bomb = p_bomb;
buf->b_p_et = p_et; buf->b_p_et = p_et;
buf->b_p_fixeol = p_fixeol;
buf->b_p_et_nobin = p_et_nobin; buf->b_p_et_nobin = p_et_nobin;
buf->b_p_ml = p_ml; buf->b_p_ml = p_ml;
buf->b_p_ml_nobin = p_ml_nobin; buf->b_p_ml_nobin = p_ml_nobin;
@@ -6483,6 +6489,7 @@ void save_file_ff(buf_T *buf)
* from when editing started (save_file_ff() called). * from when editing started (save_file_ff() called).
* Also when 'endofline' was changed and 'binary' is set, or when 'bomb' was * Also when 'endofline' was changed and 'binary' is set, or when 'bomb' was
* changed and 'binary' is not set. * changed and 'binary' is not set.
* Also when 'endofline' was changed and 'fixeol' is not set.
* When "ignore_empty" is true don't consider a new, empty buffer to be * When "ignore_empty" is true don't consider a new, empty buffer to be
* changed. * changed.
*/ */
@@ -6497,9 +6504,9 @@ bool file_ff_differs(buf_T *buf, bool ignore_empty)
&& *ml_get_buf(buf, (linenr_T)1, FALSE) == NUL) && *ml_get_buf(buf, (linenr_T)1, FALSE) == NUL)
return FALSE; return FALSE;
if (buf->b_start_ffc != *buf->b_p_ff) if (buf->b_start_ffc != *buf->b_p_ff)
return TRUE; return true;
if (buf->b_p_bin && buf->b_start_eol != buf->b_p_eol) if ((buf->b_p_bin || !buf->b_p_fixeol) && buf->b_start_eol != buf->b_p_eol)
return TRUE; return true;
if (!buf->b_p_bin && buf->b_start_bomb != buf->b_p_bomb) if (!buf->b_p_bin && buf->b_start_bomb != buf->b_p_bomb)
return TRUE; return TRUE;
if (buf->b_start_fenc == NULL) if (buf->b_start_fenc == NULL)

View File

@@ -665,6 +665,7 @@ enum {
, BV_DEF , BV_DEF
, BV_INC , BV_INC
, BV_EOL , BV_EOL
, BV_FIXEOL
, BV_EP , BV_EP
, BV_ET , BV_ET
, BV_FENC , BV_FENC

View File

@@ -798,6 +798,14 @@ return {
varname='p_fcs', varname='p_fcs',
defaults={if_true={vi="vert:|,fold:-"}} defaults={if_true={vi="vert:|,fold:-"}}
}, },
{
full_name='fixendofline', abbreviation='fixeol',
type='bool', scope={'buffer'},
vi_def=true,
redraw={'statuslines'},
varname='p_fixeol',
defaults={if_true={vi=true}}
},
{ {
full_name='fkmap', abbreviation='fk', full_name='fkmap', abbreviation='fk',
type='bool', scope={'global'}, type='bool', scope={'global'},

View File

@@ -418,7 +418,8 @@ static void read_input(DynamicBuffer *buf)
// Finished a line, add a NL, unless this line should not have one. // Finished a line, add a NL, unless this line should not have one.
// FIXME need to make this more readable // FIXME need to make this more readable
if (lnum != curbuf->b_op_end.lnum if (lnum != curbuf->b_op_end.lnum
|| !curbuf->b_p_bin || (!curbuf->b_p_bin
&& curbuf->b_p_fixeol)
|| (lnum != curbuf->b_no_eol_lnum || (lnum != curbuf->b_no_eol_lnum
&& (lnum != && (lnum !=
curbuf->b_ml.ml_line_count curbuf->b_ml.ml_line_count

View File

@@ -98,7 +98,7 @@ static int included_patches[] = {
// 901, // 901,
// 900 NA // 900 NA
// 899 NA // 899 NA
// 898, 898,
// 897, // 897,
// 896, // 896,
// 895, // 895,
@@ -201,7 +201,7 @@ static int included_patches[] = {
// 798, // 798,
// 797, // 797,
// 796 NA // 796 NA
// 795, 795,
// 794 NA // 794 NA
793, 793,
// 792, // 792,
@@ -211,7 +211,7 @@ static int included_patches[] = {
// 788 NA // 788 NA
787, 787,
786, 786,
// 785, 785,
784, 784,
// 783 NA // 783 NA
// 782, // 782,

View File

@@ -0,0 +1,59 @@
-- Tests for 'fixeol'
local helpers = require('test.functional.helpers')
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
describe('fixeol', function()
setup(clear)
it('is working', function()
-- First write two test files with and without trailing EOL.
-- Use Unix fileformat for consistency.
execute('set ff=unix')
execute('enew!')
feed('awith eol<esc>:w! XXEol<cr>')
execute('enew!')
execute('set noeol nofixeol')
feed('awithout eol<esc>:w! XXNoEol<cr>')
execute('set eol fixeol')
execute('bwipe XXEol XXNoEol')
-- Try editing files with 'fixeol' disabled.
execute('e! XXEol')
feed('ostays eol<esc>:set nofixeol<cr>')
execute('w! XXTestEol')
execute('e! XXNoEol')
feed('ostays without<esc>:set nofixeol<cr>')
execute('w! XXTestNoEol')
execute('bwipe XXEol XXNoEol XXTestEol XXTestNoEol')
execute('set fixeol')
-- Append "END" to each file so that we can see what the last written char was.
feed('ggdGaEND<esc>:w >>XXEol<cr>')
execute('w >>XXNoEol')
execute('w >>XXTestEol')
execute('w >>XXTestNoEol')
-- Concatenate the results.
execute('e! test.out')
feed('a0<esc>:$r XXEol<cr>')
execute('$r XXNoEol')
feed('Go1<esc>:$r XXTestEol<cr>')
execute('$r XXTestNoEol')
execute('w')
-- Assert buffer contents.
expect([=[
0
with eol
END
without eolEND
1
with eol
stays eol
END
without eol
stays withoutEND]=])
end)
end)