寻找共同维护者: 最近我没有太多时间来维护这个项目。如果有人愿意加入成为共同维护者,我将不胜感激!
McFly - 畅游你的shell历史记录
McFly用智能搜索引擎替换了你默认的ctrl-r
shell历史搜索,它会考虑你的工作目录和最近执行命令的上下文。McFly的建议通过一个小型神经网络实时进行优先级排序。
简而言之:一个升级版的ctrl-r
,其历史结果与你当前正在进行的工作高度相关。
特性
- 重新绑定
ctrl-r
,调出全屏反向历史搜索,通过小型神经网络进行优先级排序。 - 增强你的shell历史记录,在SQLite数据库中跟踪命令退出状态、时间戳和执行目录。
- 同时保留你的普通shell历史文件,以便你随时可以停止使用McFly。
- 全面支持Unicode。
- 包含一个简单的操作,可以从McFly数据库和你的shell历史文件中删除任何历史项目。
- 设计为可扩展,以便未来支持其他shell。
- 用Rust编写,因此快速且安全。
- 搜索时可以使用
%
匹配任意数量的字符。
优先级排序
McFly的关键特性是由实时运行的小型神经网络驱动的智能命令优先级排序。目标是让你想要运行的命令始终位于顶部建议之列。
在建议命令时,McFly会考虑以下因素:
- 你运行命令的目录。你可能会在将来的同一目录中再次运行该命令。
- 你在运行该命令之前输入的命令(即命令的执行上下文)。
- 你运行该命令的频率。
- 你最后一次运行该命令的时间。
- 你是否在McFly中之前选择过该命令。
- 命令的历史退出状态。你可能不想运行以前失败的命令。
安装
使用Homebrew安装(macOS或Linux)
-
安装
mcfly
:brew install mcfly
-
将以下内容添加到你的
~/.bashrc
、~/.zshrc
或~/.config/fish/config.fish
文件的末尾:Bash:
eval "$(mcfly init bash)"
Zsh:
eval "$(mcfly init zsh)"
Fish:
mcfly init fish | source
-
运行
. ~/.bashrc
/. ~/.zshrc
/source ~/.config/fish/config.fish
或重启你的终端模拟器。
使用Homebrew卸载
- 移除
mcfly
:brew uninstall mcfly
- 从
~/.bashrc
/~/.zshrc
/~/.config/fish/config.fish
中删除你添加的那些行。
使用MacPorts安装(macOS)
-
更新ports树
sudo port selfupdate
-
安装
mcfly
:sudo port install mcfly
-
根据情况,将以下内容添加到你的
~/.bashrc
、~/.zshrc
或~/.config/fish/config.fish
文件的末尾:Bash:
eval "$(mcfly init bash)"
Zsh:
eval "$(mcfly init zsh)"
Fish:
mcfly init fish | source
-
运行
. ~/.bashrc
/. ~/.zshrc
/source ~/.config/fish/config.fish
或重启你的终端模拟器。
使用MacPorts卸载
- 移除
mcfly
:sudo port uninstall mcfly
- 从
~/.bashrc
/~/.zshrc
/~/.config/fish/config.fish
中删除你添加的那些行。
使用我们的安装脚本安装(macOS或Linux)
-
curl -LSfs https://raw.githubusercontent.com/cantino/mcfly/master/ci/install.sh | sh -s -- --git cantino/mcfly
(如果当前用户没有权限编辑/usr/local/bin,则使用sudo sh -s
。) -
根据情况,将以下内容添加到你的
~/.bashrc
、~/.zshrc
或~/.config/fish/config.fish
文件的末尾:Bash:
eval "$(mcfly init bash)"
Zsh:
eval "$(mcfly init zsh)"
Fish:
mcfly init fish | source
-
运行
. ~/.bashrc
/. ~/.zshrc
/source ~/.config/fish/config.fish
或重启你的终端模拟器。
从GitHub手动安装(macOS或Linux)
-
安装到
$PATH
中的某个位置。(例如,你可以在~/bin
创建一个目录,将mcfly
复制到这个位置,然后在.bashrc
/.zshrc
中添加export PATH="$PATH:$HOME/bin"
,或者对于 fish shell 运行set -Ua fish_user_paths "$HOME/bin"
。) -
根据你使用的 shell,在
~/.bashrc
、~/.zshrc
或~/.config/fish/config.fish
的末尾添加以下内容:Bash:
eval "$(mcfly init bash)"
Zsh:
eval "$(mcfly init zsh)"
Fish:
mcfly init fish | source
-
运行
. ~/.bashrc
/. ~/.zshrc
/source ~/.config/fish/config.fish
或重启你的终端模拟器。
从源码手动安装(macOS、Linux 或 Windows)
-
运行
git clone https://github.com/cantino/mcfly
和cd mcfly
-
运行
cargo install --path .
-
确保
~/.cargo/bin
在你的$PATH
中。 -
根据你使用的 shell,在
~/.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)
-
运行
. ~/.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 中的滚动历史,请确保取消勾选以下选项:
导出历史记录
McFly 可以将命令历史导出到标准输出。
例如:
mcfly dump --since '2023-01-01' --before '2023-09-12 09:15:30'
将导出从 2023-01-01 00:00:00.0 到 2023-09-12 09:15:30(不包含)之间运行的命令,格式为 json。
你也可以通过 --format csv
指定导出格式为 csv。
导出的每条命令包含以下字段:
cmd
:运行的命令。when_run
:命令运行的时间(以你的本地时区为准)。
你可以不带任何参数导出所有命令历史:
mcfly dump
时间戳格式
McFly 使用 chrono-systemd-time-ng 解析时间戳。
chrono-systemd-time-ng 是 systemd.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
)。
可用选项:TOP
和BOTTOM
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)。
可选值为RANK
和LAST_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将其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 1
和ctrl-x 2
。如果你将其中任何一个用于其他目的,你可以分别设置MCFLY_BASH_SEARCH_KEYBINDING
和MCFLY_BASH_ACCEPT_LINE_KEYBINDING
为你没有使用的其他键。如果你更喜欢使用旧的TIOCSTI行为,你可以在系统上将sysctl
变量dev.tty.legacy_tiocsti
设置为1
,并将bash变量MCFLY_BASH_USE_TIOCSTI
设置为1
。
HISTTIMEFORMAT
McFly目前不解析或使用HISTTIMEFORMAT
。
可能的未来功能
- 在README中添加屏幕录像。
- 学习常用命令选项并在建议UI中自动完成它们?
- 在生成模板匹配字符串时对命令行参数进行排序。
- 可能的优先级改进:
- 交叉验证和显式训练集选择。
- 学习命令嵌入
开发
贡献
欢迎贡献和错误修复!然而,我们可能不会合并那些显著增加项目复杂性的PR。如果你有疑问,可以随时开一个issue询问。
运行测试
cargo test
发布(@cantino的注释)
- 编辑
Cargo.toml
并更新版本号。 - 编辑CHANGELOG.txt
- 运行
cargo clippy
和cargo fmt
。 - 重新编译(
cargo build
)并测试(cargo test
) git add -p
git ci -m 'Bumping to vx.x.x'
git tag vx.x.x
git push origin head --tags
- 等待构建完成。
- 在Github上编辑新的Release。
cargo publish
- 待定:更新homebrew-core Formula,地址:https://github.com/Homebrew/homebrew-core/blob/master/Formula/m/mcfly.rb 旧版:
- 编辑
pkg/brew/mcfly.rb
并更新版本号和SHA值。(使用shasum -a 256 ...
命令) - 同时也要编辑
../homebrew-mcfly/pkg/brew/mcfly.rb
。- 执行
cp pkg/brew/mcfly.rb ../homebrew-mcfly/pkg/brew/mcfly.rb
- 使用以下命令比较差异:
diff ../homebrew-mcfly/pkg/brew/mcfly.rb ../mcfly/pkg/brew/mcfly.rb ; diff ../homebrew-mcfly/HomebrewFormula/mcfly.rb ../mcfly/HomebrewFormula/mcfly.rb
- 执行
- 执行
git add -p && git ci -m 'Update homebrew' && git push
- 执行
cd ../homebrew-mcfly && git add -p && git ci -m 'Update homebrew' && git push && cd ../mcfly