Patch 7.4.1551
Problem: Cannot generate help tags in all doc directories.
Solution: Make ":helptags ALL" work.
Files: src/ex_cmds2.c, src/proto/ex_cmds2.pro, src/ex_cmds.c, src/vim.h,
src/testdir/test_packadd.vim
*** ../vim-7.4.1550/src/ex_cmds2.c 2016-03-12 20:34:22.820382141 +0100
--- src/ex_cmds2.c 2016-03-12 21:07:27.455596807 +0100
***************
*** 2928,2937 ****
return do_in_runtimepath(name, all, source_callback, NULL);
}
- #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. */
-
/*
* Find the file "name" in all directories in "path" and invoke
* "callback(fname, cookie)".
--- 2928,2933 ----
***************
*** 2942,2948 ****
*
* return FAIL when no file could be sourced, OK otherwise.
*/
! static int
do_in_path(
char_u *path,
char_u *name,
--- 2938,2944 ----
*
* return FAIL when no file could be sourced, OK otherwise.
*/
! int
do_in_path(
char_u *path,
char_u *name,
*** ../vim-7.4.1550/src/proto/ex_cmds2.pro 2016-03-12 20:34:22.820382141
+0100
--- src/proto/ex_cmds2.pro 2016-03-12 21:15:02.506822516 +0100
***************
*** 61,66 ****
--- 61,67 ----
void ex_compiler(exarg_T *eap);
void ex_runtime(exarg_T *eap);
int source_runtime(char_u *name, int all);
+ int do_in_path(char_u *path, char_u *name, int flags, void (*callback)(char_u
*fname, void *ck), void *cookie);
int do_in_runtimepath(char_u *name, int all, void (*callback)(char_u *fname,
void *ck), void *cookie);
void ex_packloadall(exarg_T *eap);
void ex_packadd(exarg_T *eap);
*** ../vim-7.4.1550/src/ex_cmds.c 2016-02-23 14:52:31.877232254 +0100
--- src/ex_cmds.c 2016-03-12 21:15:25.498581359 +0100
***************
*** 6575,6709 ****
do_cmdline_cmd((char_u *)"help normal-index");
}
- static void helptags_one(char_u *dir, char_u *ext, char_u *lang, int
add_help_tags);
-
/*
! * ":helptags"
*/
- void
- ex_helptags(exarg_T *eap)
- {
- expand_T xpc;
- char_u *dirname;
- int add_help_tags = FALSE;
- #ifdef FEAT_MULTI_LANG
- int len;
- int i, j;
- garray_T ga;
- char_u lang[2];
- char_u ext[5];
- char_u fname[8];
- int filecount;
- char_u **files;
- #endif
-
- /* Check for ":helptags ++t {dir}". */
- if (STRNCMP(eap->arg, "++t", 3) == 0 && vim_iswhite(eap->arg[3]))
- {
- add_help_tags = TRUE;
- eap->arg = skipwhite(eap->arg + 3);
- }
-
- ExpandInit(&xpc);
- xpc.xp_context = EXPAND_DIRECTORIES;
- dirname = ExpandOne(&xpc, eap->arg, NULL,
- WILD_LIST_NOTFOUND|WILD_SILENT, WILD_EXPAND_FREE);
- if (dirname == NULL || !mch_isdir(dirname))
- {
- EMSG2(_("E150: Not a directory: %s"), eap->arg);
- vim_free(dirname);
- return;
- }
-
- #ifdef FEAT_MULTI_LANG
- /* Get a list of all files in the help directory and in subdirectories. */
- STRCPY(NameBuff, dirname);
- add_pathsep(NameBuff);
- STRCAT(NameBuff, "**");
- if (gen_expand_wildcards(1, &NameBuff, &filecount, &files,
- EW_FILE|EW_SILENT) == FAIL
- || filecount == 0)
- {
- EMSG2("E151: No match: %s", NameBuff);
- vim_free(dirname);
- return;
- }
-
- /* Go over all files in the directory to find out what languages are
- * present. */
- ga_init2(&ga, 1, 10);
- for (i = 0; i < filecount; ++i)
- {
- len = (int)STRLEN(files[i]);
- if (len > 4)
- {
- if (STRICMP(files[i] + len - 4, ".txt") == 0)
- {
- /* ".txt" -> language "en" */
- lang[0] = 'e';
- lang[1] = 'n';
- }
- else if (files[i][len - 4] == '.'
- && ASCII_ISALPHA(files[i][len - 3])
- && ASCII_ISALPHA(files[i][len - 2])
- && TOLOWER_ASC(files[i][len - 1]) == 'x')
- {
- /* ".abx" -> language "ab" */
- lang[0] = TOLOWER_ASC(files[i][len - 3]);
- lang[1] = TOLOWER_ASC(files[i][len - 2]);
- }
- else
- continue;
-
- /* Did we find this language already? */
- for (j = 0; j < ga.ga_len; j += 2)
- if (STRNCMP(lang, ((char_u *)ga.ga_data) + j, 2) == 0)
- break;
- if (j == ga.ga_len)
- {
- /* New language, add it. */
- if (ga_grow(&ga, 2) == FAIL)
- break;
- ((char_u *)ga.ga_data)[ga.ga_len++] = lang[0];
- ((char_u *)ga.ga_data)[ga.ga_len++] = lang[1];
- }
- }
- }
-
- /*
- * Loop over the found languages to generate a tags file for each one.
- */
- for (j = 0; j < ga.ga_len; j += 2)
- {
- STRCPY(fname, "tags-xx");
- fname[5] = ((char_u *)ga.ga_data)[j];
- fname[6] = ((char_u *)ga.ga_data)[j + 1];
- if (fname[5] == 'e' && fname[6] == 'n')
- {
- /* English is an exception: use ".txt" and "tags". */
- fname[4] = NUL;
- STRCPY(ext, ".txt");
- }
- else
- {
- /* Language "ab" uses ".abx" and "tags-ab". */
- STRCPY(ext, ".xxx");
- ext[1] = fname[5];
- ext[2] = fname[6];
- }
- helptags_one(dirname, ext, fname, add_help_tags);
- }
-
- ga_clear(&ga);
- FreeWild(filecount, files);
-
- #else
- /* No language support, just use "*.txt" and "tags". */
- helptags_one(dirname, (char_u *)".txt", (char_u *)"tags", add_help_tags);
- #endif
- vim_free(dirname);
- }
-
static void
helptags_one(
char_u *dir, /* doc directory */
--- 6575,6583 ----
do_cmdline_cmd((char_u *)"help normal-index");
}
/*
! * Generate tags in one help directory.
*/
static void
helptags_one(
char_u *dir, /* doc directory */
***************
*** 6960,6965 ****
--- 6834,6984 ----
fclose(fd_tags); /* there is no check for an error... */
}
+ /*
+ * Generate tags in one help directory, taking care of translations.
+ */
+ static void
+ do_helptags(char_u *dirname, int add_help_tags)
+ {
+ #ifdef FEAT_MULTI_LANG
+ int len;
+ int i, j;
+ garray_T ga;
+ char_u lang[2];
+ char_u ext[5];
+ char_u fname[8];
+ int filecount;
+ char_u **files;
+
+ /* Get a list of all files in the help directory and in subdirectories. */
+ STRCPY(NameBuff, dirname);
+ add_pathsep(NameBuff);
+ STRCAT(NameBuff, "**");
+ if (gen_expand_wildcards(1, &NameBuff, &filecount, &files,
+ EW_FILE|EW_SILENT) == FAIL
+ || filecount == 0)
+ {
+ EMSG2("E151: No match: %s", NameBuff);
+ vim_free(dirname);
+ return;
+ }
+
+ /* Go over all files in the directory to find out what languages are
+ * present. */
+ ga_init2(&ga, 1, 10);
+ for (i = 0; i < filecount; ++i)
+ {
+ len = (int)STRLEN(files[i]);
+ if (len > 4)
+ {
+ if (STRICMP(files[i] + len - 4, ".txt") == 0)
+ {
+ /* ".txt" -> language "en" */
+ lang[0] = 'e';
+ lang[1] = 'n';
+ }
+ else if (files[i][len - 4] == '.'
+ && ASCII_ISALPHA(files[i][len - 3])
+ && ASCII_ISALPHA(files[i][len - 2])
+ && TOLOWER_ASC(files[i][len - 1]) == 'x')
+ {
+ /* ".abx" -> language "ab" */
+ lang[0] = TOLOWER_ASC(files[i][len - 3]);
+ lang[1] = TOLOWER_ASC(files[i][len - 2]);
+ }
+ else
+ continue;
+
+ /* Did we find this language already? */
+ for (j = 0; j < ga.ga_len; j += 2)
+ if (STRNCMP(lang, ((char_u *)ga.ga_data) + j, 2) == 0)
+ break;
+ if (j == ga.ga_len)
+ {
+ /* New language, add it. */
+ if (ga_grow(&ga, 2) == FAIL)
+ break;
+ ((char_u *)ga.ga_data)[ga.ga_len++] = lang[0];
+ ((char_u *)ga.ga_data)[ga.ga_len++] = lang[1];
+ }
+ }
+ }
+
+ /*
+ * Loop over the found languages to generate a tags file for each one.
+ */
+ for (j = 0; j < ga.ga_len; j += 2)
+ {
+ STRCPY(fname, "tags-xx");
+ fname[5] = ((char_u *)ga.ga_data)[j];
+ fname[6] = ((char_u *)ga.ga_data)[j + 1];
+ if (fname[5] == 'e' && fname[6] == 'n')
+ {
+ /* English is an exception: use ".txt" and "tags". */
+ fname[4] = NUL;
+ STRCPY(ext, ".txt");
+ }
+ else
+ {
+ /* Language "ab" uses ".abx" and "tags-ab". */
+ STRCPY(ext, ".xxx");
+ ext[1] = fname[5];
+ ext[2] = fname[6];
+ }
+ helptags_one(dirname, ext, fname, add_help_tags);
+ }
+
+ ga_clear(&ga);
+ FreeWild(filecount, files);
+
+ #else
+ /* No language support, just use "*.txt" and "tags". */
+ helptags_one(dirname, (char_u *)".txt", (char_u *)"tags", add_help_tags);
+ #endif
+ }
+
+ static void
+ helptags_cb(char_u *fname, void *cookie)
+ {
+ do_helptags(fname, *(int *)cookie);
+ }
+
+ /*
+ * ":helptags"
+ */
+ void
+ ex_helptags(exarg_T *eap)
+ {
+ expand_T xpc;
+ char_u *dirname;
+ int add_help_tags = FALSE;
+
+ /* Check for ":helptags ++t {dir}". */
+ if (STRNCMP(eap->arg, "++t", 3) == 0 && vim_iswhite(eap->arg[3]))
+ {
+ add_help_tags = TRUE;
+ eap->arg = skipwhite(eap->arg + 3);
+ }
+
+ if (STRCMP(eap->arg, "ALL") == 0)
+ {
+ do_in_path(p_rtp, (char_u *)"doc", DIP_ALL + DIP_DIR,
+ helptags_cb, &add_help_tags);
+ }
+ else
+ {
+ ExpandInit(&xpc);
+ xpc.xp_context = EXPAND_DIRECTORIES;
+ dirname = ExpandOne(&xpc, eap->arg, NULL,
+ WILD_LIST_NOTFOUND|WILD_SILENT, WILD_EXPAND_FREE);
+ if (dirname == NULL || !mch_isdir(dirname))
+ EMSG2(_("E150: Not a directory: %s"), eap->arg);
+ else
+ do_helptags(dirname, add_help_tags);
+ vim_free(dirname);
+ }
+ }
+
#if defined(FEAT_SIGNS) || defined(PROTO)
/*
*** ../vim-7.4.1550/src/vim.h 2016-03-11 22:52:00.742438030 +0100
--- src/vim.h 2016-03-12 21:07:33.615532161 +0100
***************
*** 2288,2291 ****
--- 2288,2296 ----
int vim_main2(int argc, char **argv);
#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 */
*** ../vim-7.4.1550/src/testdir/test_packadd.vim 2016-03-12
20:34:22.820382141 +0100
--- src/testdir/test_packadd.vim 2016-03-12 21:24:13.181046016 +0100
***************
*** 97,99 ****
--- 97,116 ----
packloadall!
call assert_equal(4321, g:plugin_bar_number)
endfunc
+
+ func Test_helptags()
+ let docdir1 = &packpath . '/pack/mine/start/foo/doc'
+ let docdir2 = &packpath . '/pack/mine/start/bar/doc'
+ call mkdir(docdir1, 'p')
+ call mkdir(docdir2, 'p')
+ call writefile(['look here: *look-here*'], docdir1 . '/bar.txt')
+ call writefile(['look away: *look-away*'], docdir2 . '/foo.txt')
+ exe 'set rtp=' . &packpath . '/pack/mine/start/foo,' . &packpath .
'/pack/mine/start/bar'
+
+ helptags ALL
+
+ let tags1 = readfile(docdir1 . '/tags')
+ call assert_true(tags1[0] =~ 'look-here')
+ let tags2 = readfile(docdir2 . '/tags')
+ call assert_true(tags2[0] =~ 'look-away')
+ endfunc
*** ../vim-7.4.1550/src/version.c 2016-03-12 20:34:22.820382141 +0100
--- src/version.c 2016-03-12 21:27:31.538965225 +0100
***************
*** 745,746 ****
--- 745,748 ----
{ /* Add new patch number below this line */
+ /**/
+ 1551,
/**/
--
'Well, here's something to occupy you and keep your mind off things.'
'It won't work, I have an exceptionally large mind.'
-- 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.