Patch 7.4.785
Problem:    On some systems automatically adding the missing EOL causes
            problems. Setting 'binary' has too many side effects.
Solution:   Add the 'fixeol' option, default on. (Pavel Samarkin)
Files:      src/buffer.c, src/fileio.c, src/memline.c, src/netbeans.c,
            src/ops.c, src/option.c, src/option.h, src/os_unix.c,
            src/os_win32.c, src/structs.h, src/testdir/Make_amiga.mak,
            src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
            src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
            src/testdir/Makefile, src/testdir/test_fixeol.in,
            src/testdir/test_fixeol.ok, runtime/doc/options.txt,
            runtime/optwin.vim


*** ../vim-7.4.784/src/buffer.c 2015-06-19 14:41:44.777813290 +0200
--- src/buffer.c        2015-07-17 13:55:33.174783882 +0200
***************
*** 547,552 ****
--- 547,553 ----
      buf->b_shortname = FALSE;
  #endif
      buf->b_p_eol = TRUE;
+     buf->b_p_fixeol = TRUE;
      buf->b_start_eol = TRUE;
  #ifdef FEAT_MBYTE
      buf->b_p_bomb = FALSE;
*** ../vim-7.4.784/src/fileio.c 2015-03-31 13:33:00.793524956 +0200
--- src/fileio.c        2015-07-17 13:57:26.777699252 +0200
***************
*** 2623,2632 ****
  #endif
  
      /*
!      * 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.
       */
      curbuf->b_no_eol_lnum = read_no_eol_lnum;
  
--- 2623,2632 ----
  #endif
  
      /*
!      * 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;
  
***************
*** 4547,4553 ****
        /* write failed or last line has no EOL: stop here */
        if (end == 0
                || (lnum == end
!                   && write_bin
                    && (lnum == buf->b_no_eol_lnum
                        || (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol))))
        {
--- 4547,4553 ----
        /* write failed or last line has no EOL: stop here */
        if (end == 0
                || (lnum == end
!                   && (write_bin || !buf->b_p_fixeol)
                    && (lnum == buf->b_no_eol_lnum
                        || (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol))))
        {
*** ../vim-7.4.784/src/memline.c        2015-07-12 17:52:50.728095726 +0200
--- src/memline.c       2015-07-17 13:58:04.193342051 +0200
***************
*** 5361,5368 ****
        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)
            size -= ffdos + 1;
      }
  
--- 5361,5370 ----
        if (ffdos)
            size += lnum - 1;
  
!       /* 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;
      }
  
*** ../vim-7.4.784/src/netbeans.c       2015-03-20 18:11:44.967196356 +0100
--- src/netbeans.c      2015-07-17 13:55:33.182783805 +0200
***************
*** 3802,3808 ****
            }
        }
        /* Correction for when last line doesn't have an EOL. */
!       if (!bufp->b_p_eol && bufp->b_p_bin)
            char_count -= eol_size;
      }
  
--- 3802,3808 ----
            }
        }
        /* Correction for when last line doesn't have an EOL. */
!       if (!bufp->b_p_eol && (bufp->b_p_bin || !bufp->b_p_fixeol))
            char_count -= eol_size;
      }
  
*** ../vim-7.4.784/src/ops.c    2015-07-17 13:22:43.157523671 +0200
--- src/ops.c   2015-07-17 13:58:25.945134391 +0200
***************
*** 7052,7058 ****
                                           &char_count_cursor, len, eol_size);
                    if (lnum == curbuf->b_ml.ml_line_count
                            && !curbuf->b_p_eol
!                           && curbuf->b_p_bin
                            && (long)STRLEN(s) < len)
                        byte_count_cursor -= eol_size;
                }
--- 7052,7058 ----
                                           &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_fixeol)
                            && (long)STRLEN(s) < len)
                        byte_count_cursor -= eol_size;
                }
***************
*** 7076,7082 ****
        }
  
        /* Correction for when last line doesn't have an EOL. */
!       if (!curbuf->b_p_eol && curbuf->b_p_bin)
            byte_count -= eol_size;
  
        if (VIsual_active)
--- 7076,7082 ----
        }
  
        /* Correction for when last line doesn't have an EOL. */
!       if (!curbuf->b_p_eol && (curbuf->b_p_bin || !curbuf->b_p_fixeol))
            byte_count -= eol_size;
  
        if (VIsual_active)
*** ../vim-7.4.784/src/option.c 2015-07-17 13:03:42.108357465 +0200
--- src/option.c        2015-07-17 13:55:33.186783767 +0200
***************
*** 98,103 ****
--- 98,104 ----
  # define PV_INC               OPT_BOTH(OPT_BUF(BV_INC))
  #endif
  #define PV_EOL                OPT_BUF(BV_EOL)
+ #define PV_FIXEOL     OPT_BUF(BV_FIXEOL)
  #define PV_EP         OPT_BOTH(OPT_BUF(BV_EP))
  #define PV_ET         OPT_BUF(BV_ET)
  #ifdef FEAT_MBYTE
***************
*** 306,311 ****
--- 307,313 ----
  static char_u *p_ofu;
  #endif
  static int    p_eol;
+ static int    p_fixeol;
  static int    p_et;
  #ifdef FEAT_MBYTE
  static char_u *p_fenc;
***************
*** 1169,1174 ****
--- 1171,1179 ----
                            {(char_u *)"", (char_u *)0L}
  #endif
                            SCRIPTID_INIT},
+     {"fixendofline",  "fixeol", P_BOOL|P_VI_DEF|P_RSTAT,
+                           (char_u *)&p_fixeol, PV_FIXEOL,
+                           {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
      {"fkmap",     "fk",   P_BOOL|P_VI_DEF,
  #ifdef FEAT_FKMAP
                            (char_u *)&p_fkmap, PV_NONE,
***************
*** 7781,7786 ****
--- 7786,7796 ----
      {
        redraw_titles();
      }
+     /* when 'fixeol' is changed, redraw the window title */
+     else if ((int *)varp == &curbuf->b_p_fixeol)
+     {
+       redraw_titles();
+     }
  # ifdef FEAT_MBYTE
      /* when 'bomb' is changed, redraw the window title and tab page text */
      else if ((int *)varp == &curbuf->b_p_bomb)
***************
*** 10176,10181 ****
--- 10186,10192 ----
        case PV_OFU:    return (char_u *)&(curbuf->b_p_ofu);
  #endif
        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);
  #ifdef FEAT_MBYTE
        case PV_FENC:   return (char_u *)&(curbuf->b_p_fenc);
***************
*** 11894,11899 ****
--- 11905,11911 ----
   * 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.
   */
***************
*** 11912,11918 ****
        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;
  #ifdef FEAT_MBYTE
      if (!buf->b_p_bin && buf->b_start_bomb != buf->b_p_bomb)
--- 11924,11930 ----
        return FALSE;
      if (buf->b_start_ffc != *buf->b_p_ff)
        return TRUE;
!     if ((buf->b_p_bin || !buf->b_p_fixeol) && buf->b_start_eol != 
buf->b_p_eol)
        return TRUE;
  #ifdef FEAT_MBYTE
      if (!buf->b_p_bin && buf->b_start_bomb != buf->b_p_bomb)
*** ../vim-7.4.784/src/option.h 2015-06-19 14:41:44.777813290 +0200
--- src/option.h        2015-07-17 13:55:33.186783767 +0200
***************
*** 962,967 ****
--- 962,968 ----
      , BV_INC
  #endif
      , BV_EOL
+     , BV_FIXEOL
      , BV_EP
      , BV_ET
      , BV_FENC
*** ../vim-7.4.784/src/os_unix.c        2015-03-31 13:33:00.801524871 +0200
--- src/os_unix.c       2015-07-17 13:55:33.186783767 +0200
***************
*** 4624,4630 ****
                                /* Finished a line, add a NL, unless this line
                                 * should not have one. */
                                if (lnum != curbuf->b_op_end.lnum
!                                       || !curbuf->b_p_bin
                                        || (lnum != curbuf->b_no_eol_lnum
                                            && (lnum !=
                                                    curbuf->b_ml.ml_line_count
--- 4624,4631 ----
                                /* Finished a line, add a NL, unless this line
                                 * should not have one. */
                                if (lnum != curbuf->b_op_end.lnum
!                                       || (!curbuf->b_p_bin
!                                           && curbuf->b_p_fixeol)
                                        || (lnum != curbuf->b_no_eol_lnum
                                            && (lnum !=
                                                    curbuf->b_ml.ml_line_count
*** ../vim-7.4.784/src/os_win32.c       2015-03-24 17:12:04.477113277 +0100
--- src/os_win32.c      2015-07-17 13:55:33.190783729 +0200
***************
*** 4173,4179 ****
            /* Finished a line, add a NL, unless this line should not have
             * one. */
            if (lnum != curbuf->b_op_end.lnum
!               || !curbuf->b_p_bin
                || (lnum != curbuf->b_no_eol_lnum
                    && (lnum != curbuf->b_ml.ml_line_count
                        || curbuf->b_p_eol)))
--- 4173,4180 ----
            /* Finished a line, add a NL, unless this line should not have
             * one. */
            if (lnum != curbuf->b_op_end.lnum
!               || (!curbuf->b_p_bin
!                   && curbuf->b_p_fixeol)
                || (lnum != curbuf->b_no_eol_lnum
                    && (lnum != curbuf->b_ml.ml_line_count
                        || curbuf->b_p_eol)))
*** ../vim-7.4.784/src/structs.h        2015-04-13 16:16:31.221091470 +0200
--- src/structs.h       2015-07-17 13:55:33.190783729 +0200
***************
*** 635,641 ****
      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_size;  /* total number of entries in ml_stack 
*/
  
      linenr_T  ml_line_lnum;   /* line number of cached line, 0 if not valid */
--- 635,641 ----
      int               ml_flags;
  
      infoptr_T *ml_stack;      /* stack of pointer blocks (array of IPTRs) */
!     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 */
***************
*** 1586,1591 ****
--- 1586,1592 ----
      char_u    *b_p_ofu;       /* 'omnifunc' */
  #endif
      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 */
  #ifdef FEAT_MBYTE
*** ../vim-7.4.784/src/testdir/Make_amiga.mak   2015-07-10 14:43:29.556722605 
+0200
--- src/testdir/Make_amiga.mak  2015-07-17 14:01:03.567629733 +0200
***************
*** 45,50 ****
--- 45,51 ----
                test_command_count.out \
                test_erasebackword.out \
                test_eval.out \
+               test_fixeol.out \
                test_increment.out \
                test_insertcount.out \
                test_listchars.out \
***************
*** 195,200 ****
--- 196,202 ----
  test_erasebackword.out: test_erasebackword.in
  test_eval.out: test_eval.in
  test_increment.out: test_increment.in
+ test_fixeol.out: test_fixeol.in
  test_insertcount.out: test_insertcount.in
  test_listchars.out: test_listchars.in
  test_listlbr.out: test_listlbr.in
*** ../vim-7.4.784/src/testdir/Make_dos.mak     2015-07-10 14:43:29.556722605 
+0200
--- src/testdir/Make_dos.mak    2015-07-17 14:00:58.519677917 +0200
***************
*** 44,49 ****
--- 44,50 ----
                test_command_count.out \
                test_erasebackword.out \
                test_eval.out \
+               test_fixeol.out \
                test_increment.out \
                test_insertcount.out \
                test_listchars.out \
*** ../vim-7.4.784/src/testdir/Make_ming.mak    2015-07-10 14:43:29.556722605 
+0200
--- src/testdir/Make_ming.mak   2015-07-17 14:01:15.847512519 +0200
***************
*** 66,71 ****
--- 66,72 ----
                test_command_count.out \
                test_erasebackword.out \
                test_eval.out \
+               test_fixeol.out \
                test_increment.out \
                test_insertcount.out \
                test_listchars.out \
*** ../vim-7.4.784/src/testdir/Make_os2.mak     2015-07-10 14:43:29.556722605 
+0200
--- src/testdir/Make_os2.mak    2015-07-17 14:01:25.883416724 +0200
***************
*** 46,51 ****
--- 46,52 ----
                test_command_count.out \
                test_erasebackword.out \
                test_eval.out \
+               test_fixeol.out \
                test_increment.out \
                test_insertcount.out \
                test_listchars.out \
*** ../vim-7.4.784/src/testdir/Make_vms.mms     2015-07-10 14:43:29.556722605 
+0200
--- src/testdir/Make_vms.mms    2015-07-17 14:01:36.355316767 +0200
***************
*** 4,10 ****
  # Authors:    Zoltan Arpadffy, <[email protected]>
  #             Sandor Kopanyi,  <[email protected]>
  #
! # Last change:  2015 Jul 10
  #
  # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
  # Edit the lines in the Configuration section below to select.
--- 4,10 ----
  # Authors:    Zoltan Arpadffy, <[email protected]>
  #             Sandor Kopanyi,  <[email protected]>
  #
! # Last change:  2015 Jul 17
  #
  # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
  # Edit the lines in the Configuration section below to select.
***************
*** 105,110 ****
--- 105,111 ----
         test_command_count.out \
         test_erasebackword.out \
         test_eval.out \
+        test_fixeol.out \
         test_increment.out \
         test_insertcount.out \
         test_listchars.out \
*** ../vim-7.4.784/src/testdir/Makefile 2015-07-10 14:43:29.556722605 +0200
--- src/testdir/Makefile        2015-07-17 14:01:46.679218225 +0200
***************
*** 42,47 ****
--- 42,48 ----
                test_command_count.out \
                test_erasebackword.out \
                test_eval.out \
+               test_fixeol.out \
                test_increment.out \
                test_insertcount.out \
                test_listchars.out \
*** ../vim-7.4.784/src/testdir/test_fixeol.in   2015-07-17 14:14:20.856020508 
+0200
--- src/testdir/test_fixeol.in  2015-07-17 13:55:33.190783729 +0200
***************
*** 0 ****
--- 1,40 ----
+ Tests for 'fixeol'                         vim: set ft=vim :
+  
+ STARTTEST
+ :" first write two test files – with and without trailing EOL
+ :" use Unix fileformat for consistency
+ :set ff=unix
+ :enew!
+ awith eol :w! XXEol
+ :enew!
+ :set noeol nofixeol
+ awithout eol :w! XXNoEol
+ :set eol fixeol
+ :bwipe XXEol XXNoEol
+ :"
+ :" try editing files with 'fixeol' disabled
+ :e! XXEol
+ ostays eol :set nofixeol
+ :w! XXTestEol
+ :e! XXNoEol
+ ostays without :set nofixeol
+ :w! XXTestNoEol
+ :bwipe XXEol XXNoEol XXTestEol XXTestNoEol
+ :set fixeol
+ :"
+ :" Append "END" to each file so that we can see what the last written char 
was.
+ ggdGaEND :w >>XXEol
+ :w >>XXNoEol
+ :w >>XXTestEol
+ :w >>XXTestNoEol
+ :"
+ :" Concatenate the results
+ :e! test.out
+ a0 :$r XXEol
+ :$r XXNoEol
+ Go1 :$r XXTestEol
+ :$r XXTestNoEol
+ :w
+ :qa!
+ ENDTEST
+ 
*** ../vim-7.4.784/src/testdir/test_fixeol.ok   2015-07-17 14:14:20.860020470 
+0200
--- src/testdir/test_fixeol.ok  2015-07-17 13:55:33.190783729 +0200
***************
*** 0 ****
--- 1,10 ----
+ 0
+ with eol
+ END
+ without eolEND
+ 1
+ with eol
+ stays eol
+ END
+ without eol
+ stays withoutEND
*** ../vim-7.4.784/runtime/doc/options.txt      2015-07-10 18:18:35.575206298 
+0200
--- runtime/doc/options.txt     2015-07-17 14:13:33.036477520 +0200
***************
*** 2670,2684 ****
                        local to buffer
                        {not in Vi}
        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.
  
                             *'equalalways'* *'ea'* *'noequalalways'* *'noea'*
  'equalalways' 'ea'    boolean (default on)
--- 2671,2686 ----
                        local to buffer
                        {not in Vi}
        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>
!       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)
***************
*** 3063,3068 ****
--- 3065,3081 ----
          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
*** ../vim-7.4.784/runtime/optwin.vim   2014-06-25 14:39:35.098348584 +0200
--- runtime/optwin.vim  2015-07-17 14:04:18.181772220 +0200
***************
*** 949,954 ****
--- 954,962 ----
  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)")
*** ../vim-7.4.784/src/version.c        2015-07-17 13:42:17.778373909 +0200
--- src/version.c       2015-07-17 13:54:24.543439196 +0200
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     785,
  /**/

-- 
A computer without Windows is like a fish without a bicycle.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui