de888e4
To: vim_dev@googlegroups.com
de888e4
Subject: Patch 7.3.052
de888e4
Fcc: outbox
de888e4
From: Bram Moolenaar <Bram@moolenaar.net>
de888e4
Mime-Version: 1.0
de888e4
Content-Type: text/plain; charset=UTF-8
de888e4
Content-Transfer-Encoding: 8bit
de888e4
------------
de888e4
de888e4
Patch 7.3.052
de888e4
Problem:    When 'completefunc' opens a new window all kinds of errors follow.
de888e4
	    (Xavier Deguillard)
de888e4
Solution:   When 'completefunc' goes to another window or buffer and when it
de888e4
	    deletes text abort completion.  Add a test for 'completefunc'.
de888e4
Files:	    src/edit.c, src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
de888e4
	    src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
de888e4
	    src/testdir/Make_vms.mms, src/testdir/Makefile,
de888e4
	    src/testdir/test76.in, src/testdir/test76.ok
de888e4
de888e4
de888e4
*** ../vim-7.3.051/src/edit.c	2010-08-15 21:57:25.000000000 +0200
de888e4
--- src/edit.c	2010-11-10 16:50:12.000000000 +0100
de888e4
***************
de888e4
*** 58,63 ****
de888e4
--- 58,67 ----
de888e4
  };
de888e4
  
de888e4
  static char e_hitend[] = N_("Hit end of paragraph");
de888e4
+ #ifdef FEAT_COMPL_FUNC
de888e4
+ static char e_complwin[] = N_("E839: Completion function changed window");
de888e4
+ static char e_compldel[] = N_("E840: Completion function deleted text");
de888e4
+ #endif
de888e4
  
de888e4
  /*
de888e4
   * Structure used to store one match for insert completion.
de888e4
***************
de888e4
*** 3833,3838 ****
de888e4
--- 3837,3844 ----
de888e4
      char_u	*args[2];
de888e4
      char_u	*funcname;
de888e4
      pos_T	pos;
de888e4
+     win_T	*curwin_save;
de888e4
+     buf_T	*curbuf_save;
de888e4
  
de888e4
      funcname = (type == CTRL_X_FUNCTION) ? curbuf->b_p_cfu : curbuf->b_p_ofu;
de888e4
      if (*funcname == NUL)
de888e4
***************
de888e4
*** 3843,3855 ****
de888e4
      args[1] = base;
de888e4
  
de888e4
      pos = curwin->w_cursor;
de888e4
      matchlist = call_func_retlist(funcname, 2, args, FALSE);
de888e4
      curwin->w_cursor = pos;	/* restore the cursor position */
de888e4
!     if (matchlist == NULL)
de888e4
! 	return;
de888e4
  
de888e4
!     ins_compl_add_list(matchlist);
de888e4
!     list_unref(matchlist);
de888e4
  }
de888e4
  #endif /* FEAT_COMPL_FUNC */
de888e4
  
de888e4
--- 3849,3875 ----
de888e4
      args[1] = base;
de888e4
  
de888e4
      pos = curwin->w_cursor;
de888e4
+     curwin_save = curwin;
de888e4
+     curbuf_save = curbuf;
de888e4
      matchlist = call_func_retlist(funcname, 2, args, FALSE);
de888e4
+     if (curwin_save != curwin || curbuf_save != curbuf)
de888e4
+     {
de888e4
+ 	EMSG(_(e_complwin));
de888e4
+ 	goto theend;
de888e4
+     }
de888e4
      curwin->w_cursor = pos;	/* restore the cursor position */
de888e4
!     check_cursor();
de888e4
!     if (!equalpos(curwin->w_cursor, pos))
de888e4
!     {
de888e4
! 	EMSG(_(e_compldel));
de888e4
! 	goto theend;
de888e4
!     }
de888e4
!     if (matchlist != NULL)
de888e4
! 	ins_compl_add_list(matchlist);
de888e4
  
de888e4
! theend:
de888e4
!     if (matchlist != NULL)
de888e4
! 	list_unref(matchlist);
de888e4
  }
de888e4
  #endif /* FEAT_COMPL_FUNC */
de888e4
  
de888e4
***************
de888e4
*** 4994,4999 ****
de888e4
--- 5014,5021 ----
de888e4
  	    int		col;
de888e4
  	    char_u	*funcname;
de888e4
  	    pos_T	pos;
de888e4
+ 	    win_T	*curwin_save;
de888e4
+ 	    buf_T	*curbuf_save;
de888e4
  
de888e4
  	    /* Call 'completefunc' or 'omnifunc' and get pattern length as a
de888e4
  	     * string */
de888e4
***************
de888e4
*** 5009,5016 ****
de888e4
--- 5031,5051 ----
de888e4
  	    args[0] = (char_u *)"1";
de888e4
  	    args[1] = NULL;
de888e4
  	    pos = curwin->w_cursor;
de888e4
+ 	    curwin_save = curwin;
de888e4
+ 	    curbuf_save = curbuf;
de888e4
  	    col = call_func_retnr(funcname, 2, args, FALSE);
de888e4
+ 	    if (curwin_save != curwin || curbuf_save != curbuf)
de888e4
+ 	    {
de888e4
+ 		EMSG(_(e_complwin));
de888e4
+ 		return FAIL;
de888e4
+ 	    }
de888e4
  	    curwin->w_cursor = pos;	/* restore the cursor position */
de888e4
+ 	    check_cursor();
de888e4
+ 	    if (!equalpos(curwin->w_cursor, pos))
de888e4
+ 	    {
de888e4
+ 		EMSG(_(e_compldel));
de888e4
+ 		return FAIL;
de888e4
+ 	    }
de888e4
  
de888e4
  	    if (col < 0)
de888e4
  		col = curs_col;
de888e4
*** ../vim-7.3.051/src/testdir/Make_amiga.mak	2010-10-27 18:36:32.000000000 +0200
de888e4
--- src/testdir/Make_amiga.mak	2010-11-10 15:48:30.000000000 +0100
de888e4
***************
de888e4
*** 27,33 ****
de888e4
  		test56.out test57.out test58.out test59.out test60.out \
de888e4
  		test61.out test62.out test63.out test64.out test65.out \
de888e4
  		test66.out test67.out test68.out test69.out test70.out \
de888e4
! 		test71.out test72.out test73.out test74.out test75.out
de888e4
  
de888e4
  .SUFFIXES: .in .out
de888e4
  
de888e4
--- 27,34 ----
de888e4
  		test56.out test57.out test58.out test59.out test60.out \
de888e4
  		test61.out test62.out test63.out test64.out test65.out \
de888e4
  		test66.out test67.out test68.out test69.out test70.out \
de888e4
! 		test71.out test72.out test73.out test74.out test75.out \
de888e4
! 		test76.out
de888e4
  
de888e4
  .SUFFIXES: .in .out
de888e4
  
de888e4
***************
de888e4
*** 122,124 ****
de888e4
--- 123,126 ----
de888e4
  test73.out: test73.in
de888e4
  test74.out: test74.in
de888e4
  test75.out: test75.in
de888e4
+ test76.out: test76.in
de888e4
*** ../vim-7.3.051/src/testdir/Make_dos.mak	2010-10-27 18:36:32.000000000 +0200
de888e4
--- src/testdir/Make_dos.mak	2010-11-10 15:48:38.000000000 +0100
de888e4
***************
de888e4
*** 28,34 ****
de888e4
  		test37.out test38.out test39.out test40.out test41.out \
de888e4
  		test42.out test52.out test65.out test66.out test67.out \
de888e4
  		test68.out test69.out test71.out test72.out test73.out \
de888e4
! 		test74.out test75.out
de888e4
  
de888e4
  SCRIPTS32 =	test50.out test70.out
de888e4
  
de888e4
--- 28,34 ----
de888e4
  		test37.out test38.out test39.out test40.out test41.out \
de888e4
  		test42.out test52.out test65.out test66.out test67.out \
de888e4
  		test68.out test69.out test71.out test72.out test73.out \
de888e4
! 		test74.out test75.out test76.out
de888e4
  
de888e4
  SCRIPTS32 =	test50.out test70.out
de888e4
  
de888e4
*** ../vim-7.3.051/src/testdir/Make_ming.mak	2010-10-27 18:36:32.000000000 +0200
de888e4
--- src/testdir/Make_ming.mak	2010-11-10 15:48:53.000000000 +0100
de888e4
***************
de888e4
*** 48,54 ****
de888e4
  		test37.out test38.out test39.out test40.out test41.out \
de888e4
  		test42.out test52.out test65.out test66.out test67.out \
de888e4
  		test68.out test69.out test71.out test72.out test73.out \
de888e4
! 		test74.out test75.out
de888e4
  
de888e4
  SCRIPTS32 =	test50.out test70.out
de888e4
  
de888e4
--- 48,54 ----
de888e4
  		test37.out test38.out test39.out test40.out test41.out \
de888e4
  		test42.out test52.out test65.out test66.out test67.out \
de888e4
  		test68.out test69.out test71.out test72.out test73.out \
de888e4
! 		test74.out test75.out test76.out
de888e4
  
de888e4
  SCRIPTS32 =	test50.out test70.out
de888e4
  
de888e4
*** ../vim-7.3.051/src/testdir/Make_os2.mak	2010-10-27 18:36:32.000000000 +0200
de888e4
--- src/testdir/Make_os2.mak	2010-11-10 15:49:10.000000000 +0100
de888e4
***************
de888e4
*** 27,33 ****
de888e4
  		test56.out test57.out test58.out test59.out test60.out \
de888e4
  		test61.out test62.out test63.out test64.out test65.out \
de888e4
  		test66.out test67.out test68.out test69.out test70.out \
de888e4
! 		test71.out test72.out test73.out test74.out test75.out
de888e4
  
de888e4
  .SUFFIXES: .in .out
de888e4
  
de888e4
--- 27,34 ----
de888e4
  		test56.out test57.out test58.out test59.out test60.out \
de888e4
  		test61.out test62.out test63.out test64.out test65.out \
de888e4
  		test66.out test67.out test68.out test69.out test70.out \
de888e4
! 		test71.out test72.out test73.out test74.out test75.out \
de888e4
! 		test76.out
de888e4
  
de888e4
  .SUFFIXES: .in .out
de888e4
  
de888e4
*** ../vim-7.3.051/src/testdir/Make_vms.mms	2010-10-27 18:36:32.000000000 +0200
de888e4
--- src/testdir/Make_vms.mms	2010-11-10 15:49:32.000000000 +0100
de888e4
***************
de888e4
*** 4,10 ****
de888e4
  # Authors:	Zoltan Arpadffy, <arpadffy@polarhome.com>
de888e4
  #		Sandor Kopanyi,  <sandor.kopanyi@mailbox.hu>
de888e4
  #
de888e4
! # Last change:  2010 Oct 20
de888e4
  #
de888e4
  # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
de888e4
  # Edit the lines in the Configuration section below to select.
de888e4
--- 4,10 ----
de888e4
  # Authors:	Zoltan Arpadffy, <arpadffy@polarhome.com>
de888e4
  #		Sandor Kopanyi,  <sandor.kopanyi@mailbox.hu>
de888e4
  #
de888e4
! # Last change:  2010 Nov 10
de888e4
  #
de888e4
  # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
de888e4
  # Edit the lines in the Configuration section below to select.
de888e4
***************
de888e4
*** 74,80 ****
de888e4
  	 test56.out test57.out test60.out \
de888e4
  	 test61.out test62.out test63.out test64.out test65.out \
de888e4
  	 test66.out test67.out test68.out test69.out \
de888e4
! 	 test71.out test72.out test74.out test75.out
de888e4
  
de888e4
  # Known problems:
de888e4
  # Test 30: a problem around mac format - unknown reason
de888e4
--- 74,80 ----
de888e4
  	 test56.out test57.out test60.out \
de888e4
  	 test61.out test62.out test63.out test64.out test65.out \
de888e4
  	 test66.out test67.out test68.out test69.out \
de888e4
! 	 test71.out test72.out test74.out test75.out test76.out
de888e4
  
de888e4
  # Known problems:
de888e4
  # Test 30: a problem around mac format - unknown reason
de888e4
*** ../vim-7.3.051/src/testdir/Makefile	2010-10-27 18:36:32.000000000 +0200
de888e4
--- src/testdir/Makefile	2010-11-10 15:47:32.000000000 +0100
de888e4
***************
de888e4
*** 25,31 ****
de888e4
  		test59.out test60.out test61.out test62.out test63.out \
de888e4
  		test64.out test65.out test66.out test67.out test68.out \
de888e4
  		test69.out test70.out test71.out test72.out test73.out \
de888e4
! 		test74.out test75.out
de888e4
  
de888e4
  SCRIPTS_GUI = test16.out
de888e4
  
de888e4
--- 25,31 ----
de888e4
  		test59.out test60.out test61.out test62.out test63.out \
de888e4
  		test64.out test65.out test66.out test67.out test68.out \
de888e4
  		test69.out test70.out test71.out test72.out test73.out \
de888e4
! 		test74.out test75.out test76.out
de888e4
  
de888e4
  SCRIPTS_GUI = test16.out
de888e4
  
de888e4
*** ../vim-7.3.051/src/testdir/test76.in	2010-11-10 16:51:45.000000000 +0100
de888e4
--- src/testdir/test76.in	2010-11-10 16:38:45.000000000 +0100
de888e4
***************
de888e4
*** 0 ****
de888e4
--- 1,46 ----
de888e4
+ Tests for completefunc/omnifunc. vim: set ft=vim :
de888e4
+ 
de888e4
+ STARTTEST
de888e4
+ :"Test that nothing happens if the 'completefunc' opens
de888e4
+ :"a new window (no completion, no crash)
de888e4
+ :so small.vim
de888e4
+ :function! DummyCompleteOne(findstart, base)
de888e4
+ :  if a:findstart
de888e4
+ :    return 0
de888e4
+ :  else
de888e4
+ :    wincmd n
de888e4
+ :    return ['onedef', 'oneDEF']
de888e4
+ :  endif
de888e4
+ :endfunction
de888e4
+ :setlocal completefunc=DummyCompleteOne
de888e4
+ /^one
de888e4
+ A????:q!
de888e4
+ :function! DummyCompleteTwo(findstart, base)
de888e4
+ :  if a:findstart
de888e4
+ :    wincmd n
de888e4
+ :    return 0
de888e4
+ :  else
de888e4
+ :    return ['twodef', 'twoDEF']
de888e4
+ :  endif
de888e4
+ :endfunction
de888e4
+ :setlocal completefunc=DummyCompleteTwo
de888e4
+ /^two
de888e4
+ A????:q!
de888e4
+ :"Test that 'completefunc' works when it's OK.
de888e4
+ :function! DummyCompleteThree(findstart, base)
de888e4
+ :  if a:findstart
de888e4
+ :    return 0
de888e4
+ :  else
de888e4
+ :    return ['threedef', 'threeDEF']
de888e4
+ :  endif
de888e4
+ :endfunction
de888e4
+ :setlocal completefunc=DummyCompleteThree
de888e4
+ /^three
de888e4
+ A????:/^+++/,/^three/w! test.out
de888e4
+ :qa!
de888e4
+ ENDTEST
de888e4
+ 
de888e4
+ +++
de888e4
+ one
de888e4
+ two
de888e4
+ three
de888e4
*** ../vim-7.3.051/src/testdir/test76.ok	2010-11-10 16:51:45.000000000 +0100
de888e4
--- src/testdir/test76.ok	2010-11-10 16:38:58.000000000 +0100
de888e4
***************
de888e4
*** 0 ****
de888e4
--- 1,4 ----
de888e4
+ +++
de888e4
+ 
de888e4
+ two
de888e4
+ threeDEF
de888e4
*** ../vim-7.3.051/src/version.c	2010-11-10 15:37:00.000000000 +0100
de888e4
--- src/version.c	2010-11-10 16:40:29.000000000 +0100
de888e4
***************
de888e4
*** 716,717 ****
de888e4
--- 716,719 ----
de888e4
  {   /* Add new patch number below this line */
de888e4
+ /**/
de888e4
+     52,
de888e4
  /**/
de888e4
de888e4
-- 
de888e4
BRIDGEKEEPER: What is the air-speed velocity of an unladen swallow?
de888e4
ARTHUR:       What do you mean?  An African or European swallow?
de888e4
BRIDGEKEEPER: Er ...  I don't know that ... Aaaaarrrrrrggghhh!
de888e4
   BRIDGEKEEPER is cast into the gorge.
de888e4
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
de888e4
de888e4
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
de888e4
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
de888e4
\\\        download, build and distribute -- http://www.A-A-P.org        ///
de888e4
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///