summaryrefslogtreecommitdiff
path: root/src/ex_cmds.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2011-10-20 18:17:42 +0200
committerBram Moolenaar <Bram@vim.org>2011-10-20 18:17:42 +0200
commit667b4d2db96fbdb8d19d413138ce45d56bccbe0f (patch)
treeb6b8c8b335db92a4f91a1264461c6ce91ccb80db /src/ex_cmds.c
parentf34dc6537d840944f8ac541843ed3ecbae50e576 (diff)
downloadvim-667b4d2db96fbdb8d19d413138ce45d56bccbe0f.zip
updated for version 7.3.341
Problem: Local help files are only listed in help.txt, not in translated help files. Solution: Also find translated help files. (Yasuhiro Matsumoto)
Diffstat (limited to 'src/ex_cmds.c')
-rw-r--r--src/ex_cmds.c244
1 files changed, 154 insertions, 90 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index b433bca40..33021d295 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -5982,6 +5982,7 @@ fix_help_buffer()
char_u *line;
int in_example = FALSE;
int len;
+ char_u *fname;
char_u *p;
char_u *rt;
int mustfree;
@@ -6028,124 +6029,187 @@ fix_help_buffer()
}
/*
- * In the "help.txt" file, add the locally added help files.
- * This uses the very first line in the help file.
+ * In the "help.txt" and "help.abx" file, add the locally added help
+ * files. This uses the very first line in the help file.
*/
- if (fnamecmp(gettail(curbuf->b_fname), "help.txt") == 0)
+ fname = gettail(curbuf->b_fname);
+ if (fnamecmp(fname, "help.txt") == 0
+#ifdef FEAT_MULTI_LANG
+ || (fnamencmp(fname, "help.", 5) == 0
+ && ASCII_ISALPHA(fname[5])
+ && ASCII_ISALPHA(fname[6])
+ && TOLOWER_ASC(fname[7]) == 'x'
+ && fname[8] == NUL)
+#endif
+ )
{
for (lnum = 1; lnum < curbuf->b_ml.ml_line_count; ++lnum)
{
line = ml_get_buf(curbuf, lnum, FALSE);
- if (strstr((char *)line, "*local-additions*") != NULL)
+ if (strstr((char *)line, "*local-additions*") == NULL)
+ continue;
+
+ /* Go through all directories in 'runtimepath', skipping
+ * $VIMRUNTIME. */
+ p = p_rtp;
+ while (*p != NUL)
{
- /* Go through all directories in 'runtimepath', skipping
- * $VIMRUNTIME. */
- p = p_rtp;
- while (*p != NUL)
+ copy_option_part(&p, NameBuff, MAXPATHL, ",");
+ mustfree = FALSE;
+ rt = vim_getenv((char_u *)"VIMRUNTIME", &mustfree);
+ if (fullpathcmp(rt, NameBuff, FALSE) != FPC_SAME)
{
- copy_option_part(&p, NameBuff, MAXPATHL, ",");
- mustfree = FALSE;
- rt = vim_getenv((char_u *)"VIMRUNTIME", &mustfree);
- if (fullpathcmp(rt, NameBuff, FALSE) != FPC_SAME)
- {
- int fcount;
- char_u **fnames;
- FILE *fd;
- char_u *s;
- int fi;
+ int fcount;
+ char_u **fnames;
+ FILE *fd;
+ char_u *s;
+ int fi;
#ifdef FEAT_MBYTE
- vimconv_T vc;
- char_u *cp;
+ vimconv_T vc;
+ char_u *cp;
#endif
- /* Find all "doc/ *.txt" files in this directory. */
- add_pathsep(NameBuff);
- STRCAT(NameBuff, "doc/*.txt");
- if (gen_expand_wildcards(1, &NameBuff, &fcount,
- &fnames, EW_FILE|EW_SILENT) == OK
- && fcount > 0)
+ /* Find all "doc/ *.txt" files in this directory. */
+ add_pathsep(NameBuff);
+#ifdef FEAT_MULTI_LANG
+ STRCAT(NameBuff, "doc/*.??[tx]");
+#else
+ STRCAT(NameBuff, "doc/*.txt");
+#endif
+ if (gen_expand_wildcards(1, &NameBuff, &fcount,
+ &fnames, EW_FILE|EW_SILENT) == OK
+ && fcount > 0)
+ {
+#ifdef FEAT_MULTI_LANG
+ int i1;
+ int i2;
+ char_u *f1;
+ char_u *f2;
+ char_u *t1;
+ char_u *e1;
+ char_u *e2;
+
+ /* If foo.abx is found use it instead of foo.txt in
+ * the same directory. */
+ for (i1 = 0; i1 < fcount; ++i1)
{
- for (fi = 0; fi < fcount; ++fi)
+ for (i2 = 0; i2 < fcount; ++i2)
{
- fd = mch_fopen((char *)fnames[fi], "r");
- if (fd != NULL)
+ if (i1 == i2)
+ continue;
+ if (fnames[i1] == NULL || fnames[i2] == NULL)
+ continue;
+ f1 = fnames[i1];
+ f2 = fnames[i2];
+ t1 = gettail(f1);
+ if (fnamencmp(f1, f2, t1 - f1) != 0)
+ continue;
+ e1 = vim_strrchr(t1, '.');
+ e2 = vim_strrchr(gettail(f2), '.');
+ if (e1 == NUL || e2 == NUL)
+ continue;
+ if (fnamecmp(e1, ".txt") != 0
+ && fnamecmp(e1, fname + 4) != 0)
+ {
+ /* Not .txt and not .abx, remove it. */
+ vim_free(fnames[i1]);
+ fnames[i1] = NULL;
+ continue;
+ }
+ if (fnamencmp(f1, f2, e1 - f1) != 0)
+ continue;
+ if (fnamecmp(e1, ".txt") == 0
+ && fnamecmp(e2, fname + 4) == 0)
+ {
+ /* use .abx instead of .txt */
+ vim_free(fnames[i1]);
+ fnames[i1] = NULL;
+ }
+ }
+ }
+#endif
+ for (fi = 0; fi < fcount; ++fi)
+ {
+ if (fnames[fi] == NULL)
+ continue;
+ fd = mch_fopen((char *)fnames[fi], "r");
+ if (fd != NULL)
+ {
+ vim_fgets(IObuff, IOSIZE, fd);
+ if (IObuff[0] == '*'
+ && (s = vim_strchr(IObuff + 1, '*'))
+ != NULL)
{
- vim_fgets(IObuff, IOSIZE, fd);
- if (IObuff[0] == '*'
- && (s = vim_strchr(IObuff + 1, '*'))
- != NULL)
- {
#ifdef FEAT_MBYTE
- int this_utf = MAYBE;
+ int this_utf = MAYBE;
#endif
- /* Change tag definition to a
- * reference and remove <CR>/<NL>. */
- IObuff[0] = '|';
- *s = '|';
- while (*s != NUL)
- {
- if (*s == '\r' || *s == '\n')
- *s = NUL;
+ /* Change tag definition to a
+ * reference and remove <CR>/<NL>. */
+ IObuff[0] = '|';
+ *s = '|';
+ while (*s != NUL)
+ {
+ if (*s == '\r' || *s == '\n')
+ *s = NUL;
#ifdef FEAT_MBYTE
- /* The text is utf-8 when a byte
- * above 127 is found and no
- * illegal byte sequence is found.
- */
- if (*s >= 0x80 && this_utf != FALSE)
- {
- int l;
-
- this_utf = TRUE;
- l = utf_ptr2len(s);
- if (l == 1)
- this_utf = FALSE;
- s += l - 1;
- }
-#endif
- ++s;
+ /* The text is utf-8 when a byte
+ * above 127 is found and no
+ * illegal byte sequence is found.
+ */
+ if (*s >= 0x80 && this_utf != FALSE)
+ {
+ int l;
+
+ this_utf = TRUE;
+ l = utf_ptr2len(s);
+ if (l == 1)
+ this_utf = FALSE;
+ s += l - 1;
}
+#endif
+ ++s;
+ }
#ifdef FEAT_MBYTE
- /* The help file is latin1 or utf-8;
- * conversion to the current
- * 'encoding' may be required. */
- vc.vc_type = CONV_NONE;
- convert_setup(&vc, (char_u *)(
- this_utf == TRUE ? "utf-8"
- : "latin1"), p_enc);
- if (vc.vc_type == CONV_NONE)
- /* No conversion needed. */
+ /* The help file is latin1 or utf-8;
+ * conversion to the current
+ * 'encoding' may be required. */
+ vc.vc_type = CONV_NONE;
+ convert_setup(&vc, (char_u *)(
+ this_utf == TRUE ? "utf-8"
+ : "latin1"), p_enc);
+ if (vc.vc_type == CONV_NONE)
+ /* No conversion needed. */
+ cp = IObuff;
+ else
+ {
+ /* Do the conversion. If it fails
+ * use the unconverted text. */
+ cp = string_convert(&vc, IObuff,
+ NULL);
+ if (cp == NULL)
cp = IObuff;
- else
- {
- /* Do the conversion. If it fails
- * use the unconverted text. */
- cp = string_convert(&vc, IObuff,
- NULL);
- if (cp == NULL)
- cp = IObuff;
- }
- convert_setup(&vc, NULL, NULL);
+ }
+ convert_setup(&vc, NULL, NULL);
- ml_append(lnum, cp, (colnr_T)0, FALSE);
- if (cp != IObuff)
- vim_free(cp);
+ ml_append(lnum, cp, (colnr_T)0, FALSE);
+ if (cp != IObuff)
+ vim_free(cp);
#else
- ml_append(lnum, IObuff, (colnr_T)0,
- FALSE);
+ ml_append(lnum, IObuff, (colnr_T)0,
+ FALSE);
#endif
- ++lnum;
- }
- fclose(fd);
+ ++lnum;
}
+ fclose(fd);
}
- FreeWild(fcount, fnames);
}
+ FreeWild(fcount, fnames);
}
- if (mustfree)
- vim_free(rt);
}
- break;
+ if (mustfree)
+ vim_free(rt);
}
+ break;
}
}
}