#shell-history #command #neural-network #intelligent #real-time #replace #context

bin+lib mcfly

McFly用智能搜索引擎替换默认的ctrl-r shell历史搜索,该搜索引擎考虑了您的工作目录和最近执行的命令的上下文。McFly的建议通过一个小型神经网络实时优先排序。

31个版本

新增 0.9.2 2024年8月12日
0.9.1 2024年7月11日
0.9.0 2024年6月1日
0.8.4 2023年12月25日
0.2.4 2018年12月5日

#161 in 命令行工具

Download history 20/week @ 2024-04-28 78/week @ 2024-05-05 277/week @ 2024-05-12 99/week @ 2024-05-19 224/week @ 2024-05-26 161/week @ 2024-06-02 51/week @ 2024-06-09 30/week @ 2024-06-16 15/week @ 2024-06-23 84/week @ 2024-06-30 221/week @ 2024-07-07 78/week @ 2024-07-14 42/week @ 2024-07-21 125/week @ 2024-07-28 26/week @ 2024-08-04 218/week @ 2024-08-11

每月419次下载

MIT 许可证

245KB
5.5K SLoC

寻找共同维护者:目前我没有太多时间维护这个项目。如果有人愿意加入并成为共同维护者,将会非常感激!

Build Status

McFly - 在您的shell历史记录中飞翔

screenshot

McFly用智能搜索引擎替换默认的ctrl-r shell历史搜索,该搜索引擎考虑了您的工作目录和最近执行的命令的上下文。McFly的建议通过一个小型神经网络实时优先排序。

TL;DR:一个升级版的ctrl-r,历史结果与您当前的工作相关。

特性

  • 重新绑定ctrl-r以显示一个全屏反向历史搜索,并通过一个小型神经网络进行优先排序。
  • 将shell历史记录增强到SQLite数据库中,以跟踪命令退出状态、时间戳和执行目录。
  • 同时保留您正常的shell历史记录文件,以便您随时停止使用McFly。
  • 全面支持Unicode。
  • 包括一个简单的操作,可以从McFly数据库和您的shell历史记录文件中擦除任何历史条目。
  • 设计为未来可扩展到其他shell。
  • 用Rust编写,因此它既快又安全。
  • 您可以在搜索时输入%来匹配任意数量的字符。

优先排序

McFly的关键特性是智能命令优先排序,由一个实时运行的小型神经网络提供支持。目标是您要运行的命令总是出现在建议的前列。

在建议命令时,McFly会考虑以下因素:

  • 您运行命令的目录。您未来可能还会在那个目录中运行该命令。
  • 您在运行该命令之前输入的命令(例如,命令的执行上下文)。
  • 您运行该命令的频率。
  • 您上次运行该命令的时间。
  • 您是否以前在McFly中选中过该命令。
  • 命令的历史退出状态。您可能不想再次运行旧的成功命令。

安装

使用Homebrew安装(在macOS或Linux上)

  1. 安装 mcfly

    brew install mcfly
    
  2. 将以下内容添加到您的 ~/.bashrc~/.zshrc~/.config/fish/config.fish 文件末尾

    Bash

    eval "$(mcfly init bash)"
    

    Zsh

    eval "$(mcfly init zsh)"
    

    Fish

    mcfly init fish | source
    
  3. 运行 . ~/.bashrc / . ~/.zshrc / source ~/.config/fish/config.fish 或重启您的终端模拟器。

使用Homebrew卸载

  1. 删除 mcfly
    brew uninstall mcfly
    
  2. 删除您添加到 ~/.bashrc / ~/.zshrc / ~/.config/fish/config.fish 的行。

使用MacPorts安装(在macOS上)

  1. 更新ports树

    sudo port selfupdate
    
  2. 安装 mcfly

    sudo port install mcfly
    
  3. 将以下内容添加到您的 ~/.bashrc~/.zshrc~/.config/fish/config.fish 文件末尾,根据需要

    Bash

    eval "$(mcfly init bash)"
    

    Zsh

    eval "$(mcfly init zsh)"
    

    Fish

    mcfly init fish | source
    
  4. 运行 . ~/.bashrc / . ~/.zshrc / source ~/.config/fish/config.fish 或重启您的终端模拟器。

使用MacPorts卸载

  1. 删除 mcfly
    sudo port uninstall mcfly
    
  2. 删除您添加到 ~/.bashrc / ~/.zshrc / ~/.config/fish/config.fish 的行。

使用我们的安装脚本安装(macOS或Linux)

  1. curl -LSfs https://raw.githubusercontent.com/cantino/mcfly/master/ci/install.sh | sh -s -- --git cantino/mcfly(如果当前用户没有权限编辑 /usr/local/bin,则使用 sudo sh -s。)

  2. 将以下内容分别添加到您的 ~/.bashrc~/.zshrc~/.config/fish/config.fish 文件末尾

    Bash

    eval "$(mcfly init bash)"
    

    Zsh

    eval "$(mcfly init zsh)"
    

    Fish

    mcfly init fish | source
    
  3. 运行 . ~/.bashrc / . ~/.zshrc / source ~/.config/fish/config.fish 或重启您的终端模拟器。

从GitHub手动安装(macOS或Linux)

  1. GitHub的最新发布版下载。

  2. mcfly安装到您的$PATH中。 (例如,您可以在~/bin中创建一个目录,将mcfly复制到该位置,并将export PATH="$PATH:$HOME/bin"添加到您的 .bashrc / .zshrc,或者为fish运行set -Ua fish_user_paths "$HOME/bin"。)

  3. 将以下内容分别添加到您的 ~/.bashrc~/.zshrc~/.config/fish/config.fish 文件末尾

    Bash

    eval "$(mcfly init bash)"
    

    Zsh

    eval "$(mcfly init zsh)"
    

    Fish

    mcfly init fish | source
    
  4. 运行 . ~/.bashrc / . ~/.zshrc / source ~/.config/fish/config.fish 或重启您的终端模拟器。

从源代码手动安装(macOS、Linux或Windows)

  1. 安装Rust 1.40或更高版本

  2. 运行 git clone https://github.com/cantino/mcflycd mcfly

  3. 运行 cargo install --path .

  4. 确保 ~/.cargo/bin 在您的 $PATH 中。

  5. 将以下内容分别添加到 ~/.bashrc~/.zshrc~/.config/fish/config.fish 或 PowerShell 的 $PROFILE 的末尾。

    Bash

    eval "$(mcfly init bash)"
    

    Zsh

    eval "$(mcfly init zsh)"
    

    Fish

    mcfly init fish | source
    

    Powershell Core (pwsh)

    Invoke-Expression -Command $(mcfly init powershell | out-string)
    
  6. 运行 . ~/.bashrc / . ~/.zshrc / source ~/.config/fish/config.fish / . $PROFILE 或重新启动您的终端模拟器。

通过 Zinit 安装

  • 将以下代码添加到您的 zshrc。

    zinit ice lucid wait"0a" from"gh-r" as"program" atload'eval "$(mcfly init zsh)"'
    zinit light cantino/mcfly
    
  • 它将为您下载 mcfly 并进行安装。

  • $(mcfly init zsh) 将在提示符后执行

iTerm2

为了避免 McFly 的 UI 混淆您在 iTerm2 中的滚动历史记录,请确保此选项未被选中

iterm2 UI instructions

导出历史记录

McFly 可以将命令历史记录导出到 stdout

例如

mcfly dump --since '2023-01-01' --before '2023-09-12 09:15:30'

将导出从 2023-01-01 00:00:00.02023-09-12 09:15:30不包括)执行的命令,以 json 格式。您也可以通过 --format csv 指定 csv 作为导出格式。

导出命令中的每个项目都有以下字段

  • cmd: 运行的命令。
  • when_run: 命令运行的时间,使用您当地的时区。

您可以在没有任何参数的情况下导出所有命令历史记录

mcfly dump

时间戳格式

McFly 使用 chrono-systemd-time-ng 解析时间戳。

chrono-systemd-time-ngsystemd.time 的非严格实现,有以下例外

  • 时间单位 必须 伴随所有时间跨度值。
  • 不支持时区后缀。
  • 不支持星期几的前缀。

McFly 的用户只需要了解 时间戳中指定时区是不允许的。McFly 总是使用您的 本地时区

有关更多详细信息,请参阅 chrono-systemd-time-ng 文档

正则表达式

导出 支持使用正则表达式过滤命令。正则表达式语法遵循 crate regex

例如

mcfly dump -r '^cargo run'

将导出所有以 cargo run 开头的命令。

您可以使用 -r/--regex 和时间选项同时使用。

例如

mcfly dump -r '^cargo run' --since '2023-09-12 09:15:30'

将导出自 2023-09-12 09:15:30 运行以来所有以 cargo run 开头的命令。

设置

可以通过环境变量设置多个设置。要设置设置,您应该在 ~/.bashrc / ~/.zshrc / ~/.config/fish/config.fish 中添加以下片段。

浅色模式

为了在浅色终端中使用,设置环境变量MCFLY_LIGHT来切换颜色方案。

bash / zsh

export MCFLY_LIGHT=TRUE

fish

set -gx MCFLY_LIGHT TRUE

powershell

$env:MCFLY_LIGHT = "TRUE"

提示:在 macOS 上,您可以使用以下代码片段来根据系统设置配置颜色方案

bash / zsh

if [[ "$(defaults read -g AppleInterfaceStyle 2&>/dev/null)" != "Dark" ]]; then
    export MCFLY_LIGHT=TRUE
fi

VIM 键盘方案

默认情况下,Mcfly 使用受 emacs 启发的键盘方案。如果您想切换到受 vim 启发的键盘方案,请设置环境变量 MCFLY_KEY_SCHEME

bash / zsh

export MCFLY_KEY_SCHEME=vim

fish

set -gx MCFLY_KEY_SCHEME vim

powershell

$env:MCFLY_KEY_SCHEME="vim"

模糊搜索

要启用模糊搜索,将 MCFLY_FUZZY 设置为整数。0 表示关闭;更高的数字倾向于较短的匹配。目前 2-5 范围内的值可以得到不错的结果;尝试几个并 报告最适合您的方法

bash / zsh

export MCFLY_FUZZY=2

fish

set -gx MCFLY_FUZZY 2

powershell

$env:MCFLY_FUZZY=2

结果计数

要更改显示的最大结果数,设置 MCFLY_RESULTS(默认:10)。

bash / zsh

export MCFLY_RESULTS=50

fish

set -gx MCFLY_RESULTS 50

powershell

$env:MCFLY_RESULTS=50

不确认删除

要取消确认删除,将 MCFLY_DELETE_WITHOUT_CONFIRM 设置为 true。

bash / zsh

export MCFLY_DELETE_WITHOUT_CONFIRM=true

fish

set -gx MCFLY_DELETE_WITHOUT_CONFIRM true

powershell

$env:MCFLY_DELETE_WITHOUT_CONFIRM="true"

界面视图

要更改界面视图,设置 MCFLY_INTERFACE_VIEW(默认:TOP)。可用选项:TOPBOTTOM

bash / zsh

export MCFLY_INTERFACE_VIEW=BOTTOM

fish

set -gx MCFLY_INTERFACE_VIEW BOTTOM

powershell

$env:MCFLY_INTERFACE_VIEW="BOTTOM"

禁用菜单界面

要禁用菜单界面,设置环境变量 MCFLY_DISABLE_MENU

bash / zsh

export MCFLY_DISABLE_MENU=TRUE

fish

set -gx MCFLY_DISABLE_MENU TRUE

powershell

$env:MCFLY_DISABLE_MENU=true

结果排序

要更改显示结果的排序,设置 MCFLY_RESULTS_SORT(默认:RANK)。可能的值:RANKLAST_RUN

bash / zsh

export MCFLY_RESULTS_SORT=LAST_RUN

fish

set -gx MCFLY_RESULTS_SORT LAST_RUN

powershell

$env:MCFLY_RESULTS_SORT="LAST_RUN"

自定义提示

要更改提示,设置 MCFLY_PROMPT(默认:$)。

bash / zsh

export MCFLY_PROMPT=""

fish

set -gx MCFLY_PROMPT ""

powershell

$env:MCFLY_PROMPT=">"

请注意,只允许单字符提示。将 MCFLY_PROMPT 设置为 "<str>" 将将其重置为默认提示。

数据库位置

McFly 在 OS 的标准位置存储其 SQLite 数据库。在 OS X 上,它位于 ~/Library/Application Support/McFly,在 Linux 上位于 $XDG_DATA_DIR/mcfly/history.db(默认为 ~/.local/share/mcfly/history.db),在 Windows 上是 %LOCALAPPDATA%\McFly\data\history.db。对于旧版本支持,如果存在 ~/.mcfly/,则使用它。

启动缓慢

如果您有一个非常大的历史数据库,并且您注意到 McFly 启动缓慢,可以将 MCFLY_HISTORY_LIMIT 设置为类似 10000 的值,以限制搜索时考虑的记录数。在这个例子中,Mcfly 将仅搜索最新的 10,000 条记录。

Bash TIOCSTI

从 Linux 内核版本 6.2 开始,一些系统已禁用 TIOCSTI(McFly 之前用来写入选定命令的功能)。McFly 通过使用两个“虚拟”键绑定来解决这个问题,默认为 ctrl-x 1ctrl-x 2。如果您将其中任何一个用于其他目的,您可以分别设置 MCFLY_BASH_SEARCH_KEYBINDINGMCFLY_BASH_ACCEPT_LINE_KEYBINDING,使其指向您不使用的键。如果您希望使用传统的 TIOCSTI 行为,您可以通过将系统上的 sysctl 变量 dev.tty.legacy_tiocsti 设置为 1 来启用它,并将 bash 变量 MCFLY_BASH_USE_TIOCSTI 设置为 1

HISTTIMEFORMAT

McFly 当前不解析或使用 HISTTIMEFORMAT

可能未来的功能

  • 将屏幕录制添加到 README。
  • 学习常见命令选项并在建议 UI 中自动完成它们?
  • 在生成模板匹配字符串时对命令行参数进行排序。
  • 可能的优先级改进
    • 交叉验证和显式训练集选择。
    • 学习命令嵌入

开发

贡献

鼓励提交贡献和修复错误!但是,我们可能不会合并显著增加项目维护所需复杂性的 PR。如果您有疑问,请随时打开一个问题并询问。

运行测试

cargotest

发布(给 @cantino 的注意事项)

  1. 编辑 Cargo.toml 并提升版本。
  2. 编辑 CHANGELOG.txt
  3. 运行 cargo clippycargo fmt
  4. 重新编译(cargo build)并测试(cargo test
  5. gitadd -p
  6. gitci -m '提升到 vx.x.x'
  7. gittag vx.x.x
  8. gitpush origin head --tags
  9. 让构建完成。
  10. 编辑 Github 上的新版本。
  11. cargo发布
  12. TBD:更新 homebrew-core Formula 在 https://github.com/Homebrew/homebrew-core/blob/master/Formula/m/mcfly.rb

  1. 编辑 pkg/brew/mcfly.rb 并更新版本和 SHAs。(shasum -a 256 ...)
  2. 也编辑 ../homebrew-mcfly/pkg/brew/mcfly.rb
  3. cp pkg/brew/mcfly.rb../homebrew-mcfly/pkg/brew/mcfly.rb
  4. 与以下命令进行比较 diff ../homebrew-mcfly/pkg/brew/mcfly.rb ../mcfly/pkg/brew/mcfly.rb ; diff ../homebrew-mcfly/HomebrewFormula/mcfly.rb ../mcfly/HomebrewFormula/mcfly.rb
  5. gitadd -p && gitci -m '更新 homebrew' && gitpush
  6. cd../homebrew-mcfly&&git add-p&&git ci-m更新homebrew' &&git push&&cd../mcfly

依赖项

~40MB
~644K SLoC