2 个稳定版本

2.1.0 2022年7月4日
2.0.1 2021年10月5日

#719 in 数据库接口

MIT 许可协议

73KB
2K SLoC

hstdb

Build Status crates.io

为 zsh 提供更好的历史管理。基于来自 https://github.com/larkery/zsh-histdb 的想法。

遵循 MIT 许可协议。

主要是因为 sqlite 合并对我而言崩溃得太多次,使用 sqlite 数据库似乎有些过度。

该工具只是为每个主机写入 CSV 文件,这使得通过 git 同步它们变得非常简单。

功能几乎与 zsh-histdb 相同

  • 命令的开始和结束时间
  • 运行命令的工作目录
  • 运行命令的机器的计算机名
  • 基于 UUID 的唯一会话 ID
  • 命令的退出状态
  • 从 zsh histfile 和 zsh-histdb sqlite 数据库导入

安装

您可以从发布页面安装相应的二进制文件,或者运行

cargo install hstdb

Archlinux

从 aur 安装: https://aur.archlinux.org/packages/hstdb/

首次启动

在安装 hstdb 之后,您需要启动服务器

hstdb server

默认情况下,服务器将在前台运行。

要停止服务器,您可以运行以下命令

hstdb stop

或者发送 SIGTERM/SIGINT (Ctrl+C) 来停止服务器。

您还可以使用位于 hstdb.service 的 systemd 单元文件,您可以将其复制到 "$HOME/.config/systemd 并使用以下命令启用/启动

systemctl --user daemon-reload
systemctl --user enable hstdb.service
systemctl --user start hstdb.service

之后,您可以将以下内容添加到您的 .zshrc 中以启用您 shell 中的 hstdb。

eval "$(hstdb init)"

您可以在当前 shell 中运行此命令以启用 hstdb 或重新启动 shell。

用法

默认命令的帮助输出

hstdb 2.0.0

USAGE:
    hstdb [FLAGS] [OPTIONS] [SUBCOMMAND]

FLAGS:
        --all-hosts
            Print all hosts

        --disable-formatting
            Disable fancy formatting

        --filter-failed
            Filter out failed commands (return code not 0)

    -h, --help
            Prints help information

        --hide-header
            Disable printing of header

    -i, --in
            Only print entries that have been executed in the current directory

        --no-subdirs
            Exclude subdirectories when filtering by folder

        --show-duration
            Show how long the command ran

        --show-host
            Print host column

        --show-pwd
            Show directory in which the command was run

        --show-session
            Show session id for command

        --show-status
            Print returncode of command

    -V, --version
            Prints version information


OPTIONS:
    -c, --command <command>
            Only print entries beginning with the given command

    -t, --text <command-text>
            Only print entries containing the given regex

        --config-path <config-path>
            Path to the socket for communication with the server [env: HISTDBRS_CONFIG_PATH=]  [default:
            /home/athaller/.config/hstdb/config.toml]
    -d, --data-dir <data-dir>
            Path to folder in which to store the history files [default: /home/athaller/.local/share/hstdb]

    -e, --entries-count <entries-count>
            How many entries to print [default: 25]

        --find-status <find-status>
            Find commands with the given return code

    -f, --folder <folder>
            Only print entries that have been executed in the given directory

        --hostname <hostname>
            Filter by given hostname

        --session <session>
            Filter by given session


SUBCOMMANDS:
    bench
            Run benchmark against server

    disable
            Disable history recording for current session

    enable
            Enable history recording for current session

    help
            Prints this message or the help of the given subcommand(s)

    import
            Import entries from existing histdb sqlite or zsh histfile

    init
            Print out shell functions needed by histdb and set current session id

    precmd
            Finish command for current session

    server
            Start the server

    session_id
            Get new session id

    stop
            Stop the server

    zshaddhistory
            Add new command for current session

最基本的命令是运行不带任何参数的 hstdb

» hstdb
 tmn    cmd
 14:28  cargo +nightly install --path .

这将打印当前机器的历史记录。默认情况下,只会打印最后 25 条条目。

Git

hstdb被编写用于轻松地在多台机器之间同步历史记录。为此,hstdb将为每台机器写入单独的历史记录文件。

如果您想在机器之间同步,请转到数据目录(默认为$HOME/.local/share/hstdb)并运行以下命令

git init
git add :/
git commit -m "Initial commit"

之后,您可以为源进行配置并开始在不同机器之间同步文件。我们没有实现自动提交/自动同步,因为我们不希望在每次运行命令时都有提交。这可能在将来被改变。

配置

还可以配置hstdb。默认情况下,配置存储在$HOME/.config/hstdb/config.toml下。可以使用--config-path选项指定不同的路径。

默认配置如下所示

# When true will not save commands that start with a space.
# Default: true
ignore_space = true

# The log level to run under.
# Default: Warn
log_level = "Warn"

导入

zsh-histdb

» histdb import histdb -h
hstdb-import-histdb 0.1.0
Import entries from existing histdb sqlite file

USAGE:
    hstdb import histdb [OPTIONS]

FLAGS:
    -h, --help
            Prints help information


OPTIONS:
    -d, --data-dir <data-dir>
            Path to folder in which to store the history files [default: $HOME/.local/share/hstdb]

    -i, --import-file <import-file>
            Path to the existing histdb sqlite file [default: $HOME/.histdb/zsh-history.db]

如果默认的data-dirimport-file设置都很好,您只需运行以下命令

histdb import histdb

这将为在sqlite数据库中找到的每个hostname创建CSV文件。它将为在sqlite中找到的每个唯一会话创建一个UUID,因此同一会话中运行的命令应该仍然组合在一起。

zsh histfile

» histdb import histfile -h
hstdb-import-histfile 0.1.0
Import entries from existing zsh histfile

USAGE:
    hstdb import histfile [OPTIONS]

FLAGS:
    -h, --help
            Prints help information


OPTIONS:
    -d, --data-dir <data-dir>
            Path to folder in which to store the history files [default: $HOME/.local/share/hstdb]

    -i, --import-file <import-file>
            Path to the existing zsh histfile file [default: $HOME/.histfile]

如果默认的data-dirimport-file设置都很好,您只需运行以下命令

histdb import histfile

由于存储在histfile中的信息非常有限,以下信息将被存储

  • time_finished将从histfile解析
  • result(退出代码)将从histfile解析
  • command将从histfile解析
  • time_start将从time_finished复制过来
  • hostname将使用当前机器的计算机名
  • pwd将设置为当前用户的家目录
  • session_id将生成并用于从histfile导入的所有命令
  • user将使用运行导入的当前用户

贡献

我对这个工具为我工作的方式感到满意,所以我不会再进一步扩展它,但欢迎为功能和修复提供贡献!

替代方案

依赖关系

~11–24MB
~337K SLoC