shell-history/README.md

2.4 KiB

shell-history

Shell history stored in SQLite, synced via git.

Install

cd $HOME/dev/vlv
git clone git.meatbag.se:vlv/shell-history.git shell-history
mkdir histdb

cd shell-history
go build -o verbatim .
sudo install verbatim /usr/local/bin/

Migrate from log files

verbatim import ~/dev/vlv/histdb/

zsh

~/.zshrc:

autoload -Uz compinit promptinit add-zsh-hook

histdb_dir="$HOME/dev/vlv/histdb"

_add_history() {
    if test "$(id -u)" -ne 0; then
        local cmd=$(fc -ln -1)
        cmd=${cmd//$'\n'/\\n}
        verbatim add \
            --timestamp "$(date -u +%Y-%m-%dT%H:%M:%S+00:00)" \
            --hostname "$(hostname)" \
            --dir "$(pwd)" \
            -- "$cmd"
    fi
}
add-zsh-hook precmd _add_history

hsup() { verbatim sync "$histdb_dir" }

hs() {
    local copy_cmd=
    case "$(uname -s)" in
        Darwin) copy_cmd="pbcopy" ;;
        *)
            case "$XDG_SESSION_TYPE" in
                x11)     copy_cmd="xsel --clipboard" ;;
                wayland) copy_cmd="wl-copy --trim-newline" ;;
                *) echo "Session type not detected."; return ;;
            esac ;;
    esac

    local entry="$(
        verbatim search --compact --reverse --limit 10000 "$@" | \
        fzf --ansi --disabled --query "${*:-}" \
            --bind "start:reload:verbatim search --compact --reverse --limit 10000 {q}" \
            --bind "change:reload:sleep 0.1; verbatim search --compact --reverse --limit 10000 {q} || true" \
            --bind "ctrl-a:reload:verbatim search --compact --reverse {q}" \
            --header "ctrl-a: search all"
    )"

    local entry_cmd="$(<<<$entry sed 's/\x1b\[[0-9;]*m//g' | awk '{ print substr($0, index($0, $5)) }')"
    entry_cmd="${entry_cmd//\\n/$'\n'}"

    if [[ "$entry" ]]; then
        eval $copy_cmd <<< "$entry_cmd" >/dev/null
        echo "Copied to clipboard." >&2
    fi
}

Usage

verbatim [--db PATH] add --timestamp T --hostname H --dir D -- COMMAND...
verbatim [--db PATH] search [--host H] [--dir D] [--after T] [--before T] [--limit N] [QUERY...]
verbatim [--db PATH] sync DIR
verbatim [--db PATH] import DIR
verbatim [--db PATH] stats

Default --db: ~/.local/share/verbatim/history.db

Legacy

The old shell scripts (search.sh, sync.sh) are kept for backward compatibility during migration. They continue to work with the log files in the git repo.