diff options
author | Barton E. Schaefer <schaefer@zsh.org> | 2013-10-17 07:28:52 -0700 |
---|---|---|
committer | Barton E. Schaefer <schaefer@zsh.org> | 2013-10-17 07:28:52 -0700 |
commit | ff520d1b798faa26037291e373689b5957784cc8 (patch) | |
tree | 10d802ac64e5ea5adcc58612208ed7d0b21e9314 | |
parent | 73ececfd01bc137366d25940d90a34aaa2cdb02e (diff) | |
download | zsh-ff520d1b798faa26037291e373689b5957784cc8.tar.gz zsh-ff520d1b798faa26037291e373689b5957784cc8.tar.xz zsh-ff520d1b798faa26037291e373689b5957784cc8.zip |
31823: add HISTORY_IGNORE parameter
HISTORY_IGNORE defines a pattern to exclude matching lines in the internal history from the HISTFILE at write time.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Doc/Zsh/params.yo | 10 | ||||
-rw-r--r-- | Src/hist.c | 17 |
3 files changed, 33 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index 0493ab5ec..ae0e938cf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-10-17 Barton E. Schaefer <schaefer@zsh.org> + + * 31836 (cf. 31823): Doc/Zsh/params.yo, Src/hist.c: add + HISTORY_IGNORE pattern to exclude matching lines in the + internal history from the HISTFILE at write time. + 2013-10-17 Peter Stephenson <p.stephenson@samsung.com> * 31830: Doc/Zsh/func.yo, README, Src/hist.c, Src/zsh.h: diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo index 8c37c2de2..97087a1c5 100644 --- a/Doc/Zsh/params.yo +++ b/Doc/Zsh/params.yo @@ -967,6 +967,16 @@ item(tt(HISTFILE))( The file to save the history in when an interactive shell exits. If unset, the history is not saved. ) +vindex(HISTORY_IGNORE) +item(tt(HISTORY_IGNORE))( +If set, is treated as a pattern at the time history files are written. +Any potential history entry that matches the pattern is skipped. For +example, if the value is `tt(fc *)' then commands that invoke the +interactive history editor are never written to the history file (compare +the tt(HIST_NO_STORE) option or the tt(zshaddhistory) hook, either of +which would prevent such commands from being added to the interactive +history at all). +) vindex(HISTSIZE) item(tt(HISTSIZE) <S>)( The maximum number of events stored in the internal history list. diff --git a/Src/hist.c b/Src/hist.c index fa5bdbb3c..1845bd8ad 100644 --- a/Src/hist.c +++ b/Src/hist.c @@ -2600,12 +2600,27 @@ savehistfile(char *fn, int err, int writeflags) } } if (out) { + char *history_ignore; + Patprog histpat = NULL; + + pushheap(); + + if ((history_ignore = getsparam("HISTORY_IGNORE")) != NULL) { + tokenize(history_ignore = dupstring(history_ignore)); + remnulargs(history_ignore); + histpat = patcompile(history_ignore, 0, NULL); + } + ret = 0; for (; he && he->histnum <= xcurhist; he = down_histent(he)) { if ((writeflags & HFILE_SKIPDUPS && he->node.flags & HIST_DUP) || (writeflags & HFILE_SKIPFOREIGN && he->node.flags & HIST_FOREIGN) || he->node.flags & HIST_TMPSTORE) continue; + if (histpat && + pattry(histpat, metafy(he->node.nam, -1, META_HEAPDUP))) { + continue; + } if (writeflags & HFILE_SKIPOLD) { if (he->node.flags & (HIST_OLD|HIST_NOWRITE)) continue; @@ -2685,6 +2700,8 @@ savehistfile(char *fn, int err, int writeflags) histactive = remember_histactive; } } + + popheap(); } else ret = -1; |