Patch 7.3.052
Problem:    When 'completefunc' opens a new window all kinds of errors follow.
            (Xavier Deguillard)
Solution:   When 'completefunc' goes to another window or buffer and when it
            deletes text abort completion.  Add a test for 'completefunc'.
Files:      src/edit.c, 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/test76.in, src/testdir/test76.ok


*** ../vim-7.3.051/src/edit.c   2010-08-15 21:57:25.000000000 +0200
--- src/edit.c  2010-11-10 16:50:12.000000000 +0100
***************
*** 58,63 ****
--- 58,67 ----
  };
  
  static char e_hitend[] = N_("Hit end of paragraph");
+ #ifdef FEAT_COMPL_FUNC
+ static char e_complwin[] = N_("E839: Completion function changed window");
+ static char e_compldel[] = N_("E840: Completion function deleted text");
+ #endif
  
  /*
   * Structure used to store one match for insert completion.
***************
*** 3833,3838 ****
--- 3837,3844 ----
      char_u    *args[2];
      char_u    *funcname;
      pos_T     pos;
+     win_T     *curwin_save;
+     buf_T     *curbuf_save;
  
      funcname = (type == CTRL_X_FUNCTION) ? curbuf->b_p_cfu : curbuf->b_p_ofu;
      if (*funcname == NUL)
***************
*** 3843,3855 ****
      args[1] = base;
  
      pos = curwin->w_cursor;
      matchlist = call_func_retlist(funcname, 2, args, FALSE);
      curwin->w_cursor = pos;   /* restore the cursor position */
!     if (matchlist == NULL)
!       return;
  
!     ins_compl_add_list(matchlist);
!     list_unref(matchlist);
  }
  #endif /* FEAT_COMPL_FUNC */
  
--- 3849,3875 ----
      args[1] = base;
  
      pos = curwin->w_cursor;
+     curwin_save = curwin;
+     curbuf_save = curbuf;
      matchlist = call_func_retlist(funcname, 2, args, FALSE);
+     if (curwin_save != curwin || curbuf_save != curbuf)
+     {
+       EMSG(_(e_complwin));
+       goto theend;
+     }
      curwin->w_cursor = pos;   /* restore the cursor position */
!     check_cursor();
!     if (!equalpos(curwin->w_cursor, pos))
!     {
!       EMSG(_(e_compldel));
!       goto theend;
!     }
!     if (matchlist != NULL)
!       ins_compl_add_list(matchlist);
  
! theend:
!     if (matchlist != NULL)
!       list_unref(matchlist);
  }
  #endif /* FEAT_COMPL_FUNC */
  
***************
*** 4994,4999 ****
--- 5014,5021 ----
            int         col;
            char_u      *funcname;
            pos_T       pos;
+           win_T       *curwin_save;
+           buf_T       *curbuf_save;
  
            /* Call 'completefunc' or 'omnifunc' and get pattern length as a
             * string */
***************
*** 5009,5016 ****
--- 5031,5051 ----
            args[0] = (char_u *)"1";
            args[1] = NULL;
            pos = curwin->w_cursor;
+           curwin_save = curwin;
+           curbuf_save = curbuf;
            col = call_func_retnr(funcname, 2, args, FALSE);
+           if (curwin_save != curwin || curbuf_save != curbuf)
+           {
+               EMSG(_(e_complwin));
+               return FAIL;
+           }
            curwin->w_cursor = pos;     /* restore the cursor position */
+           check_cursor();
+           if (!equalpos(curwin->w_cursor, pos))
+           {
+               EMSG(_(e_compldel));
+               return FAIL;
+           }
  
            if (col < 0)
                col = curs_col;
*** ../vim-7.3.051/src/testdir/Make_amiga.mak   2010-10-27 18:36:32.000000000 
+0200
--- src/testdir/Make_amiga.mak  2010-11-10 15:48:30.000000000 +0100
***************
*** 27,33 ****
                test56.out test57.out test58.out test59.out test60.out \
                test61.out test62.out test63.out test64.out test65.out \
                test66.out test67.out test68.out test69.out test70.out \
!               test71.out test72.out test73.out test74.out test75.out
  
  .SUFFIXES: .in .out
  
--- 27,34 ----
                test56.out test57.out test58.out test59.out test60.out \
                test61.out test62.out test63.out test64.out test65.out \
                test66.out test67.out test68.out test69.out test70.out \
!               test71.out test72.out test73.out test74.out test75.out \
!               test76.out
  
  .SUFFIXES: .in .out
  
***************
*** 122,124 ****
--- 123,126 ----
  test73.out: test73.in
  test74.out: test74.in
  test75.out: test75.in
+ test76.out: test76.in
*** ../vim-7.3.051/src/testdir/Make_dos.mak     2010-10-27 18:36:32.000000000 
+0200
--- src/testdir/Make_dos.mak    2010-11-10 15:48:38.000000000 +0100
***************
*** 28,34 ****
                test37.out test38.out test39.out test40.out test41.out \
                test42.out test52.out test65.out test66.out test67.out \
                test68.out test69.out test71.out test72.out test73.out \
!               test74.out test75.out
  
  SCRIPTS32 =   test50.out test70.out
  
--- 28,34 ----
                test37.out test38.out test39.out test40.out test41.out \
                test42.out test52.out test65.out test66.out test67.out \
                test68.out test69.out test71.out test72.out test73.out \
!               test74.out test75.out test76.out
  
  SCRIPTS32 =   test50.out test70.out
  
*** ../vim-7.3.051/src/testdir/Make_ming.mak    2010-10-27 18:36:32.000000000 
+0200
--- src/testdir/Make_ming.mak   2010-11-10 15:48:53.000000000 +0100
***************
*** 48,54 ****
                test37.out test38.out test39.out test40.out test41.out \
                test42.out test52.out test65.out test66.out test67.out \
                test68.out test69.out test71.out test72.out test73.out \
!               test74.out test75.out
  
  SCRIPTS32 =   test50.out test70.out
  
--- 48,54 ----
                test37.out test38.out test39.out test40.out test41.out \
                test42.out test52.out test65.out test66.out test67.out \
                test68.out test69.out test71.out test72.out test73.out \
!               test74.out test75.out test76.out
  
  SCRIPTS32 =   test50.out test70.out
  
*** ../vim-7.3.051/src/testdir/Make_os2.mak     2010-10-27 18:36:32.000000000 
+0200
--- src/testdir/Make_os2.mak    2010-11-10 15:49:10.000000000 +0100
***************
*** 27,33 ****
                test56.out test57.out test58.out test59.out test60.out \
                test61.out test62.out test63.out test64.out test65.out \
                test66.out test67.out test68.out test69.out test70.out \
!               test71.out test72.out test73.out test74.out test75.out
  
  .SUFFIXES: .in .out
  
--- 27,34 ----
                test56.out test57.out test58.out test59.out test60.out \
                test61.out test62.out test63.out test64.out test65.out \
                test66.out test67.out test68.out test69.out test70.out \
!               test71.out test72.out test73.out test74.out test75.out \
!               test76.out
  
  .SUFFIXES: .in .out
  
*** ../vim-7.3.051/src/testdir/Make_vms.mms     2010-10-27 18:36:32.000000000 
+0200
--- src/testdir/Make_vms.mms    2010-11-10 15:49:32.000000000 +0100
***************
*** 4,10 ****
  # Authors:    Zoltan Arpadffy, <[email protected]>
  #             Sandor Kopanyi,  <[email protected]>
  #
! # Last change:  2010 Oct 20
  #
  # 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:  2010 Nov 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.
***************
*** 74,80 ****
         test56.out test57.out test60.out \
         test61.out test62.out test63.out test64.out test65.out \
         test66.out test67.out test68.out test69.out \
!        test71.out test72.out test74.out test75.out
  
  # Known problems:
  # Test 30: a problem around mac format - unknown reason
--- 74,80 ----
         test56.out test57.out test60.out \
         test61.out test62.out test63.out test64.out test65.out \
         test66.out test67.out test68.out test69.out \
!        test71.out test72.out test74.out test75.out test76.out
  
  # Known problems:
  # Test 30: a problem around mac format - unknown reason
*** ../vim-7.3.051/src/testdir/Makefile 2010-10-27 18:36:32.000000000 +0200
--- src/testdir/Makefile        2010-11-10 15:47:32.000000000 +0100
***************
*** 25,31 ****
                test59.out test60.out test61.out test62.out test63.out \
                test64.out test65.out test66.out test67.out test68.out \
                test69.out test70.out test71.out test72.out test73.out \
!               test74.out test75.out
  
  SCRIPTS_GUI = test16.out
  
--- 25,31 ----
                test59.out test60.out test61.out test62.out test63.out \
                test64.out test65.out test66.out test67.out test68.out \
                test69.out test70.out test71.out test72.out test73.out \
!               test74.out test75.out test76.out
  
  SCRIPTS_GUI = test16.out
  
*** ../vim-7.3.051/src/testdir/test76.in        2010-11-10 16:51:45.000000000 
+0100
--- src/testdir/test76.in       2010-11-10 16:38:45.000000000 +0100
***************
*** 0 ****
--- 1,46 ----
+ Tests for completefunc/omnifunc. vim: set ft=vim :
+ 
+ STARTTEST
+ :"Test that nothing happens if the 'completefunc' opens
+ :"a new window (no completion, no crash)
+ :so small.vim
+ :function! DummyCompleteOne(findstart, base)
+ :  if a:findstart
+ :    return 0
+ :  else
+ :    wincmd n
+ :    return ['onedef', 'oneDEF']
+ :  endif
+ :endfunction
+ :setlocal completefunc=DummyCompleteOne
+ /^one
+ A    :q!
+ :function! DummyCompleteTwo(findstart, base)
+ :  if a:findstart
+ :    wincmd n
+ :    return 0
+ :  else
+ :    return ['twodef', 'twoDEF']
+ :  endif
+ :endfunction
+ :setlocal completefunc=DummyCompleteTwo
+ /^two
+ A    :q!
+ :"Test that 'completefunc' works when it's OK.
+ :function! DummyCompleteThree(findstart, base)
+ :  if a:findstart
+ :    return 0
+ :  else
+ :    return ['threedef', 'threeDEF']
+ :  endif
+ :endfunction
+ :setlocal completefunc=DummyCompleteThree
+ /^three
+ A    :/^+++/,/^three/w! test.out
+ :qa!
+ ENDTEST
+ 
+ +++
+ one
+ two
+ three
*** ../vim-7.3.051/src/testdir/test76.ok        2010-11-10 16:51:45.000000000 
+0100
--- src/testdir/test76.ok       2010-11-10 16:38:58.000000000 +0100
***************
*** 0 ****
--- 1,4 ----
+ +++
+ 
+ two
+ threeDEF
*** ../vim-7.3.051/src/version.c        2010-11-10 15:37:00.000000000 +0100
--- src/version.c       2010-11-10 16:40:29.000000000 +0100
***************
*** 716,717 ****
--- 716,719 ----
  {   /* Add new patch number below this line */
+ /**/
+     52,
  /**/

-- 
BRIDGEKEEPER: What is the air-speed velocity of an unladen swallow?
ARTHUR:       What do you mean?  An African or European swallow?
BRIDGEKEEPER: Er ...  I don't know that ... Aaaaarrrrrrggghhh!
   BRIDGEKEEPER is cast into the gorge.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.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