This is a reimplementation of https://github.com/m42e/zsh-histdb-fzf in rust and using skim as a library.
zsh-histdb-fzf works, but it is a bit quirky. It has for sure some flaws, regarding responsiveness and communication with processes. skim offers a fzf like behavior and is available as library in rust. It lacks some highlighting in the header, and has a bit different order/matching algorithm.
This should result in better performance, responsiveness and a more stable behavior.
skim is available in rust. I have never tried rust with a purpose before. I wanted to give it a try and learn something new.
Well, it accesses the zsh histdb. It lets you search on different levels.
Install the plugin, e.g. using zplug.
zplug 'm42e/zsh-histdb-skim', from:github, at:main
It downloads the binary (if available) automatically. You can do manually by calling histdb-skim-download
. It will be saved in ${XDG_DATA_HOME}/zsh-histdb-skim
, alternatively ${HOME}/.local/share/zsh-histdb-skim
. You can specify the directory manually by setting HISTDB_SKIM_PATH
.
The download will happen if the executable is not there or the version is outdated (starting from v0.7.0). These checks happen when sourcing the script.
The plugin calls bindkey
but some other plugins may overwrite. In this case you would have to do it yourself:
bindkey '^R' histdb-skim-widget
By default the binary is downloaded
cargo build --release
mkdir -p bin
mv target/release/zsh-histdb-skim bin
- HISTDB_FZF_FORCE_DATE_FORMAT: You can force us or non-us time format.
- HISTDB_FILE: SQLite file, having all the commands. (is set by zsh-histdb)
- HISTDB_SESSION: The current session id (is set by zsh-histdb)
- HISTDB_HOST: The current hostname (is set by zsh-histdb)
- HISTDB_NOSORT: Do not sort within skim. If set, the order of the commands is kept
- HISTDB_PREVIEW: This defines the format/position of the preview window.
[POSITION][:SIZE[%]][:wrap][:hidden][:+SCROLL[-OFFSET]]
- HISTDB_DEFAULT_TAB: Set the default tab. Directory|Machine or Host|Everything or *|Session (any non matching value will be treated as Session)
- improve rust code
While I stole the idea from myself, this is my first rust project ever. So I would be glad for tips and improvement PRs.