Patch 7.4.1552
Problem:    ":colorscheme" does not use 'packpath'.
Solution:   Also look in "start" and "opt" directories in 'packpath'.
Files:      src/ex_cmds2.c, src/gui.c, src/hardcopy.c, src/os_mswin.c,
            src/spell.c, src/tag.c, src/if_py_both.h, src/vim.h,
            src/digraph.c, src/eval.c, src/ex_docmd.c, src/main.c,
            src/option.c, src/syntax.c, src/testdir/test_packadd.vim


*** ../vim-7.4.1551/src/ex_cmds2.c      2016-03-12 21:28:22.238433457 +0100
--- src/ex_cmds2.c      2016-03-12 21:53:03.522920586 +0100
***************
*** 2872,2878 ****
            do_unlet((char_u *)"b:current_compiler", TRUE);
  
            sprintf((char *)buf, "compiler/%s.vim", eap->arg);
!           if (source_runtime(buf, TRUE) == FAIL)
                EMSG2(_("E666: compiler not supported: %s"), eap->arg);
            vim_free(buf);
  
--- 2872,2878 ----
            do_unlet((char_u *)"b:current_compiler", TRUE);
  
            sprintf((char *)buf, "compiler/%s.vim", eap->arg);
!           if (source_runtime(buf, DIP_ALL) == FAIL)
                EMSG2(_("E666: compiler not supported: %s"), eap->arg);
            vim_free(buf);
  
***************
*** 2906,2912 ****
      void
  ex_runtime(exarg_T *eap)
  {
!     source_runtime(eap->arg, eap->forceit);
  }
  
      static void
--- 2906,2912 ----
      void
  ex_runtime(exarg_T *eap)
  {
!     source_runtime(eap->arg, eap->forceit ? DIP_ALL : 0);
  }
  
      static void
***************
*** 2918,2931 ****
  /*
   * Source the file "name" from all directories in 'runtimepath'.
   * "name" can contain wildcards.
!  * When "all" is TRUE: source all files, otherwise only the first one.
   *
   * return FAIL when no file could be sourced, OK otherwise.
   */
      int
! source_runtime(char_u *name, int all)
  {
!     return do_in_runtimepath(name, all, source_callback, NULL);
  }
  
  /*
--- 2918,2931 ----
  /*
   * Source the file "name" from all directories in 'runtimepath'.
   * "name" can contain wildcards.
!  * When "flags" has DIP_ALL: source all files, otherwise only the first one.
   *
   * return FAIL when no file could be sourced, OK otherwise.
   */
      int
! source_runtime(char_u *name, int flags)
  {
!     return do_in_runtimepath(name, flags, source_callback, NULL);
  }
  
  /*
***************
*** 3052,3059 ****
  /*
   * Find "name" in 'runtimepath'.  When found, invoke the callback function for
   * it: callback(fname, "cookie")
!  * When "all" is TRUE repeat for all matches, otherwise only the first one is
!  * used.
   * Returns OK when at least one match found, FAIL otherwise.
   *
   * If "name" is NULL calls callback for each entry in runtimepath. Cookie is
--- 3052,3059 ----
  /*
   * Find "name" in 'runtimepath'.  When found, invoke the callback function for
   * it: callback(fname, "cookie")
!  * When "flags" has DIP_ALL repeat for all matches, otherwise only the first
!  * one is used.
   * Returns OK when at least one match found, FAIL otherwise.
   *
   * If "name" is NULL calls callback for each entry in runtimepath. Cookie is
***************
*** 3063,3073 ****
      int
  do_in_runtimepath(
      char_u    *name,
!     int               all,
      void      (*callback)(char_u *fname, void *ck),
      void      *cookie)
  {
!     return do_in_path(p_rtp, name, all ? DIP_ALL : 0, callback, cookie);
  }
  
  /*
--- 3063,3103 ----
      int
  do_in_runtimepath(
      char_u    *name,
!     int               flags,
      void      (*callback)(char_u *fname, void *ck),
      void      *cookie)
  {
!     int               done;
!     char_u    *s;
!     int               len;
!     char      *start_dir = "pack/*/start/*/%s";
!     char      *opt_dir = "pack/*/opt/*/%s";
! 
!     done = do_in_path(p_rtp, name, flags, callback, cookie);
! 
!     if (done == FAIL && (flags & DIP_START))
!     {
!       len = STRLEN(start_dir) + STRLEN(name);
!       s = alloc(len);
!       if (s == NULL)
!           return FAIL;
!       vim_snprintf((char *)s, len, start_dir, name);
!       done = do_in_path(p_pp, s, flags, callback, cookie);
!       vim_free(s);
!     }
! 
!     if (done == FAIL && (flags & DIP_OPT))
!     {
!       len = STRLEN(opt_dir) + STRLEN(name);
!       s = alloc(len);
!       if (s == NULL)
!           return FAIL;
!       vim_snprintf((char *)s, len, opt_dir, name);
!       done = do_in_path(p_pp, s, flags, callback, cookie);
!       vim_free(s);
!     }
! 
!     return done;
  }
  
  /*
*** ../vim-7.4.1551/src/gui.c   2016-03-11 22:52:00.734438114 +0100
--- src/gui.c   2016-03-12 21:37:40.616582020 +0100
***************
*** 4988,4994 ****
      if (STRLEN(name) > MAXPATHL - 14)
        return FAIL;
      vim_snprintf((char *)buffer, MAXPATHL, "bitmaps/%s.%s", name, ext);
!     if (do_in_runtimepath(buffer, FALSE, gfp_setname, buffer) == FAIL
                                                            || *buffer == NUL)
        return FAIL;
      return OK;
--- 4988,4994 ----
      if (STRLEN(name) > MAXPATHL - 14)
        return FAIL;
      vim_snprintf((char *)buffer, MAXPATHL, "bitmaps/%s.%s", name, ext);
!     if (do_in_runtimepath(buffer, 0, gfp_setname, buffer) == FAIL
                                                            || *buffer == NUL)
        return FAIL;
      return OK;
*** ../vim-7.4.1551/src/hardcopy.c      2016-01-30 17:24:01.798502450 +0100
--- src/hardcopy.c      2016-03-12 21:37:45.388532045 +0100
***************
*** 1741,1747 ****
      vim_strcat(buffer, (char_u *)name, MAXPATHL);
      vim_strcat(buffer, (char_u *)".ps", MAXPATHL);
      resource->filename[0] = NUL;
!     retval = (do_in_runtimepath(buffer, FALSE, prt_resource_name,
                                                           resource->filename)
            && resource->filename[0] != NUL);
      vim_free(buffer);
--- 1741,1747 ----
      vim_strcat(buffer, (char_u *)name, MAXPATHL);
      vim_strcat(buffer, (char_u *)".ps", MAXPATHL);
      resource->filename[0] = NUL;
!     retval = (do_in_runtimepath(buffer, 0, prt_resource_name,
                                                           resource->filename)
            && resource->filename[0] != NUL);
      vim_free(buffer);
*** ../vim-7.4.1551/src/os_mswin.c      2016-03-11 22:52:00.738438072 +0100
--- src/os_mswin.c      2016-03-12 21:37:59.824380860 +0100
***************
*** 950,956 ****
  mch_icon_load(HANDLE *iconp)
  {
      return do_in_runtimepath((char_u *)"bitmaps/vim.ico",
!                                             FALSE, mch_icon_load_cb, iconp);
  }
  
      int
--- 950,956 ----
  mch_icon_load(HANDLE *iconp)
  {
      return do_in_runtimepath((char_u *)"bitmaps/vim.ico",
!                                                 0, mch_icon_load_cb, iconp);
  }
  
      int
*** ../vim-7.4.1551/src/spell.c 2016-01-30 21:10:05.001342579 +0100
--- src/spell.c 2016-03-12 21:38:35.916002887 +0100
***************
*** 2478,2484 ****
                                        "spell/%s.%s.spl",
  #endif
                                                           lang, spell_enc());
!       r = do_in_runtimepath(fname_enc, FALSE, spell_load_cb, &sl);
  
        if (r == FAIL && *sl.sl_lang != NUL)
        {
--- 2478,2484 ----
                                        "spell/%s.%s.spl",
  #endif
                                                           lang, spell_enc());
!       r = do_in_runtimepath(fname_enc, 0, spell_load_cb, &sl);
  
        if (r == FAIL && *sl.sl_lang != NUL)
        {
***************
*** 2490,2496 ****
                                                  "spell/%s.ascii.spl",
  #endif
                                                                        lang);
!           r = do_in_runtimepath(fname_enc, FALSE, spell_load_cb, &sl);
  
  #ifdef FEAT_AUTOCMD
            if (r == FAIL && *sl.sl_lang != NUL && round == 1
--- 2490,2496 ----
                                                  "spell/%s.ascii.spl",
  #endif
                                                                        lang);
!           r = do_in_runtimepath(fname_enc, 0, spell_load_cb, &sl);
  
  #ifdef FEAT_AUTOCMD
            if (r == FAIL && *sl.sl_lang != NUL && round == 1
***************
*** 2519,2525 ****
      {
        /* At least one file was loaded, now load ALL the additions. */
        STRCPY(fname_enc + STRLEN(fname_enc) - 3, "add.spl");
!       do_in_runtimepath(fname_enc, TRUE, spell_load_cb, &sl);
      }
  }
  
--- 2519,2525 ----
      {
        /* At least one file was loaded, now load ALL the additions. */
        STRCPY(fname_enc + STRLEN(fname_enc) - 3, "add.spl");
!       do_in_runtimepath(fname_enc, DIP_ALL, spell_load_cb, &sl);
      }
  }
  
*** ../vim-7.4.1551/src/tag.c   2016-01-30 21:10:05.005342537 +0100
--- src/tag.c   2016-03-12 21:38:53.491818826 +0100
***************
*** 2638,2644 ****
  #else
                    "doc/tags"
  #endif
!                                             , TRUE, found_tagfile_cb, NULL);
        }
  
        if (tnp->tn_hf_idx >= tag_fnames.ga_len)
--- 2638,2644 ----
  #else
                    "doc/tags"
  #endif
!                                          , DIP_ALL, found_tagfile_cb, NULL);
        }
  
        if (tnp->tn_hf_idx >= tag_fnames.ga_len)
*** ../vim-7.4.1551/src/if_py_both.h    2016-02-06 19:57:11.601323655 +0100
--- src/if_py_both.h    2016-03-12 21:39:15.895584207 +0100
***************
*** 1061,1067 ****
      data.callable = callable;
      data.result = NULL;
  
!     do_in_runtimepath(NULL, FALSE, &map_rtp_callback, &data);
  
      if (data.result == NULL)
      {
--- 1061,1067 ----
      data.callable = callable;
      data.result = NULL;
  
!     do_in_runtimepath(NULL, 0, &map_rtp_callback, &data);
  
      if (data.result == NULL)
      {
***************
*** 1150,1156 ****
      if (!(ret = PyList_New(0)))
        return NULL;
  
!     do_in_runtimepath(NULL, FALSE, &map_finder_callback, ret);
  
      if (PyErr_Occurred())
      {
--- 1150,1156 ----
      if (!(ret = PyList_New(0)))
        return NULL;
  
!     do_in_runtimepath(NULL, 0, &map_finder_callback, ret);
  
      if (PyErr_Occurred())
      {
*** ../vim-7.4.1551/src/vim.h   2016-03-12 21:28:22.238433457 +0100
--- src/vim.h   2016-03-12 22:10:01.404271300 +0100
***************
*** 2289,2296 ****
  #endif
  
  /* Used for flags of do_in_path() */
! #define DIP_ALL       1       /* all matches, not just the first one */
! #define DIP_DIR       2       /* find directories instead of files. */
! #define DIP_ERR       4       /* give an error message when none found. */
  
  #endif /* VIM__H */
--- 2289,2298 ----
  #endif
  
  /* Used for flags of do_in_path() */
! #define DIP_ALL           0x01        /* all matches, not just the first one 
*/
! #define DIP_DIR           0x02        /* find directories instead of files. */
! #define DIP_ERR           0x04        /* give an error message when none 
found. */
! #define DIP_START   0x08      /* also use "start" directory in 'packpath' */
! #define DIP_OPT           0x10        /* also use "opt" directory in 
'packpath' */
  
  #endif /* VIM__H */
*** ../vim-7.4.1551/src/digraph.c       2016-02-23 14:52:31.869232337 +0100
--- src/digraph.c       2016-03-12 21:42:07.613786048 +0100
***************
*** 2320,2332 ****
        /* try finding "keymap/'keymap'_'encoding'.vim"  in 'runtimepath' */
        vim_snprintf((char *)buf, buflen, "keymap/%s_%s.vim",
                                                   curbuf->b_p_keymap, p_enc);
!       if (source_runtime(buf, FALSE) == FAIL)
  # endif
        {
            /* try finding "keymap/'keymap'.vim" in 'runtimepath'  */
            vim_snprintf((char *)buf, buflen, "keymap/%s.vim",
                                                          curbuf->b_p_keymap);
!           if (source_runtime(buf, FALSE) == FAIL)
            {
                vim_free(buf);
                return (char_u *)N_("E544: Keymap file not found");
--- 2320,2332 ----
        /* try finding "keymap/'keymap'_'encoding'.vim"  in 'runtimepath' */
        vim_snprintf((char *)buf, buflen, "keymap/%s_%s.vim",
                                                   curbuf->b_p_keymap, p_enc);
!       if (source_runtime(buf, 0) == FAIL)
  # endif
        {
            /* try finding "keymap/'keymap'.vim" in 'runtimepath'  */
            vim_snprintf((char *)buf, buflen, "keymap/%s.vim",
                                                          curbuf->b_p_keymap);
!           if (source_runtime(buf, 0) == FAIL)
            {
                vim_free(buf);
                return (char_u *)N_("E544: Keymap file not found");
*** ../vim-7.4.1551/src/eval.c  2016-03-12 19:03:28.213328900 +0100
--- src/eval.c  2016-03-12 21:42:12.729732480 +0100
***************
*** 23942,23948 ****
        }
  
        /* Try loading the package from $VIMRUNTIME/autoload/<name>.vim */
!       if (source_runtime(scriptname, FALSE) == OK)
            ret = TRUE;
      }
  
--- 23942,23948 ----
        }
  
        /* Try loading the package from $VIMRUNTIME/autoload/<name>.vim */
!       if (source_runtime(scriptname, 0) == OK)
            ret = TRUE;
      }
  
*** ../vim-7.4.1551/src/ex_docmd.c      2016-03-05 17:41:43.105189030 +0100
--- src/ex_docmd.c      2016-03-12 21:43:27.080953973 +0100
***************
*** 11777,11792 ****
      {
        if (*arg == 'o' || !filetype_detect)
        {
!           source_runtime((char_u *)FILETYPE_FILE, TRUE);
            filetype_detect = TRUE;
            if (plugin)
            {
!               source_runtime((char_u *)FTPLUGIN_FILE, TRUE);
                filetype_plugin = TRUE;
            }
            if (indent)
            {
!               source_runtime((char_u *)INDENT_FILE, TRUE);
                filetype_indent = TRUE;
            }
        }
--- 11777,11792 ----
      {
        if (*arg == 'o' || !filetype_detect)
        {
!           source_runtime((char_u *)FILETYPE_FILE, DIP_ALL);
            filetype_detect = TRUE;
            if (plugin)
            {
!               source_runtime((char_u *)FTPLUGIN_FILE, DIP_ALL);
                filetype_plugin = TRUE;
            }
            if (indent)
            {
!               source_runtime((char_u *)INDENT_FILE, DIP_ALL);
                filetype_indent = TRUE;
            }
        }
***************
*** 11802,11819 ****
        {
            if (plugin)
            {
!               source_runtime((char_u *)FTPLUGOF_FILE, TRUE);
                filetype_plugin = FALSE;
            }
            if (indent)
            {
!               source_runtime((char_u *)INDOFF_FILE, TRUE);
                filetype_indent = FALSE;
            }
        }
        else
        {
!           source_runtime((char_u *)FTOFF_FILE, TRUE);
            filetype_detect = FALSE;
        }
      }
--- 11802,11819 ----
        {
            if (plugin)
            {
!               source_runtime((char_u *)FTPLUGOF_FILE, DIP_ALL);
                filetype_plugin = FALSE;
            }
            if (indent)
            {
!               source_runtime((char_u *)INDOFF_FILE, DIP_ALL);
                filetype_indent = FALSE;
            }
        }
        else
        {
!           source_runtime((char_u *)FTOFF_FILE, DIP_ALL);
            filetype_detect = FALSE;
        }
      }
*** ../vim-7.4.1551/src/main.c  2016-03-12 20:34:22.820382141 +0100
--- src/main.c  2016-03-12 21:43:36.668853585 +0100
***************
*** 628,636 ****
      if (p_lpl)
      {
  # ifdef VMS   /* Somehow VMS doesn't handle the "**". */
!       source_runtime((char_u *)"plugin/*.vim", TRUE);
  # else
!       source_runtime((char_u *)"plugin/**/*.vim", TRUE);
  # endif
        TIME_MSG("loading plugins");
  
--- 628,636 ----
      if (p_lpl)
      {
  # ifdef VMS   /* Somehow VMS doesn't handle the "**". */
!       source_runtime((char_u *)"plugin/*.vim", DIP_ALL);
  # else
!       source_runtime((char_u *)"plugin/**/*.vim", DIP_ALL);
  # endif
        TIME_MSG("loading plugins");
  
*** ../vim-7.4.1551/src/option.c        2016-02-23 14:52:31.889232130 +0100
--- src/option.c        2016-03-12 21:43:49.568718519 +0100
***************
*** 7290,7296 ****
                if (vim_strchr((char_u *)"_.,", *p) != NULL)
                    break;
            vim_snprintf((char *)fname, 200, "spell/%.*s.vim", (int)(p - q), q);
!           source_runtime(fname, TRUE);
        }
  #endif
      }
--- 7290,7296 ----
                if (vim_strchr((char_u *)"_.,", *p) != NULL)
                    break;
            vim_snprintf((char *)fname, 200, "spell/%.*s.vim", (int)(p - q), q);
!           source_runtime(fname, DIP_ALL);
        }
  #endif
      }
*** ../vim-7.4.1551/src/syntax.c        2016-03-12 19:22:43.781293285 +0100
--- src/syntax.c        2016-03-12 21:44:58.683994990 +0100
***************
*** 4813,4819 ****
      prev_toplvl_grp = curwin->w_s->b_syn_topgrp;
      curwin->w_s->b_syn_topgrp = sgl_id;
      if (source ? do_source(eap->arg, FALSE, DOSO_NONE) == FAIL
!                               : source_runtime(eap->arg, TRUE) == FAIL)
        EMSG2(_(e_notopen), eap->arg);
      curwin->w_s->b_syn_topgrp = prev_toplvl_grp;
      current_syn_inc_tag = prev_syn_inc_tag;
--- 4813,4819 ----
      prev_toplvl_grp = curwin->w_s->b_syn_topgrp;
      curwin->w_s->b_syn_topgrp = sgl_id;
      if (source ? do_source(eap->arg, FALSE, DOSO_NONE) == FAIL
!                               : source_runtime(eap->arg, DIP_ALL) == FAIL)
        EMSG2(_(e_notopen), eap->arg);
      curwin->w_s->b_syn_topgrp = prev_toplvl_grp;
      current_syn_inc_tag = prev_syn_inc_tag;
***************
*** 7075,7081 ****
        else
        {
            ++recursive;
!           (void)source_runtime((char_u *)"syntax/syncolor.vim", TRUE);
            --recursive;
        }
      }
--- 7075,7081 ----
        else
        {
            ++recursive;
!           (void)source_runtime((char_u *)"syntax/syncolor.vim", DIP_ALL);
            --recursive;
        }
      }
***************
*** 7104,7110 ****
      if (buf != NULL)
      {
        sprintf((char *)buf, "colors/%s.vim", name);
!       retval = source_runtime(buf, FALSE);
        vim_free(buf);
  #ifdef FEAT_AUTOCMD
        apply_autocmds(EVENT_COLORSCHEME, name, curbuf->b_fname, FALSE, curbuf);
--- 7104,7110 ----
      if (buf != NULL)
      {
        sprintf((char *)buf, "colors/%s.vim", name);
!       retval = source_runtime(buf, DIP_START + DIP_OPT);
        vim_free(buf);
  #ifdef FEAT_AUTOCMD
        apply_autocmds(EVENT_COLORSCHEME, name, curbuf->b_fname, FALSE, curbuf);
*** ../vim-7.4.1551/src/testdir/test_packadd.vim        2016-03-12 
21:28:22.238433457 +0100
--- src/testdir/test_packadd.vim        2016-03-12 22:04:05.247996917 +0100
***************
*** 114,116 ****
--- 114,136 ----
    let tags2 = readfile(docdir2 . '/tags') 
    call assert_true(tags2[0] =~ 'look-away')
  endfunc
+ 
+ func Test_colorscheme()
+   let colordirrun = &packpath . '/runtime/colors'
+   let colordirstart = &packpath . '/pack/mine/start/foo/colors'
+   let colordiropt = &packpath . '/pack/mine/opt/bar/colors'
+   call mkdir(colordirrun, 'p')
+   call mkdir(colordirstart, 'p')
+   call mkdir(colordiropt, 'p')
+   call writefile(['let g:found_one = 1'], colordirrun . '/one.vim')
+   call writefile(['let g:found_two = 1'], colordirstart . '/two.vim')
+   call writefile(['let g:found_three = 1'], colordiropt . '/three.vim')
+   exe 'set rtp=' . &packpath . '/runtime'
+ 
+   colorscheme one
+   call assert_equal(1, g:found_one)
+   colorscheme two
+   call assert_equal(1, g:found_two)
+   colorscheme three
+   call assert_equal(1, g:found_three)
+ endfunc
*** ../vim-7.4.1551/src/version.c       2016-03-12 21:28:22.242433415 +0100
--- src/version.c       2016-03-12 21:54:14.350179409 +0100
***************
*** 745,746 ****
--- 745,748 ----
  {   /* Add new patch number below this line */
+ /**/
+     1552,
  /**/

-- 
What a wonderfully exciting cough!  Do you mind if I join you?
                -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy"

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

--- 
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui