Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: How to (properly) remove the last entry from history with command_not_found_handler

On Sun, 20 Jul 2014 11:04:12 +0200
Jochen Keil <jrk@xxxxxxxxxxxxx> wrote:
> I'm trying to remove the last entry from my $HISTFILE when the command
> was not found. My current attempt involves the
> command_not_found_handler() hook:
> function command_not_found_handler()
> {
>     sed -i '$d' $HISTFILE
>     return 127
> }
> However, I'm not sure if it's ok to manipulate the history file directly
> with sed, or if I'm risking corruption.

You're can hit problems if you have multiple shells running at once.
You'd need to lock the file --- it is possible to do that in a way
that's compatibile with how the shell works, either creating a symlink
with the name of the history file with .LOCK on the end or, if you have
HISTFCNTLLOCK set, using flock, which you can get access to with
"zsystem flock".

Another approach is to have a zshaddhistory hook --- either a function
or zshaddhistory or a function named in the array
zshaddhistory_functions --- decide whether the command isn't going to be
found.  But that's quite a lot of work, too: you need to split off the
first word, look it up as an alias, possibly recursively, then decide if
the result is a reserved word, an external command, a function, an
assignment... all possible but takes some work.

I couldn't think of a way to make zshaddhistory and
command_not_found_handler together.


Messages sorted by: Reverse Date, Date, Thread, Author