mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-27 04:40:59 +01:00
28308/28310: HIST_LEX_WORDS, check for quick history read
This commit is contained in:
parent
377f2bb812
commit
66f32a80dc
5 changed files with 93 additions and 52 deletions
|
|
@ -1,5 +1,9 @@
|
||||||
2010-10-02 Peter Stephenson <p.w.stephenson@ntlworld.com>
|
2010-10-02 Peter Stephenson <p.w.stephenson@ntlworld.com>
|
||||||
|
|
||||||
|
* 28310 with 28308 (Bart): Doc/Zsh/options.yo, Src/hist.c,
|
||||||
|
Src/options.c, Src/zsh.h: HIST_LEX_WORDS option and check
|
||||||
|
for full history file read.
|
||||||
|
|
||||||
* 28309: Src/subst.c: infinite loop when padding with extra wide
|
* 28309: Src/subst.c: infinite loop when padding with extra wide
|
||||||
characters.
|
characters.
|
||||||
|
|
||||||
|
|
@ -13689,5 +13693,5 @@
|
||||||
|
|
||||||
*****************************************************
|
*****************************************************
|
||||||
* This is used by the shell to define $ZSH_PATCHLEVEL
|
* This is used by the shell to define $ZSH_PATCHLEVEL
|
||||||
* $Revision: 1.5090 $
|
* $Revision: 1.5091 $
|
||||||
*****************************************************
|
*****************************************************
|
||||||
|
|
|
||||||
|
|
@ -836,6 +836,21 @@ command is entered before it vanishes, allowing you to briefly reuse
|
||||||
or edit the line. If you want to make it vanish right away without
|
or edit the line. If you want to make it vanish right away without
|
||||||
entering another command, type a space and press return.
|
entering another command, type a space and press return.
|
||||||
)
|
)
|
||||||
|
pindex(HIST_LEX_WORDS)
|
||||||
|
pindex(NO_HIST_LEX_WORDS)
|
||||||
|
pindex(HISTLEXWORDS)
|
||||||
|
pindex(NOHISTLEXWORDS)
|
||||||
|
item(tt(HIST_LEX_WORDS))(
|
||||||
|
By default, shell history that is read in from files is split into
|
||||||
|
words on all white space. This means that arguments with quoted
|
||||||
|
whitespace are not correctly handled, with the consequence that
|
||||||
|
references to words in history lines that have been read from a file
|
||||||
|
may be inaccurate. When this option is set, words read in from a
|
||||||
|
history file are divided up in a similar fashion to normal shell
|
||||||
|
command line handling. Although this produces more accurately delimited
|
||||||
|
words, if the size of the history file is large this can be slow. Trial
|
||||||
|
and error is necessary to decide.
|
||||||
|
)
|
||||||
pindex(HIST_NO_FUNCTIONS)
|
pindex(HIST_NO_FUNCTIONS)
|
||||||
pindex(NO_HIST_NO_FUNCTIONS)
|
pindex(NO_HIST_NO_FUNCTIONS)
|
||||||
pindex(HISTNOFUNCTIONS)
|
pindex(HISTNOFUNCTIONS)
|
||||||
|
|
|
||||||
122
Src/hist.c
122
Src/hist.c
|
|
@ -2232,7 +2232,6 @@ readhistfile(char *fn, int err, int readflags)
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
int nwordpos, nwords, bufsiz;
|
int nwordpos, nwords, bufsiz;
|
||||||
int searching, newflags, l, ret;
|
int searching, newflags, l, ret;
|
||||||
LinkList wordlist;
|
|
||||||
|
|
||||||
if (!fn && !(fn = getsparam("HISTFILE")))
|
if (!fn && !(fn = getsparam("HISTFILE")))
|
||||||
return;
|
return;
|
||||||
|
|
@ -2336,60 +2335,81 @@ readhistfile(char *fn, int err, int readflags)
|
||||||
he->ftim = ftim;
|
he->ftim = ftim;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Divide up the words. Attempt to do this using the lexer.
|
* Divide up the words.
|
||||||
*/
|
*/
|
||||||
nwordpos = 0;
|
nwordpos = 0;
|
||||||
start = pt;
|
start = pt;
|
||||||
wordlist = bufferwords(NULL, pt, NULL);
|
if (isset(HISTLEXWORDS) && !(readflags & HFILE_FAST)) {
|
||||||
he->nwords = countlinknodes(wordlist);
|
/*
|
||||||
if (2*he->nwords > nwords) {
|
* Attempt to do this using the lexer.
|
||||||
nwords = 2*he->nwords;
|
*/
|
||||||
words = (short *)realloc(words, nwords*sizeof(short));
|
LinkList wordlist = bufferwords(NULL, pt, NULL);
|
||||||
}
|
he->nwords = countlinknodes(wordlist);
|
||||||
while (firstnode(wordlist)) {
|
if (2*he->nwords > nwords) {
|
||||||
char *word = uremnode(wordlist, firstnode(wordlist));
|
nwords = 2*he->nwords;
|
||||||
|
words = (short *)realloc(words, nwords*sizeof(short));
|
||||||
while (inblank(*pt))
|
|
||||||
pt++;
|
|
||||||
if (!strpfx(word, pt)) {
|
|
||||||
int bad = 0;
|
|
||||||
/*
|
|
||||||
* Oddity 1: newlines turn into semicolons.
|
|
||||||
*/
|
|
||||||
if (!strcmp(word, ";"))
|
|
||||||
continue;
|
|
||||||
/*
|
|
||||||
* Oddity 2: !'s turn into |'s.
|
|
||||||
*/
|
|
||||||
while (*pt) {
|
|
||||||
if (!*word) {
|
|
||||||
bad = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (*pt == *word ||
|
|
||||||
(*pt == '!' && *word == '|')) {
|
|
||||||
pt++;
|
|
||||||
word++;
|
|
||||||
} else {
|
|
||||||
bad = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (bad) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
dputs(ERRMSG("bad wordsplit reading history: %s\nat: %s"
|
|
||||||
"\nword: %s"),
|
|
||||||
start, pt, word);
|
|
||||||
#endif
|
|
||||||
words[nwordpos++] = pt - start;
|
|
||||||
pt += strlen(pt);
|
|
||||||
words[nwordpos++] = pt - start;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
words[nwordpos++] = pt - start;
|
while (firstnode(wordlist)) {
|
||||||
pt += strlen(word);
|
char *word = uremnode(wordlist, firstnode(wordlist));
|
||||||
words[nwordpos++] = pt - start;
|
|
||||||
|
while (inblank(*pt))
|
||||||
|
pt++;
|
||||||
|
if (!strpfx(word, pt)) {
|
||||||
|
int bad = 0;
|
||||||
|
/*
|
||||||
|
* Oddity 1: newlines turn into semicolons.
|
||||||
|
*/
|
||||||
|
if (!strcmp(word, ";"))
|
||||||
|
continue;
|
||||||
|
/*
|
||||||
|
* Oddity 2: !'s turn into |'s.
|
||||||
|
*/
|
||||||
|
while (*pt) {
|
||||||
|
if (!*word) {
|
||||||
|
bad = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (*pt == *word ||
|
||||||
|
(*pt == '!' && *word == '|')) {
|
||||||
|
pt++;
|
||||||
|
word++;
|
||||||
|
} else {
|
||||||
|
bad = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bad) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
dputs(ERRMSG("bad wordsplit reading history: "
|
||||||
|
"%s\nat: %s\nword: %s"),
|
||||||
|
start, pt, word);
|
||||||
|
#endif
|
||||||
|
words[nwordpos++] = pt - start;
|
||||||
|
pt += strlen(pt);
|
||||||
|
words[nwordpos++] = pt - start;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
words[nwordpos++] = pt - start;
|
||||||
|
pt += strlen(word);
|
||||||
|
words[nwordpos++] = pt - start;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do {
|
||||||
|
while (inblank(*pt))
|
||||||
|
pt++;
|
||||||
|
if (*pt) {
|
||||||
|
if (nwordpos >= nwords)
|
||||||
|
words = (short *)
|
||||||
|
realloc(words, (nwords += 64)*sizeof(short));
|
||||||
|
words[nwordpos++] = pt - start;
|
||||||
|
while (*pt && !inblank(*pt))
|
||||||
|
pt++;
|
||||||
|
words[nwordpos++] = pt - start;
|
||||||
|
}
|
||||||
|
} while (*pt);
|
||||||
|
|
||||||
|
he->nwords = nwordpos/2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (he->nwords) {
|
if (he->nwords) {
|
||||||
|
|
|
||||||
|
|
@ -149,6 +149,7 @@ static struct optname optns[] = {
|
||||||
{{NULL, "histignorealldups", 0}, HISTIGNOREALLDUPS},
|
{{NULL, "histignorealldups", 0}, HISTIGNOREALLDUPS},
|
||||||
{{NULL, "histignoredups", 0}, HISTIGNOREDUPS},
|
{{NULL, "histignoredups", 0}, HISTIGNOREDUPS},
|
||||||
{{NULL, "histignorespace", 0}, HISTIGNORESPACE},
|
{{NULL, "histignorespace", 0}, HISTIGNORESPACE},
|
||||||
|
{{NULL, "histlexwords", 0}, HISTLEXWORDS},
|
||||||
{{NULL, "histnofunctions", 0}, HISTNOFUNCTIONS},
|
{{NULL, "histnofunctions", 0}, HISTNOFUNCTIONS},
|
||||||
{{NULL, "histnostore", 0}, HISTNOSTORE},
|
{{NULL, "histnostore", 0}, HISTNOSTORE},
|
||||||
{{NULL, "histsubstpattern", OPT_EMULATE}, HISTSUBSTPATTERN},
|
{{NULL, "histsubstpattern", OPT_EMULATE}, HISTSUBSTPATTERN},
|
||||||
|
|
|
||||||
|
|
@ -1942,6 +1942,7 @@ enum {
|
||||||
HISTIGNOREALLDUPS,
|
HISTIGNOREALLDUPS,
|
||||||
HISTIGNOREDUPS,
|
HISTIGNOREDUPS,
|
||||||
HISTIGNORESPACE,
|
HISTIGNORESPACE,
|
||||||
|
HISTLEXWORDS,
|
||||||
HISTNOFUNCTIONS,
|
HISTNOFUNCTIONS,
|
||||||
HISTNOSTORE,
|
HISTNOSTORE,
|
||||||
HISTREDUCEBLANKS,
|
HISTREDUCEBLANKS,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue