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
commit aca51f3d93
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
@ -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)
local to buffer
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
option is automatically set when starting to edit a new file, unless
the file does not have an <EOL> for the last line in the file, in
which case it is reset. Normally you don't have to set or reset this
option. When 'binary' is off the value is not used when writing the
file. When 'binary' is on it is used to remember the presence of a
<EOL> for the last line in the file, so that when you write the file
the situation from the original file can be kept. But you can change
it if you want to.
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>
for the last line in the file. Normally you don't have to set or
reset this option.
When 'binary' is off and 'fixeol' is on the value is not used when
writing the file. When 'binary' is on or 'fixeol' is off it is used
to remember the presence of a <EOL> for the last line in the file, so
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' 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|
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' boolean (default off) *E198*
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("$", "\t(local to buffer)")
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")
call append("$", "bomb\tprepend a Byte Order Mark to the file")
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_ofu; /* 'omnifunc' */
int b_p_eol; /* 'endofline' */
int b_p_fixeol; /* 'fixendofline' */
int b_p_et; /* 'expandtab' */
int b_p_et_nobin; /* b_p_et saved for binary mode */
char_u *b_p_fenc; /* 'fileencoding' */

View File

@ -1922,10 +1922,10 @@ failed:
check_marks_read();
/*
* Trick: 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
* 'binary' on. This is required for
* ":autocmd FileReadPost *.gz set bin|'[,']!gunzip" to work.
* We remember if the last line of the read didn't have
* an eol even when 'binary' is off, to support turning 'fixeol' off,
* or writing the read again with 'binary' on. The latter is required
* for ":autocmd FileReadPost *.gz set bin|'[,']!gunzip" to work.
*/
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 */
if (end == 0
|| (lnum == end
&& write_bin
&& (write_bin || !buf->b_p_fixeol)
&& (lnum == buf->b_no_eol_lnum
|| (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol)))) {
++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)
size += lnum - 1;
/* Don't count the last line break if 'bin' and 'noeol'. */
if (buf->b_p_bin && !buf->b_p_eol && buf->b_ml.ml_line_count == lnum) {
/* Don't count the last line break if 'noeol' and ('bin' or
* 'nofixeol'). */
if ((!buf->b_p_fixeol || buf->b_p_bin) && !buf->b_p_eol
&& buf->b_ml.ml_line_count == lnum) {
size -= ffdos + 1;
}
}

View File

@ -41,7 +41,7 @@ typedef struct memline {
int ml_flags;
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 */
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);
if (lnum == curbuf->b_ml.ml_line_count
&& !curbuf->b_p_eol
&& curbuf->b_p_bin
&& (curbuf->b_p_bin || !curbuf->b_p_fixeol)
&& (long)STRLEN(s) < len)
byte_count_cursor -= eol_size;
}
@ -4985,7 +4985,7 @@ void cursor_pos_info(void)
}
/* 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;
if (l_VIsual_active) {

View File

@ -122,6 +122,7 @@ static char_u *p_cpt;
static char_u *p_cfu;
static char_u *p_ofu;
static int p_eol;
static int p_fixeol;
static int p_et;
static char_u *p_fenc;
static char_u *p_ff;
@ -3592,6 +3593,9 @@ set_bool_option (
/* when 'endofline' is changed, redraw the window title */
else if ((int *)varp == &curbuf->b_p_eol) {
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 */
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_OFU: return (char_u *)&(curbuf->b_p_ofu);
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_FENC: return (char_u *)&(curbuf->b_p_fenc);
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_bomb = p_bomb;
buf->b_p_et = p_et;
buf->b_p_fixeol = p_fixeol;
buf->b_p_et_nobin = p_et_nobin;
buf->b_p_ml = p_ml;
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).
* Also when 'endofline' was changed and 'binary' is set, or when 'bomb' was
* 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
* changed.
*/
@ -6497,9 +6504,9 @@ bool file_ff_differs(buf_T *buf, bool ignore_empty)
&& *ml_get_buf(buf, (linenr_T)1, FALSE) == NUL)
return FALSE;
if (buf->b_start_ffc != *buf->b_p_ff)
return TRUE;
if (buf->b_p_bin && buf->b_start_eol != buf->b_p_eol)
return TRUE;
return true;
if ((buf->b_p_bin || !buf->b_p_fixeol) && buf->b_start_eol != buf->b_p_eol)
return true;
if (!buf->b_p_bin && buf->b_start_bomb != buf->b_p_bomb)
return TRUE;
if (buf->b_start_fenc == NULL)

View File

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

View File

@ -798,6 +798,14 @@ return {
varname='p_fcs',
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',
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.
// FIXME need to make this more readable
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_ml.ml_line_count

View File

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