Hi Everyone,

After this change, in contrary to the documentation, I cannot define a global 
function like this:

function g:Foo()
endfunction

Also, what is the reason to restrict this case:

function Foo()
endfunction

let b:my_func = function('Foo')

K.

On Wednesday, April 23, 2014 11:43:57 AM UTC-4, Bram Moolenaar wrote:
> Patch 7.4.260
> 
> Problem:    It is possible to define a function with a colon in the name.  It
> 
>           is possible to define a function with a lower case character if a
> 
>           "#" appears after the name.
> 
> Solution:   Disallow using a colon other than with "s:".  Ignore "#" after the
> 
>           name.
> 
> Files:            runtime/doc/eval.txt, src/eval.c, src/testdir/test_eval.in,
> 
>           src/testdir/test_eval.ok
> 
> 
> 
> 
> 
> *** ../vim-7.4.259/runtime/doc/eval.txt       2014-04-05 19:44:36.891160723 
> +0200
> 
> --- runtime/doc/eval.txt      2014-04-23 17:19:57.914982886 +0200
> 
> ***************
> 
> *** 123,128 ****
> 
> --- 123,129 ----
> 
>       :echo Fn()
> 
>   <                                                   *E704* *E705* *E707*
> 
>   A Funcref variable must start with a capital, "s:", "w:", "t:" or "b:".  You
> 
> + can use "g:" but the following name must still start with a capital.  You
> 
>   cannot have both a Funcref variable and a function with the same name.
> 
>   
> 
>   A special case is defining a function and directly assigning its Funcref to 
> a
> 
> ***************
> 
> *** 6675,6680 ****
> 
> --- 6691,6698 ----
> 
>   and autocommands defined in the script.  It is also possible to call the
> 
>   function from a mapping defined in the script, but then |<SID>| must be used
> 
>   instead of "s:" when the mapping is expanded outside of the script.
> 
> + There are only script-local functions, no buffer-local or window-local
> 
> + functions.
> 
>   
> 
>                                       *:fu* *:function* *E128* *E129* *E123*
> 
>   :fu[nction]         List all functions and their arguments.
> 
> ***************
> 
> *** 6698,6708 ****
> 
>   <
> 
>   See |:verbose-cmd| for more information.
> 
>   
> 
> !                                                     *E124* *E125* *E853*
> 
>   :fu[nction][!] {name}([arguments]) [range] [abort] [dict]
> 
>                       Define a new function by the name {name}.  The name
> 
>                       must be made of alphanumeric characters and '_', and
> 
> !                     must start with a capital or "s:" (see above).
> 
>   
> 
>                       {name} can also be a |Dictionary| entry that is a
> 
>                       |Funcref|: >
> 
> --- 6716,6727 ----
> 
>   <
> 
>   See |:verbose-cmd| for more information.
> 
>   
> 
> !                                             *E124* *E125* *E853* *E884*
> 
>   :fu[nction][!] {name}([arguments]) [range] [abort] [dict]
> 
>                       Define a new function by the name {name}.  The name
> 
>                       must be made of alphanumeric characters and '_', and
> 
> !                     must start with a capital or "s:" (see above).  Note
> 
> !                     that using "b:" or "g:" is not allowed.
> 
>   
> 
>                       {name} can also be a |Dictionary| entry that is a
> 
>                       |Funcref|: >
> 
> *** ../vim-7.4.259/src/eval.c 2014-04-11 10:22:46.288219453 +0200
> 
> --- src/eval.c        2014-04-23 17:37:23.890957682 +0200
> 
> ***************
> 
> *** 808,814 ****
> 
>   static void list_func_head __ARGS((ufunc_T *fp, int indent));
> 
>   static ufunc_T *find_func __ARGS((char_u *name));
> 
>   static int function_exists __ARGS((char_u *name));
> 
> ! static int builtin_function __ARGS((char_u *name));
> 
>   #ifdef FEAT_PROFILE
> 
>   static void func_do_profile __ARGS((ufunc_T *fp));
> 
>   static void prof_sort_list __ARGS((FILE *fd, ufunc_T **sorttab, int st_len, 
> char *title, int prefer_self));
> 
> --- 808,814 ----
> 
>   static void list_func_head __ARGS((ufunc_T *fp, int indent));
> 
>   static ufunc_T *find_func __ARGS((char_u *name));
> 
>   static int function_exists __ARGS((char_u *name));
> 
> ! static int builtin_function __ARGS((char_u *name, int len));
> 
>   #ifdef FEAT_PROFILE
> 
>   static void func_do_profile __ARGS((ufunc_T *fp));
> 
>   static void prof_sort_list __ARGS((FILE *fd, ufunc_T **sorttab, int st_len, 
> char *title, int prefer_self));
> 
> ***************
> 
> *** 8489,8495 ****
> 
>       rettv->vval.v_number = 0;
> 
>       error = ERROR_UNKNOWN;
> 
>   
> 
> !     if (!builtin_function(fname))
> 
>       {
> 
>           /*
> 
>            * User defined function.
> 
> --- 8489,8495 ----
> 
>       rettv->vval.v_number = 0;
> 
>       error = ERROR_UNKNOWN;
> 
>   
> 
> !     if (!builtin_function(fname, -1))
> 
>       {
> 
>           /*
> 
>            * User defined function.
> 
> ***************
> 
> *** 21584,21589 ****
> 
> --- 21584,21590 ----
> 
>        * Get the function name.  There are these situations:
> 
>        * func     normal function name
> 
>        *                  "name" == func, "fudi.fd_dict" == NULL
> 
> +      * s:func           script-local function name
> 
>        * dict.func    new dictionary entry
> 
>        *                  "name" == NULL, "fudi.fd_dict" set,
> 
>        *                  "fudi.fd_di" == NULL, "fudi.fd_newkey" == func
> 
> ***************
> 
> *** 22314,22324 ****
> 
>           lead += (int)STRLEN(sid_buf);
> 
>       }
> 
>       }
> 
> !     else if (!(flags & TFN_INT) && builtin_function(lv.ll_name))
> 
>       {
> 
> !     EMSG2(_("E128: Function name must start with a capital or contain a 
> colon: %s"), lv.ll_name);
> 
>       goto theend;
> 
>       }
> 
>       name = alloc((unsigned)(len + lead + 1));
> 
>       if (name != NULL)
> 
>       {
> 
> --- 22315,22338 ----
> 
>           lead += (int)STRLEN(sid_buf);
> 
>       }
> 
>       }
> 
> !     else if (!(flags & TFN_INT) && builtin_function(lv.ll_name, len))
> 
>       {
> 
> !     EMSG2(_("E128: Function name must start with a capital or \"s:\": %s"),
> 
> !                                                               lv.ll_name);
> 
>       goto theend;
> 
>       }
> 
> +     if (!skip)
> 
> +     {
> 
> +     char_u *cp = vim_strchr(lv.ll_name, ':');
> 
> + 
> 
> +     if (cp != NULL && cp < end)
> 
> +     {
> 
> +         EMSG2(_("E884: Function name cannot contain a colon: %s"),
> 
> +                                                               lv.ll_name);
> 
> +         goto theend;
> 
> +     }
> 
> +     }
> 
> + 
> 
>       name = alloc((unsigned)(len + lead + 1));
> 
>       if (name != NULL)
> 
>       {
> 
> ***************
> 
> *** 22331,22337 ****
> 
>               STRCPY(name + 3, sid_buf);
> 
>       }
> 
>       mch_memmove(name + lead, lv.ll_name, (size_t)len);
> 
> !     name[len + lead] = NUL;
> 
>       }
> 
>       *pp = end;
> 
>   
> 
> --- 22345,22351 ----
> 
>               STRCPY(name + 3, sid_buf);
> 
>       }
> 
>       mch_memmove(name + lead, lv.ll_name, (size_t)len);
> 
> !     name[lead + len] = NUL;
> 
>       }
> 
>       *pp = end;
> 
>   
> 
> ***************
> 
> *** 22452,22458 ****
> 
>   translated_function_exists(name)
> 
>       char_u  *name;
> 
>   {
> 
> !     if (builtin_function(name))
> 
>       return find_internal_func(name) >= 0;
> 
>       return find_func(name) != NULL;
> 
>   }
> 
> --- 22466,22472 ----
> 
>   translated_function_exists(name)
> 
>       char_u  *name;
> 
>   {
> 
> !     if (builtin_function(name, -1))
> 
>       return find_internal_func(name) >= 0;
> 
>       return find_func(name) != NULL;
> 
>   }
> 
> ***************
> 
> *** 22500,22513 ****
> 
>   
> 
>   /*
> 
>    * Return TRUE if "name" looks like a builtin function name: starts with a
> 
> !  * lower case letter and doesn't contain a ':' or AUTOLOAD_CHAR.
> 
>    */
> 
>       static int
> 
> ! builtin_function(name)
> 
>       char_u *name;
> 
>   {
> 
> !     return ASCII_ISLOWER(name[0]) && vim_strchr(name, ':') == NULL
> 
> !                                && vim_strchr(name, AUTOLOAD_CHAR) == NULL;
> 
>   }
> 
>   
> 
>   #if defined(FEAT_PROFILE) || defined(PROTO)
> 
> --- 22514,22533 ----
> 
>   
> 
>   /*
> 
>    * Return TRUE if "name" looks like a builtin function name: starts with a
> 
> !  * lower case letter and doesn't contain AUTOLOAD_CHAR.
> 
> !  * "len" is the length of "name", or -1 for NUL terminated.
> 
>    */
> 
>       static int
> 
> ! builtin_function(name, len)
> 
>       char_u *name;
> 
> +     int len;
> 
>   {
> 
> !     char_u *p;
> 
> ! 
> 
> !     if (!ASCII_ISLOWER(name[0]))
> 
> !     return FALSE;
> 
> !     p = vim_strchr(name, AUTOLOAD_CHAR);
> 
> !     return p == NULL || (len > 0 && p > name + len);
> 
>   }
> 
>   
> 
>   #if defined(FEAT_PROFILE) || defined(PROTO)
> 
> *** ../vim-7.4.259/src/testdir/test_eval.in   2014-04-05 21:28:50.667174384 
> +0200
> 
> --- src/testdir/test_eval.in  2014-04-23 17:35:12.086960858 +0200
> 
> ***************
> 
> *** 144,149 ****
> 
> --- 144,167 ----
> 
>   :delcommand AR
> 
>   :call garbagecollect(1)
> 
>   :"
> 
> + :" function name includes a colon
> 
> + :try
> 
> + :func! g:test()
> 
> + :echo "test"
> 
> + :endfunc
> 
> + :catch
> 
> + :$put =v:exception
> 
> + :endtry
> 
> + :"
> 
> + :" function name folowed by #
> 
> + :try
> 
> + :func! test2() "#
> 
> + :echo "test2"
> 
> + :endfunc
> 
> + :catch
> 
> + :$put =v:exception
> 
> + :endtry
> 
> + :"
> 
>   :/^start:/+1,$wq! test.out
> 
>   :" vim: et ts=4 isk-=\: fmr=???,???
> 
>   :call getchar()
> 
> *** ../vim-7.4.259/src/testdir/test_eval.ok   2014-04-05 21:28:50.667174384 
> +0200
> 
> --- src/testdir/test_eval.ok  2014-04-23 17:36:34.602958870 +0200
> 
> ***************
> 
> *** 335,337 ****
> 
> --- 335,339 ----
> 
>   Vim(call):E883: search pattern and expression register may not contain two 
> or more lines
> 
>   Executing call setreg(1, ["", "", [], ""])
> 
>   Vim(call):E730: using List as a String
> 
> + Vim(function):E128: Function name must start with a capital or "s:": 
> g:test()
> 
> + Vim(function):E128: Function name must start with a capital or "s:": 
> test2() "#
> 
> *** ../vim-7.4.259/src/version.c      2014-04-23 12:52:36.499369426 +0200
> 
> --- src/version.c     2014-04-23 17:17:50.994985945 +0200
> 
> ***************
> 
> *** 736,737 ****
> 
> --- 736,739 ----
> 
>   {   /* Add new patch number below this line */
> 
> + /**/
> 
> +     260,
> 
>   /**/
> 
> 
> 
> -- 
> 
> From "know your smileys":
> 
>  ;-0  Can't find shift key
> 
>  ,-9  Kann Umschalttaste nicht finden
> 
> 
> 
>  /// Bram Moolenaar -- b...@moolenaar.net -- 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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui