summaryrefslogtreecommitdiff
path: root/src/ex_getln.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2013-04-14 16:26:15 +0200
committerBram Moolenaar <Bram@vim.org>2013-04-14 16:26:15 +0200
commit6f852a557df33b8d0562aad3ddc3ff529626bb4f (patch)
treeaae9f53c25720eae6c37a0e1727dc28c3461cf4f /src/ex_getln.c
parent7311c6932c22f2afae13266e05780daa01b859ee (diff)
downloadvim-git-6f852a557df33b8d0562aad3ddc3ff529626bb4f.tar.gz
updated for version 7.3.891v7.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.
Diffstat (limited to 'src/ex_getln.c')
-rw-r--r--src/ex_getln.c59
1 files changed, 42 insertions, 17 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c
index f3c364451..1faadd6c3 100644
--- 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);
+ }
+ 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;
}
- viminfo_writestring(fp, p);
}
- if (--i < 0)
- i = hislen - 1;
- }
+ }
}
}
#endif /* FEAT_VIMINFO */