Patch 7.4.1486
Problem: ":loadplugin" is not optimal, some people find it confusing.
Solution: Only use ":packadd" with an optional "!".
Files: src/ex_cmds.h, src/ex_cmds2.c, src/testdir/test_loadplugin.vim,
src/testdir/test_packadd.vim, src/testdir/Make_all.mak,
runtime/doc/repeat.txt
*** ../vim-7.4.1485/src/ex_cmds.h 2016-03-03 17:13:00.488910501 +0100
--- src/ex_cmds.h 2016-03-04 20:48:59.185149702 +0100
***************
*** 810,818 ****
EX(CMD_loadkeymap, "loadkeymap", ex_loadkeymap,
CMDWIN,
ADDR_LINES),
- EX(CMD_loadplugin, "loadplugin", ex_loadplugin,
- BANG|FILE1|TRLBAR|SBOXOK|CMDWIN,
- ADDR_LINES),
EX(CMD_lockmarks, "lockmarks", ex_wrongmodifier,
NEEDARG|EXTRA|NOTRLCOM,
ADDR_LINES),
--- 810,815 ----
*** ../vim-7.4.1485/src/ex_cmds2.c 2016-03-03 17:22:44.530735097 +0100
--- src/ex_cmds2.c 2016-03-04 21:55:30.475057792 +0100
***************
*** 3057,3144 ****
return do_in_path(p_rtp, name, all ? DIP_ALL : 0, callback, cookie);
}
- #ifdef FEAT_AUTOCMD
/*
! * Source filetype detection scripts, if filetype.vim was already done.
*/
static void
! may_do_filetypes(char_u *pat)
{
! char_u *cmd = vim_strsave((char_u *)"g:did_load_filetypes");
! /* If runtime/filetype.vim wasn't loaded yet, the scripts will be found
! * when it loads. */
! if (cmd != NULL && eval_to_number(cmd) > 0)
{
! do_cmdline_cmd((char_u *)"augroup filetypedetect");
! do_in_path(p_pp, pat, DIP_ALL, source_callback, NULL);
! do_cmdline_cmd((char_u *)"augroup END");
}
- vim_free(cmd);
}
- #endif
static void
add_pack_plugin(char_u *fname, void *cookie)
{
! char_u *p6, *p5, *p4, *p3, *p2, *p1, *p;
int c;
char_u *new_rtp;
int keep;
int oldlen;
int addlen;
char_u *ffname = fix_fname(fname);
! int load_file = cookie != NULL;
if (ffname == NULL)
return;
- p6 = p5 = p4 = p3 = p2 = p1 = get_past_head(ffname);
- for (p = p1; *p; mb_ptr_adv(p))
- if (vim_ispathsep_nocolon(*p))
- {
- p6 = p5; p5 = p4; p4 = p3; p3 = p2; p2 = p1; p1 = p;
- }
-
- /* now we have, load_file == TRUE:
- * rtp/pack/name/ever/name/plugin/name.vim
- * p6 p5 p4 p3 p2 p1
- *
- * with load_file == FALSE:
- * rtp/pack/name/ever/name
- * p4 p3 p2 p1
- */
- if (load_file)
- p4 = p6;
-
- /* find the part up to "pack" in 'runtimepath' */
- c = *p4;
- *p4 = NUL;
- p = (char_u *)strstr((char *)p_rtp, (char *)ffname);
- if (p == NULL)
- /* not found, append at the end */
- p = p_rtp + STRLEN(p_rtp);
- else
- /* append after the matching directory. */
- p += STRLEN(ffname);
- *p4 = c;
-
- if (load_file)
- {
- c = *p2;
- *p2 = NUL;
- }
if (strstr((char *)p_rtp, (char *)ffname) == NULL)
{
/* directory not in 'runtimepath', add it */
oldlen = (int)STRLEN(p_rtp);
addlen = (int)STRLEN(ffname);
new_rtp = alloc(oldlen + addlen + 2);
if (new_rtp == NULL)
! {
! *p2 = c;
! return;
! }
! keep = (int)(p - p_rtp);
mch_memmove(new_rtp, p_rtp, keep);
new_rtp[keep] = ',';
mch_memmove(new_rtp + keep + 1, ffname, addlen + 1);
--- 3057,3131 ----
return do_in_path(p_rtp, name, all ? DIP_ALL : 0, callback, cookie);
}
/*
! * Expand wildcards in "pat" and invoke do_source() for each match.
*/
static void
! source_all_matches(char_u *pat)
{
! int num_files;
! char_u **files;
! int i;
! if (gen_expand_wildcards(1, &pat, &num_files, &files, EW_FILE) == OK)
{
! for (i = 0; i < num_files; ++i)
! (void)do_source(files[i], FALSE, DOSO_NONE);
! FreeWild(num_files, files);
}
}
static void
add_pack_plugin(char_u *fname, void *cookie)
{
! char_u *p4, *p3, *p2, *p1, *p;
! char_u *insp;
int c;
char_u *new_rtp;
int keep;
int oldlen;
int addlen;
char_u *ffname = fix_fname(fname);
! int load_files = cookie != NULL;
if (ffname == NULL)
return;
if (strstr((char *)p_rtp, (char *)ffname) == NULL)
{
/* directory not in 'runtimepath', add it */
+ p4 = p3 = p2 = p1 = get_past_head(ffname);
+ for (p = p1; *p; mb_ptr_adv(p))
+ if (vim_ispathsep_nocolon(*p))
+ {
+ p4 = p3; p3 = p2; p2 = p1; p1 = p;
+ }
+
+ /* now we have:
+ * rtp/pack/name/ever/name
+ * p4 p3 p2 p1
+ *
+ * find the part up to "pack" in 'runtimepath' */
+ c = *p4;
+ *p4 = NUL;
+ insp = (char_u *)strstr((char *)p_rtp, (char *)ffname);
+ if (insp == NULL)
+ /* not found, append at the end */
+ insp = p_rtp + STRLEN(p_rtp);
+ else
+ {
+ /* append after the matching directory. */
+ insp += STRLEN(ffname);
+ while (*insp != NUL && *insp != ',')
+ ++insp;
+ }
+ *p4 = c;
+
oldlen = (int)STRLEN(p_rtp);
addlen = (int)STRLEN(ffname);
new_rtp = alloc(oldlen + addlen + 2);
if (new_rtp == NULL)
! goto theend;
! keep = (int)(insp - p_rtp);
mch_memmove(new_rtp, p_rtp, keep);
new_rtp[keep] = ',';
mch_memmove(new_rtp + keep + 1, ffname, addlen + 1);
***************
*** 3148,3200 ****
set_option_value((char_u *)"rtp", 0L, new_rtp, 0);
vim_free(new_rtp);
}
- vim_free(ffname);
! if (load_file)
! (void)do_source(fname, FALSE, DOSO_NONE);
! }
- /*
- * Source the plugins in the package directories.
- */
- void
- source_packages()
- {
- do_in_path(p_pp, (char_u *)"pack/*/ever/*/plugin/*.vim",
- DIP_ALL, add_pack_plugin, p_pp);
#ifdef FEAT_AUTOCMD
! may_do_filetypes((char_u *)"pack/*/ever/*/ftdetect/*.vim");
#endif
}
/*
! * ":loadplugin {name}"
*/
void
! ex_loadplugin(exarg_T *eap)
{
! static char *plugpat = "pack/*/opt/%s/plugin/*.vim";
! static char *ftpat = "pack/*/opt/%s/ftdetect/*.vim";
! int len;
! char *pat;
!
! len = (int)STRLEN(ftpat) + (int)STRLEN(eap->arg);
! pat = (char *)alloc(len);
! if (pat == NULL)
! return;
! vim_snprintf(pat, len, plugpat, eap->arg);
! do_in_path(p_pp, (char_u *)pat, DIP_ALL, add_pack_plugin, p_pp);
!
! #ifdef FEAT_AUTOCMD
! vim_snprintf(pat, len, ftpat, eap->arg);
! may_do_filetypes((char_u *)pat);
! #endif
!
! vim_free(pat);
}
/*
! * ":packadd {name}"
*/
void
ex_packadd(exarg_T *eap)
--- 3135,3189 ----
set_option_value((char_u *)"rtp", 0L, new_rtp, 0);
vim_free(new_rtp);
}
! if (load_files)
! {
! static char *plugpat = "%s/plugin/*.vim";
! static char *ftpat = "%s/ftdetect/*.vim";
! int len;
! char_u *pat;
!
! len = (int)STRLEN(ffname) + (int)STRLEN(ftpat);
! pat = alloc(len);
! if (pat == NULL)
! goto theend;
! vim_snprintf((char *)pat, len, plugpat, ffname);
! source_all_matches(pat);
#ifdef FEAT_AUTOCMD
! {
! char_u *cmd = vim_strsave((char_u *)"g:did_load_filetypes");
!
! /* If runtime/filetype.vim wasn't loaded yet, the scripts will be
! * found when it loads. */
! if (cmd != NULL && eval_to_number(cmd) > 0)
! {
! do_cmdline_cmd((char_u *)"augroup filetypedetect");
! vim_snprintf((char *)pat, len, ftpat, ffname);
! source_all_matches(pat);
! do_cmdline_cmd((char_u *)"augroup END");
! }
! vim_free(cmd);
! }
#endif
+ }
+
+ theend:
+ vim_free(ffname);
}
/*
! * Find plugins in the package directories and source them.
*/
void
! source_packages()
{
! do_in_path(p_pp, (char_u *)"pack/*/ever/*",
! DIP_ALL + DIP_DIR, add_pack_plugin, p_pp);
}
/*
! * ":packadd[!] {name}"
*/
void
ex_packadd(exarg_T *eap)
***************
*** 3208,3214 ****
if (pat == NULL)
return;
vim_snprintf(pat, len, plugpat, eap->arg);
! do_in_path(p_pp, (char_u *)pat, DIP_ALL + DIP_DIR, add_pack_plugin, NULL);
vim_free(pat);
}
--- 3197,3204 ----
if (pat == NULL)
return;
vim_snprintf(pat, len, plugpat, eap->arg);
! do_in_path(p_pp, (char_u *)pat, DIP_ALL + DIP_DIR, add_pack_plugin,
! eap->forceit ? NULL : p_pp);
vim_free(pat);
}
*** ../vim-7.4.1485/src/testdir/test_loadplugin.vim 2016-03-03
17:13:00.488910501 +0100
--- src/testdir/test_loadplugin.vim 1970-01-01 01:00:00.000000000 +0100
***************
*** 1,48 ****
- " Tests for :loadplugin
-
- func SetUp()
- let s:topdir = expand('%:h') . '/Xdir'
- exe 'set packpath=' . s:topdir
- let s:plugdir = s:topdir . '/pack/mine/opt/mytest'
- endfunc
-
- func TearDown()
- call delete(s:topdir, 'rf')
- endfunc
-
- func Test_loadplugin()
- call mkdir(s:plugdir . '/plugin', 'p')
- call mkdir(s:plugdir . '/ftdetect', 'p')
- set rtp&
- let rtp = &rtp
- filetype on
-
- exe 'split ' . s:plugdir . '/plugin/test.vim'
- call setline(1, 'let g:plugin_works = 42')
- wq
-
- exe 'split ' . s:plugdir . '/ftdetect/test.vim'
- call setline(1, 'let g:ftdetect_works = 17')
- wq
-
- loadplugin mytest
-
- call assert_equal(42, g:plugin_works)
- call assert_equal(17, g:ftdetect_works)
- call assert_true(len(&rtp) > len(rtp))
- call assert_true(&rtp =~ 'testdir/Xdir/pack/mine/opt/mytest\($\|,\)')
- endfunc
-
- func Test_packadd()
- call mkdir(s:plugdir . '/syntax', 'p')
- set rtp&
- let rtp = &rtp
- packadd mytest
- call assert_true(len(&rtp) > len(rtp))
- call assert_true(&rtp =~ 'testdir/Xdir/pack/mine/opt/mytest\($\|,\)')
-
- " check the path is not added twice
- let new_rtp = &rtp
- packadd mytest
- call assert_equal(new_rtp, &rtp)
- endfunc
--- 0 ----
*** ../vim-7.4.1485/src/testdir/test_packadd.vim 2016-03-04
22:10:13.581727173 +0100
--- src/testdir/test_packadd.vim 2016-03-04 22:07:53.119210993 +0100
***************
*** 0 ****
--- 1,57 ----
+ " Tests for 'packpath' and :packadd
+
+ func SetUp()
+ let s:topdir = expand('%:h') . '/Xdir'
+ exe 'set packpath=' . s:topdir
+ let s:plugdir = s:topdir . '/pack/mine/opt/mytest'
+ endfunc
+
+ func TearDown()
+ call delete(s:topdir, 'rf')
+ endfunc
+
+ func Test_packadd()
+ call mkdir(s:plugdir . '/plugin', 'p')
+ call mkdir(s:plugdir . '/ftdetect', 'p')
+ set rtp&
+ let rtp = &rtp
+ filetype on
+
+ exe 'split ' . s:plugdir . '/plugin/test.vim'
+ call setline(1, 'let g:plugin_works = 42')
+ wq
+
+ exe 'split ' . s:plugdir . '/ftdetect/test.vim'
+ call setline(1, 'let g:ftdetect_works = 17')
+ wq
+
+ packadd mytest
+
+ call assert_equal(42, g:plugin_works)
+ call assert_equal(17, g:ftdetect_works)
+ call assert_true(len(&rtp) > len(rtp))
+ call assert_true(&rtp =~ 'testdir/Xdir/pack/mine/opt/mytest\($\|,\)')
+ endfunc
+
+ func Test_packadd_noload()
+ call mkdir(s:plugdir . '/plugin', 'p')
+ call mkdir(s:plugdir . '/syntax', 'p')
+ set rtp&
+ let rtp = &rtp
+
+ exe 'split ' . s:plugdir . '/plugin/test.vim'
+ call setline(1, 'let g:plugin_works = 42')
+ wq
+ let g:plugin_works = 0
+
+ packadd! mytest
+
+ call assert_true(len(&rtp) > len(rtp))
+ call assert_true(&rtp =~ 'testdir/Xdir/pack/mine/opt/mytest\($\|,\)')
+ call assert_equal(0, g:plugin_works)
+
+ " check the path is not added twice
+ let new_rtp = &rtp
+ packadd! mytest
+ call assert_equal(new_rtp, &rtp)
+ endfunc
*** ../vim-7.4.1485/src/testdir/Make_all.mak 2016-03-03 15:46:51.234973962
+0100
--- src/testdir/Make_all.mak 2016-03-04 21:08:05.269111341 +0100
***************
*** 178,184 ****
test_increment.res \
test_json.res \
test_langmap.res \
! test_loadplugin.res \
test_perl.res \
test_quickfix.res \
test_syntax.res \
--- 178,184 ----
test_increment.res \
test_json.res \
test_langmap.res \
! test_packadd.res \
test_perl.res \
test_quickfix.res \
test_syntax.res \
*** ../vim-7.4.1485/runtime/doc/repeat.txt 2016-03-03 17:13:00.488910501
+0100
--- runtime/doc/repeat.txt 2016-03-04 20:46:32.890683678 +0100
***************
*** 206,223 ****
about each searched file.
{not in Vi}
! *:loadp* *:loadplugin*
! :loadp[lugin] {name} Search for an optional plugin directory and source the
! plugin files found. It is similar to: >
! :runtime pack/*/opt/{name}/plugin/*.vim
! < However, `:loadplugin` uses 'packpath' instead of
! 'runtimepath'. And the directory found is added to
! 'runtimepath'.
!
! If you have a directory under 'packpath' that doesn't
! actually have a plugin file, just create an empty one.
! This will still add the directory to 'runtimepath'.
! Or use `:packadd`.
Note that {name} is the directory name, not the name
of the .vim file. If the "{name}/plugin" directory
--- 213,225 ----
about each searched file.
{not in Vi}
! *:pa* *:packadd*
! :pa[ckadd][!] {name} Search for an optional plugin directory in 'packpath'
! and source any plugin files found. The directory must
! match:
! pack/*/opt/{name} ~
! The directory is added to 'runtimepath' if it wasn't
! there yet.
Note that {name} is the directory name, not the name
of the .vim file. If the "{name}/plugin" directory
***************
*** 226,249 ****
If the filetype detection was not enabled yet (this
is usually done with a "syntax enable" or "filetype
on" command in your .vimrc file), this will also look
! for "{name}/ftdetect/*.vim" files. However, no matter
! what is found, the directory is not added to
! 'runtimepath'.
! Also see |load-plugin|.
! *:pa* *:packadd*
! :pa[ckadd] {name} Search for an optional plugin directory in 'packpath'
! and add it to 'runtimepath'. This is like
! `:loadplugin` but without loading a plugin or even
! looking for it.
- The directory must match:
- pack/*/opt/{name} ~
- If the directory has an entry in "ftdetect" note that
- this will only be used when filetype detection was not
- enabled yet. Make sure ":packadd" is used before any
- ":syntax enable" or ":filetype on" command.
:scripte[ncoding] [encoding] *:scripte* *:scriptencoding* *E167*
Specify the character encoding used in the script.
--- 228,243 ----
If the filetype detection was not enabled yet (this
is usually done with a "syntax enable" or "filetype
on" command in your .vimrc file), this will also look
! for "{name}/ftdetect/*.vim" files.
! When the optional ! is added no plugin files or
! ftdetect scripts are loaded, only the matching
! directories are added to 'runtimepath'. This is
! useful in your .vimrc. The plugins will then be
! loaded during initialization, see |load-plugins|.
! Also see |pack-add|.
:scripte[ncoding] [encoding] *:scripte* *:scriptencoding* *E167*
Specify the character encoding used in the script.
***************
*** 274,281 ****
command is ignored.
{not in Vi}
! *:scrip* *:scriptnames*
! :scrip[tnames] List all sourced script names, in the order
they were
first sourced. The number is used for the script ID
|<SID>|.
{not in Vi} {not available when compiled without the
--- 268,275 ----
command is ignored.
{not in Vi}
! *:scr* *:scriptnames*
! :scr[iptnames] List all sourced script names, in the order
they were
first sourced. The number is used for the script ID
|<SID>|.
{not in Vi} {not available when compiled without the
***************
*** 447,452 ****
--- 441,452 ----
pack/my/ever/always/syntax/always.vim
pack/my/opt/mydebug/plugin/debugger.vim
+ If you don't have a package but a single plugin, you need to create the extra
+ directory level:
+ % mkdir -p ~/.vim/pack/my/ever/always
+ % cd ~/.vim/pack/my/ever/always
+ % unzip /tmp/myplugin.zip
+
When Vim starts up it scans all directories in 'packpath' for plugins under
the
"ever" directory and loads them. When found that directory is added to
'runtimepath'.
***************
*** 457,467 ****
If the "always" plugin kicks in and sets the 'filetype' to "always", Vim will
find the syntax/always.vim file, because its directory is in 'runtimepath'.
! Vim will also load ftdetect files, like with |:loadplugin|.
! *load-plugin*
! To load an optional plugin from a pack use the `:loadplugin` command: >
! :loadplugin mydebug
This could be done inside always.vim, if some conditions are met.
Or you could add this command to your |.vimrc|.
--- 457,467 ----
If the "always" plugin kicks in and sets the 'filetype' to "always", Vim will
find the syntax/always.vim file, because its directory is in 'runtimepath'.
! Vim will also load ftdetect files, like with |:packadd|.
! *pack-add*
! To load an optional plugin from a pack use the `:packadd` command: >
! :packadd mydebug
This could be done inside always.vim, if some conditions are met.
Or you could add this command to your |.vimrc|.
*** ../vim-7.4.1485/src/version.c 2016-03-03 22:51:36.137809664 +0100
--- src/version.c 2016-03-04 21:08:31.988828723 +0100
***************
*** 745,746 ****
--- 745,748 ----
{ /* Add new patch number below this line */
+ /**/
+ 1486,
/**/
--
ALL: A witch! A witch!
WITCH: It's a fair cop.
ALL: Burn her! Burn her! Let's make her into a ladder.
"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/ \\\
\\\ 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.