All of these except the OP (I think) use SQLite databases.
Personally I use zsh-histdb, which is great but only for ZSH. I'm working on adding a rich SQLite history to nushell so I can finally try nu: https://github.com/nushell/reedline/pull/401 .
One thing I’d like these to do (I tried a couple and settled for zsh-histdb with the fzf integration) is to be able to annotate past commands, with a description, tags or, even better, both.
The use case I have in mind is when I end up crafting some complicated and inscrutable incantation and being able to “earmark” it for future reference with a little bit of context that FutureMe might have forgotten by the time he thinks to reach out for the history.
Put another way, I do tend to use my shell history as a scrapbook of sorts, and I wish I was able to easily write on the margins.
Please, let me know if this is already a feature of any of these tools that I’ve completely missed.
I found it sad that there's so much overlapping effort (here, but in profile plug-ins broadly) so I also abstracted its foundational shell glue out into its own module, https://github.com/abathur/shellswain.
I use a homerolled thing in .bashrc using plain text files. Regardless of implementation details, this kind of thing saved me vast amount of time over the years. Some requirements that I find the most useful:
- Session ID: assign session IDs so multiple shells don't get mixed up. Make customizable so it's easy to integrate with screen or tmux etc. On reboot, if session IDs are restored, the history can be recovered.
- Instant write: command typed in one shell should be available to search in a different shell right away
- Search order: reverse search should return commands for the current session first, but also make other sessions available
My favorite shell keystroke saver now is tab-completion.
Its wonderful that it works for things besides files.
eg `systemctl iso<tab>` gives 'systemctl isolate`
Its great but it could be even better. For example if there is ambiguity the possible choices are shown but not as a menu.
The example shows many fields which are stored in the JSON for each command. I wonder how the file size will blow up after some time. Also, how are duplicates handled? Looking at all the details which are kept in context of a command, removing duplicate commands seems not to be an option without loosing the rich context.
Hi, author here.
I have almost two years of history on my machine right now.
It's 77k history records which takes up 126MB.
The amount of saved context is currently excessive. When I started the project I didn't know exactly what I would need so I included a lot of things that were never used.
I do plan to reduce the history records to about 16 fields which should more than halve the space requirements.
I haven't done this yet because I need to safely convert the existing history records people already have to the new reduced version during update which is tricky.
Not directly related, but for a long time now, I've been using per project specific $HISTFILE (set automatically when I start using, ie: cd into, the project dir) and that simple change, by itself, has greatly improved the quality of the cli history.
I believe fish already does some of these things. For example: if there is no binary available in PATH for one of the commands in your history, that command won't be suggested. Same goes for commands that have file/directory names in them that don't exist.
I am a long time user of Zsh with FZF history search. Can't live without it now. (Same as Emacs+Helm everywhere).
I tried McFly for a bit (Was interested in optimized search based on the current folder). But the whole UI was wonky and jumping around. So I came back to FZF.
https://github.com/cantino/mcfly
https://github.com/jcsalterego/historian
https://github.com/larkery/zsh-histdb + https://github.com/m42e/zsh-histdb-fzf
https://github.com/ellie/atuin
All of these except the OP (I think) use SQLite databases.
Personally I use zsh-histdb, which is great but only for ZSH. I'm working on adding a rich SQLite history to nushell so I can finally try nu: https://github.com/nushell/reedline/pull/401 .