mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-05 11:01:13 +02:00
Improved resizehistents() so that it honors HISTEXPIREDUPSFIRST.
This commit is contained in:
parent
8b7c9d40d4
commit
c24a38cdaa
1 changed files with 33 additions and 25 deletions
58
Src/hist.c
58
Src/hist.c
|
@ -913,11 +913,34 @@ gethistent(int ev, int nearmatch)
|
|||
return he;
|
||||
}
|
||||
|
||||
static void
|
||||
putoldhistentryontop(void)
|
||||
{
|
||||
Histent he = hist_ring->down;
|
||||
if (isset(HISTEXPIREDUPSFIRST) && !(he->flags & HIST_DUP)) {
|
||||
int max_unique_ct = getiparam("SAVEHIST");
|
||||
do {
|
||||
if (max_unique_ct-- <= 0) {
|
||||
he = hist_ring->down;
|
||||
break;
|
||||
}
|
||||
he = he->down;
|
||||
} while (he != hist_ring->down && !(he->flags & HIST_DUP));
|
||||
if (he != hist_ring->down) {
|
||||
he->up->down = he->down;
|
||||
he->down->up = he->up;
|
||||
he->up = hist_ring;
|
||||
he->down = hist_ring->down;
|
||||
hist_ring->down = he->down->up = he;
|
||||
}
|
||||
}
|
||||
hist_ring = he;
|
||||
}
|
||||
|
||||
/**/
|
||||
Histent
|
||||
prepnexthistent(void)
|
||||
{
|
||||
Histent he;
|
||||
int curline_in_ring = hist_ring == &curline;
|
||||
|
||||
if (curline_in_ring)
|
||||
|
@ -928,7 +951,7 @@ prepnexthistent(void)
|
|||
}
|
||||
|
||||
if (histlinect < histsiz) {
|
||||
he = (Histent)zcalloc(sizeof *he);
|
||||
Histent he = (Histent)zcalloc(sizeof *he);
|
||||
if (!hist_ring)
|
||||
hist_ring = he->up = he->down = he;
|
||||
else {
|
||||
|
@ -940,30 +963,13 @@ prepnexthistent(void)
|
|||
histlinect++;
|
||||
}
|
||||
else {
|
||||
he = hist_ring->down;
|
||||
if (isset(HISTEXPIREDUPSFIRST) && !(he->flags & HIST_DUP)) {
|
||||
int max_unique_ct = getiparam("SAVEHIST");
|
||||
do {
|
||||
if (max_unique_ct-- <= 0) {
|
||||
he = hist_ring->down;
|
||||
break;
|
||||
}
|
||||
he = he->down;
|
||||
} while (he != hist_ring->down && !(he->flags & HIST_DUP));
|
||||
if (he != hist_ring->down) {
|
||||
he->up->down = he->down;
|
||||
he->down->up = he->up;
|
||||
he->up = hist_ring;
|
||||
he->down = hist_ring->down;
|
||||
hist_ring->down = he->down->up = he;
|
||||
}
|
||||
}
|
||||
freehistdata(hist_ring = he, 0);
|
||||
putoldhistentryontop();
|
||||
freehistdata(hist_ring, 0);
|
||||
}
|
||||
he->histnum = ++curhist;
|
||||
hist_ring->histnum = ++curhist;
|
||||
if (curline_in_ring)
|
||||
linkcurline();
|
||||
return he;
|
||||
return hist_ring;
|
||||
}
|
||||
|
||||
/* A helper function for hend() */
|
||||
|
@ -1756,8 +1762,10 @@ inithist(void)
|
|||
void
|
||||
resizehistents(void)
|
||||
{
|
||||
while (histlinect > histsiz)
|
||||
freehistnode((HashNode)hist_ring->down);
|
||||
while (histlinect > histsiz) {
|
||||
putoldhistentryontop();
|
||||
freehistnode((HashNode)hist_ring);
|
||||
}
|
||||
}
|
||||
|
||||
/* Remember the last line in the history file so we can find it again. */
|
||||
|
|
Loading…
Reference in a new issue