To: [email protected]
Cc: vim-dev list <[email protected]>
Subject: patch 5.4n.19 (was: vim 5.4n pl0: :edit in options window causes problems)
In-Reply-To: <[email protected]>
From: Bram Moolenaar <[email protected]>
Date: Thu, 08 Jul 1999 15:23:55 +0200
Sender: [email protected]


Steve Mueller wrote:

> Try this:
>
> start vim
> :options
> :e
> i<space>
>
> "Unknown function: OW_Space" is the error I receive.  Related file:
> $VIMRUNTIME/optwin.vim.  The mappings for space and <CR> seem to be
> maintained in both normal and insert from the setup of the option window:

Something goes very wrong here.  The BufLeave autocommands are not executed,
since ":e" isn't supposed to leave the buffer.  But then the BufUnload
autocommand deletes the buffer.  That can be fixed by removing the mappings on
a BufUnload too, if the mappings still exist.

> Also, if you happen to have another buffer in the buffer list that's
> hidden and has a swapfile, vim does this: (from vim-5.4m)
>
> 1 buffer deleted
> ATTENTION
> Found a swap file by the name "~/.vimrc.swp"

Oh, oh, another buffer-unexpectedly-deleted-by-autocommand problem.  These
autocommands really have a lot of side effects.  But it can be fixed:


Patch 5.4n.19
Problem:    Doing ":e" (without argument) in an option-window causes trouble.
           The mappings for <CR> and <Space> are not removed.  When there is
           another buffer loaded, the swap file for it gets mixed up.
           (Steve Mueller)
Solution:   Also remove the mappings at the BufUnload event, if they are still
           present.
           When re-editing the same file causes the current buffer to be
           deleted, don't try editing it.
           Also added a test for this situation.
Files:      runtime/optwin.vim, src/ex_cmds.c, src/testdir/test13.in,
           src/testdir/test13.ok


*** ../vim-5.4n/runtime/optwin.vim      Sun Jul  4 20:36:36 1999
--- runtime/optwin.vim  Thu Jul  8 12:59:01 1999
***************
*** 1,7 ****
 " These commands create the option window.
 "
 " Maintainer: Bram Moolenaar <[email protected]>
! " Last change:        1999 Jun 24

 " Make sure the '<' flag is not included in 'cpoptions', otherwise <CR> would
 " not be recognized.  See ":help 'cpoptions'".
--- 1,7 ----
 " These commands create the option window.
 "
 " Maintainer: Bram Moolenaar <[email protected]>
! " Last change:        1999 Jul 08

 " Make sure the '<' flag is not included in 'cpoptions', otherwise <CR> would
 " not be recognized.  See ":help 'cpoptions'".
***************
*** 828,835 ****
   au!
   au BufEnter option-window call OW_enter()
   au BufLeave option-window call OW_leave()
!   au BufUnload,BufHidden option-window nested call OW_unload()
!       \ | delfun OW_unload
 augroup END

 fun! OW_enter()
--- 828,835 ----
   au!
   au BufEnter option-window call OW_enter()
   au BufLeave option-window call OW_leave()
!   au BufUnload,BufHidden option-window nested call OW_unload() |
!       \ delfun OW_unload
 augroup END

 fun! OW_enter()
***************
*** 845,854 ****
 fun! OW_leave()
   let cpo_save = &cpo
   let &cpo = ""
!   unmap <CR>
!   iunmap <CR>
!   unmap <Space>
!   iunmap <Space>
   let &cpo = cpo_save
 endfun

--- 845,856 ----
 fun! OW_leave()
   let cpo_save = &cpo
   let &cpo = ""
!   if mapcheck("<CR>") != ""
!     unmap <CR>
!     iunmap <CR>
!     unmap <Space>
!     iunmap <Space>
!   endif
   let &cpo = cpo_save
 endfun

***************
*** 864,869 ****
--- 866,872 ----
   delfun OW_Header
   au! optwin
   bdel option-window
+   call OW_leave()
   delfun OW_enter
   delfun OW_leave
 endfun
*** ../vim-5.4n/src/ex_cmds.c   Sun Jul  4 20:35:50 1999
--- src/ex_cmds.c       Thu Jul  8 13:21:11 1999
***************
*** 2224,2229 ****
--- 2224,2230 ----
     BUF               *buf;
 #if defined(AUTOCMD) || defined(GUI_DIALOG) || defined(CON_DIALOG)
     BUF               *old_curbuf = curbuf;
+     char_u    *new_name = NULL;
 #endif
     char_u    *free_fname = NULL;
 #ifdef USE_BROWSE
***************
*** 2367,2374 ****
       if (buf != curbuf)
       {
 #ifdef AUTOCMD
-           char_u  *new_name = NULL;
-
           /*
            * Be careful: The autocommands may delete any buffer and change
            * the current buffer.
--- 2368,2373 ----
***************
*** 2438,2451 ****
       oldbuf = (flags & ECMD_OLDBUF);
     }

-     /* Assume success now */
-     retval = OK;
-
- /*
-  * If we get here we are sure to start editing
-  */
-     /* don't redraw until the cursor is in the right line */
-     ++RedrawingDisabled;
     if (flags & ECMD_SET_HELP)
     {
       curbuf->b_help = TRUE;
--- 2437,2442 ----
***************
*** 2464,2474 ****
--- 2455,2497 ----
       set_last_cursor(curwin);        /* may set b_last_cursor */
       if (newlnum == ECMD_LAST || newlnum == ECMD_LASTL)
           newlnum = curwin->w_cursor.lnum;
+ #ifdef AUTOCMD
+       buf = curbuf;
+       if (buf->b_fname != NULL)
+           new_name = vim_strsave(buf->b_fname);
+       else
+           new_name = NULL;
+ #endif
       buf_freeall(curbuf, FALSE);     /* free all things for buffer */
+ #ifdef AUTOCMD
+       /* If autocommands deleted the buffer we were going to re-edit, give
+        * up and jump to the end. */
+       if (!buf_valid(buf))
+       {
+           delbuf_msg(new_name);       /* frees new_name */
+           goto theend;
+       }
+       vim_free(new_name);
+
+       /* If autocommands change buffers under our fingers, forget about
+        * re-editing the file.  Should do the buf_clear(), but perhaps the
+        * autocommands changed the buffer... */
+       if (buf != curbuf)
+           goto theend;
+ #endif
       buf_clear(curbuf);
       curbuf->b_op_start.lnum = 0;    /* clear '[ and '] marks */
       curbuf->b_op_end.lnum = 0;
     }
+
+ /*
+  * If we get here we are sure to start editing
+  */
+     /* don't redraw until the cursor is in the right line */
+     ++RedrawingDisabled;
+
+     /* Assume success now */
+     retval = OK;

     /*
      * Reset cursor position, could be used by autocommands.
*** ../vim-5.4n/src/testdir/test13.in   Sun Jul  4 20:35:24 1999
--- src/testdir/test13.in       Thu Jul  8 13:32:29 1999
***************
*** 31,37 ****
--- 31,41 ----
 :bdel Xtestje2 Xtestje3 test.out
 :au!
 :au! BufUnload Xtestje1 bdel
+ :e Xtestje3
+ :w >>test.out
 :e Xtestje2
+ :sp Xtestje1
+ :e
 :w >>test.out
 :!rm -rf Xtestje*
 :qa!
*** ../vim-5.4n/src/testdir/test13.ok   Sun Jul  4 20:35:25 1999
--- src/testdir/test13.ok       Thu Jul  8 13:32:45 1999
***************
*** 11,16 ****
--- 11,22 ----
       contents
 end of testfile
 start of testfile
+ testje3
+       contents
+       contents
+       contents
+ end of testfile
+ start of testfile
 testje2
       contents
       contents

--
CART DRIVER: Bring out your dead!
  There are legs stick out of windows and doors.  Two MEN are fighting in the
  mud - covered from head to foot in it.  Another MAN is on his hands in
  knees shovelling mud into his mouth.  We just catch sight of a MAN falling
  into a well.
                "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

--/-/---- Bram Moolenaar ---- [email protected] ---- [email protected] ---\-\--
 \ \    www.vim.org/iccf      www.moolenaar.net       www.vim.org    / /