Mercurial > vim
changeset 3141:6963603ec6dc v7.3.341
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)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Thu, 20 Oct 2011 18:17:42 +0200 |
parents | c70481d40802 |
children | aae92defc652 |
files | src/ex_cmds.c src/version.c |
diffstat | 2 files changed, 169 insertions(+), 103 deletions(-) [+] |
line wrap: on
line diff
--- 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; -#ifdef FEAT_MBYTE - 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) - { - for (fi = 0; fi < fcount; ++fi) - { - fd = mch_fopen((char *)fnames[fi], "r"); - if (fd != NULL) - { - vim_fgets(IObuff, IOSIZE, fd); - if (IObuff[0] == '*' - && (s = vim_strchr(IObuff + 1, '*')) - != NULL) - { + int fcount; + char_u **fnames; + FILE *fd; + char_u *s; + int fi; #ifdef FEAT_MBYTE - 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; -#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; - } -#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. */ - 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); - - ml_append(lnum, cp, (colnr_T)0, FALSE); - if (cp != IObuff) - vim_free(cp); + vimconv_T vc; + char_u *cp; +#endif + + /* Find all "doc/ *.txt" files in this directory. */ + add_pathsep(NameBuff); +#ifdef FEAT_MULTI_LANG + STRCAT(NameBuff, "doc/*.??[tx]"); #else - ml_append(lnum, IObuff, (colnr_T)0, - FALSE); -#endif - ++lnum; - } - fclose(fd); + 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 (i2 = 0; i2 < fcount; ++i2) + { + 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; } } - FreeWild(fcount, fnames); } +#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) + { +#ifdef FEAT_MBYTE + 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; +#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; + } +#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. */ + 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); + + ml_append(lnum, cp, (colnr_T)0, FALSE); + if (cp != IObuff) + vim_free(cp); +#else + ml_append(lnum, IObuff, (colnr_T)0, + FALSE); +#endif + ++lnum; + } + fclose(fd); + } + } + FreeWild(fcount, fnames); } - if (mustfree) - vim_free(rt); } - break; + if (mustfree) + vim_free(rt); } + break; } } }