1 前言
目标: 在Eshell
中像在bash/zsh中使用fzf
那般搜索历史命令
2 fzf
我的主力Shell 是Eshell, 但是平时我也会用Zsh, 而fzf 是一个非常好用的命令行工具,用了fzf
搜索历史命令:
3 Eshell
我日常的操作基本都是在 Eshell 上面进行的,不过 Eshell 是没办法直接像 Bash 那样调用 fzf
来查找命令历史的,所以我希望把这个功能迁移到到Eshell 上面来。
我在 Emacs 使用的补全框架是 Ivy/Counsel
,它有一个 counsel-esh-history
的命令可以使用 Ivy
来搜索命令,但是没办法使用用户已经输入的内容来过滤命令,所以我就在自己折腾了一个
counsel-esh-history
命令。效果如下:
4 源代码
得益于 Ivy
强大的内置函数, 功能实现起来相当便利,完整代码如下:
|
|
代码不是很复杂, 主要功能是获取用户输入的命令, 然后把所有的历史命令读取出来,最后使用ivy-read
内置的ivy-completion-in-region-action
功能, 用用户的输入的命令与历史命令进行匹配, 由用户选择最终的命令.
ivy-read
是Emacs内置completing-read
的函数的强化, 关于ivy-read
具体用法可以参考文档ivy-read.
5 总结
最后, 我也顺便把代码分享到 Emacs社区, 而 manateelazycat也把这段代码的功能加入到aweshell, Oh yeah !