Patch 7.3.124
Problem:    When writing a file in binary mode it may be missing the final EOL
            if a file previously read was missing the EOL. (Kevin Goodsell)
Solution:   Move the write_no_eol_lnum into the buffer struct.
Files:      src/structs.h, src/fileio.c, src/globals.h, src/os_unix.c


*** ../vim-7.3.123/src/structs.h        2010-10-20 21:22:17.000000000 +0200
--- src/structs.h       2011-02-15 17:06:34.000000000 +0100
***************
*** 1564,1569 ****
--- 1564,1572 ----
  
      /* end of buffer options */
  
+     linenr_T  b_no_eol_lnum;  /* non-zero lnum when last line of next binary
+                                * write should not have an end-of-line */
+ 
      int               b_start_eol;    /* last line had eol when it was read */
      int               b_start_ffc;    /* first char of 'ff' when edit started 
*/
  #ifdef FEAT_MBYTE
*** ../vim-7.3.123/src/fileio.c 2011-02-09 16:44:45.000000000 +0100
--- src/fileio.c        2011-02-15 17:30:54.000000000 +0100
***************
*** 317,323 ****
      int               using_b_fname;
  #endif
  
!     write_no_eol_lnum = 0;    /* in case it was set by the previous read */
  
      /*
       * If there is no file name yet, use the one for the read file.
--- 317,323 ----
      int               using_b_fname;
  #endif
  
!     curbuf->b_no_eol_lnum = 0;        /* in case it was set by the previous 
read */
  
      /*
       * If there is no file name yet, use the one for the read file.
***************
*** 2599,2608 ****
  
      /*
       * Trick: We remember if the last line of the read didn't have
!      * an eol for when writing it again.  This is required for
       * ":autocmd FileReadPost *.gz set bin|'[,']!gunzip" to work.
       */
!     write_no_eol_lnum = read_no_eol_lnum;
  
      /* When reloading a buffer put the cursor at the first line that is
       * different. */
--- 2599,2609 ----
  
      /*
       * 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;
  
      /* When reloading a buffer put the cursor at the first line that is
       * different. */
***************
*** 2650,2662 ****
                                                            FALSE, NULL, eap);
        if (msg_scrolled == n)
            msg_scroll = m;
! #ifdef FEAT_EVAL
        if (aborting())     /* autocmds may abort script processing */
            return FAIL;
! #endif
      }
  #endif
  
      if (recoverymode && error)
        return FAIL;
      return OK;
--- 2651,2667 ----
                                                            FALSE, NULL, eap);
        if (msg_scrolled == n)
            msg_scroll = m;
! # ifdef FEAT_EVAL
        if (aborting())     /* autocmds may abort script processing */
            return FAIL;
! # endif
      }
  #endif
  
+     /* Reset now, following writes should not omit the EOL.  Also, the line
+      * number will become invalid because of edits. */
+     curbuf->b_no_eol_lnum = 0;
+ 
      if (recoverymode && error)
        return FAIL;
      return OK;
***************
*** 4560,4566 ****
        if (end == 0
                || (lnum == end
                    && write_bin
!                   && (lnum == write_no_eol_lnum
                        || (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol))))
        {
            ++lnum;                     /* written the line, count it */
--- 4565,4571 ----
        if (end == 0
                || (lnum == end
                    && write_bin
!                   && (lnum == buf->b_no_eol_lnum
                        || (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol))))
        {
            ++lnum;                     /* written the line, count it */
***************
*** 5086,5093 ****
      {
        aco_save_T      aco;
  
-       write_no_eol_lnum = 0;  /* in case it was set by the previous read */
- 
        /*
         * Apply POST autocommands.
         * Careful: The autocommands may call buf_write() recursively!
--- 5091,5096 ----
***************
*** 7256,7263 ****
  write_lnum_adjust(offset)
      linenr_T  offset;
  {
!     if (write_no_eol_lnum != 0)               /* only if there is a missing 
eol */
!       write_no_eol_lnum += offset;
  }
  
  #if defined(TEMPDIRNAMES) || defined(PROTO)
--- 7259,7266 ----
  write_lnum_adjust(offset)
      linenr_T  offset;
  {
!     if (curbuf->b_no_eol_lnum != 0)   /* only if there is a missing eol */
!       curbuf->b_no_eol_lnum += offset;
  }
  
  #if defined(TEMPDIRNAMES) || defined(PROTO)
*** ../vim-7.3.123/src/globals.h        2010-12-02 21:43:10.000000000 +0100
--- src/globals.h       2011-02-15 17:06:06.000000000 +0100
***************
*** 1057,1066 ****
                        ;
  #endif
  
- EXTERN linenr_T       write_no_eol_lnum INIT(= 0); /* non-zero lnum when last 
line
-                                               of next binary write should
-                                               not have an end-of-line */
- 
  #ifdef FEAT_WINDOWS
  EXTERN int    postponed_split INIT(= 0);  /* for CTRL-W CTRL-] command */
  EXTERN int    postponed_split_flags INIT(= 0);  /* args for win_split() */
--- 1057,1062 ----
*** ../vim-7.3.123/src/os_unix.c        2011-02-09 18:47:36.000000000 +0100
--- src/os_unix.c       2011-02-15 17:07:22.000000000 +0100
***************
*** 4245,4251 ****
                                 * should not have one. */
                                if (lnum != curbuf->b_op_end.lnum
                                        || !curbuf->b_p_bin
!                                       || (lnum != write_no_eol_lnum
                                            && (lnum !=
                                                    curbuf->b_ml.ml_line_count
                                                    || curbuf->b_p_eol)))
--- 4245,4251 ----
                                 * 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)))
***************
*** 4588,4597 ****
                    {
                        append_ga_line(&ga);
                        /* remember that the NL was missing */
!                       write_no_eol_lnum = curwin->w_cursor.lnum;
                    }
                    else
!                       write_no_eol_lnum = 0;
                    ga_clear(&ga);
                }
  
--- 4588,4597 ----
                    {
                        append_ga_line(&ga);
                        /* remember that the NL was missing */
!                       curbuf->b_no_eol_lnum = curwin->w_cursor.lnum;
                    }
                    else
!                       curbuf->b_no_eol_lnum = 0;
                    ga_clear(&ga);
                }
  
*** ../vim-7.3.123/src/version.c        2011-02-15 16:29:54.000000000 +0100
--- src/version.c       2011-02-15 17:37:38.000000000 +0100
***************
*** 716,717 ****
--- 716,719 ----
  {   /* Add new patch number below this line */
+ /**/
+     124,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
270. You are subscribed to a mailing list for every piece of software
     you use.

 /// 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

Raspunde prin e-mail lui