mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	Merge #3443 'vim-patch:7.4.{785,795,898}'
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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)")
 | 
			
		||||
 
 | 
			
		||||
@@ -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' */
 | 
			
		||||
 
 | 
			
		||||
@@ -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 */
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -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 */
 | 
			
		||||
 
 | 
			
		||||
@@ -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) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -665,6 +665,7 @@ enum {
 | 
			
		||||
  , BV_DEF
 | 
			
		||||
  , BV_INC
 | 
			
		||||
  , BV_EOL
 | 
			
		||||
  , BV_FIXEOL
 | 
			
		||||
  , BV_EP
 | 
			
		||||
  , BV_ET
 | 
			
		||||
  , BV_FENC
 | 
			
		||||
 
 | 
			
		||||
@@ -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'},
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										59
									
								
								test/functional/legacy/fixeol_spec.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								test/functional/legacy/fixeol_spec.lua
									
									
									
									
									
										Normal 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)
 | 
			
		||||
		Reference in New Issue
	
	Block a user