RESH: Rich Enhanced Shell History
github.comAlternatives (without judgement):
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 .
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 use Zsh + FZF and am very happy with it. My history is about 30K entries long and it handles like a champ.
I use a poor mans version of the tagging you speak of. I use hashtags at the end of long commands I would like to reuse.
$ <long winded shell command> #restart #remote
FZF history search finds them easily.
perhaps `setopt interactivecomments` and then use comments might work?
If you were a fan of your favorite band before anyone else, you may also find https://github.com/abathur/shell-hag somewhat interesting.
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 am slow-cooking them, for better and worse.
> I'm working on adding a rich SQLite history to nushell
You may then be interested in my solution for bash, where Ctrl-R gives you fzy history for the given directory and Ctrl-T for all directories: https://github.com/csdvrx/bash-timestamping-sqlite
Everything goes into SQLite, which is helpful for stats - like, when do I make the most mistakes?
There's also https://github.com/ellie/atuin which offers a way to sync history across systems.
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
Been using something similar, McFly, for a while. It works really well. https://github.com/cantino/mcfly
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.
I think you want `fzf`?
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.
Yeah, based on the issues that might be a fair assumption:
https://github.com/curusarn/resh/issues
more expected issues from relying on a big JSON file:
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.
Can you save a version flag and support both until you write the migration logic? That way at least new users benefit
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.
Is there something similar available for fish?
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.
https://github.com/cantino/mcfly it uses small neural engine and pretty fast
How does the default fish completion compare to this I wonder? It's pretty great already.
This looks interesting, I'll have to try this and see how I like it compared to fzf's fuzzy history search.
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.