# HG changeset patch # User Bram Moolenaar # Date 1365949575 -7200 # Node ID 1dc160bf2488fb1332250edaefcc9f1e320c8e57 # Parent 9f9ca27142aa516b572a60df03bb882a24de9a6b updated for version 7.3.891 Problem: Merging viminfo history doesn't work well. Solution: Don't stop when one type of history is empty. Don't merge history when writing viminfo. diff --git a/src/ex_getln.c b/src/ex_getln.c --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -6130,7 +6130,7 @@ finish_viminfo_history() for (type = 0; type < HIST_COUNT; ++type) { if (history[type] == NULL) - return; + continue; idx = hisidx[type] + viminfo_hisidx[type]; if (idx >= hislen) idx -= hislen; @@ -6182,6 +6182,7 @@ write_viminfo_history(fp) int num_saved; char_u *p; int c; + int round; init_history(); if (hislen == 0) @@ -6200,26 +6201,50 @@ write_viminfo_history(fp) _("Input Line")); if (num_saved > hislen) num_saved = hislen; - i = hisidx[type]; - if (i >= 0) - while (num_saved--) - { - p = history[type][i].hisstr; - if (p != NULL) + + /* + * Merge typed and viminfo history: + * round 1: history of typed commands. + * round 2: history from recently read viminfo. + */ + for (round = 1; round <= 2; ++round) + { + i = round == 1 ? hisidx[type] : 0; + if (i >= 0) + while (num_saved > 0 + && !(round == 2 && i >= viminfo_hisidx[type])) { - fputc(hist_type2char(type, TRUE), fp); - /* For the search history: put the separator in the second - * column; use a space if there isn't one. */ - if (type == HIST_SEARCH) + p = round == 1 ? history[type][i].hisstr + : viminfo_history[type][i]; + if (p != NULL) { - c = p[STRLEN(p) + 1]; - putc(c == NUL ? ' ' : c, fp); + --num_saved; + fputc(hist_type2char(type, TRUE), fp); + /* For the search history: put the separator in the + * second column; use a space if there isn't one. */ + if (type == HIST_SEARCH) + { + c = p[STRLEN(p) + 1]; + putc(c == NUL ? ' ' : c, fp); + } + viminfo_writestring(fp, p); } - viminfo_writestring(fp, p); + if (round == 1) + { + /* Decrement index, loop around and stop when back at + * the start. */ + if (--i < 0) + i = hislen - 1; + if (i == hisidx[type]) + break; + } + else + { + /* Increment index. Stop at the end in the while. */ + ++i; + } } - if (--i < 0) - i = hislen - 1; - } + } } } #endif /* FEAT_VIMINFO */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 891, +/**/ 890, /**/ 889,