4 个版本 (破坏性更新)
0.5.1 | 2023年1月2日 |
---|---|
0.4.0 | 2019年7月27日 |
0.3.1 | 2017年12月10日 |
0.2.1 | 2016年12月13日 |
#544 in 文件系统
48KB
1K SLoC
autojump-rs
将广泛使用的辅助应用程序 autojump
移植到 Rust。
许可证
由于本项目在技术上是一个分支,许可证与 autojump
相同,即 GPL,版本 3 或任何后续版本。有关详细信息,请参阅 LICENSE。
安装
我们已经有了一段时间的预构建的二进制文件,感谢 trust 项目!
该包是 autojump
的直接替换。假设 autojump
已安装,或者至少其 shell 脚本部分已经正确设置,并且您在 $PATH
~/.cargo/bin
中在系统二进制位置之前,您只需将 您选择的架构的二进制文件 放到您的 PATH 中,覆盖原始的 autojump
脚本。
如果您不希望重新执行 shell,可能需要发出 hash -r
,以便 shell 忘记 autojump
的先前位置。
当然,手动克隆存储库并构建是可以的。
功能
为什么要在原始版本已经工作的同时进行移植?主要出于两个原因
- 作者对
autojump
在 Python 虚拟环境中的损坏感到非常厌烦, - Rust 仅仅是因为 CLI 应用程序而非常棒,它的性能和(代码)优雅!
确实,由于是用编译语言编写的,autojump-rs
在现代硬件上非常轻量。由于程序本身运行时间非常短,设置和关闭整个Python虚拟机的开销可能会很大,尤其是在性能较差的硬件上。使用autojump-rs
可以大大减少这种延迟。在作者的Core i7-2670QM笔记本电脑上,拥有1014个条目的目录数据库时,典型的运行时间如下。
$ time ./autojump/bin/autojump au
/home/xenon/src/autojump-rs
./autojump/bin/autojump au 0.09s user 0.01s system 99% cpu 0.103 total
$ time ./autojump-rs/target/release/autojump au
/home/xenon/src/autojump-rs
./autojump-rs/target/release/autojump au 0.00s user 0.00s system 87% cpu 0.007 total
在性能较低的硬件上,节省的时间更为明显,因为每节省一个周期都很重要。例如,在1.4GHz的龙芯3A3000处理器上运行时间为大约10ms,尽管时钟频率不同,但这个数字非常接近x86的结果。
当然,程序不再以任何方式与Python交互,因此与virtualenv相关的崩溃不再出现。再见了,那个令人头疼的ImportError
,在系统默认Python的虚拟环境中每次都会出现在$PS1
中显示!
# bye and you won't be missed!
Traceback (most recent call last):
File "/usr/lib/python-exec/python2.7/autojump", line 43, in <module>
from autojump_data import dictify
ImportError: No module named autojump_data
兼容性
现在已实现了所有的命令行标志和参数,并且与原始版本的行为完全相同。作为一个即插即用的替代品,其他shell功能,如自动补全,也应该可以正常工作。(除了jc
和jco
;请参阅下面的内容。)
至于文本数据库,磁盘上的格式应该完全相同。(实际上在浮点数的表示上有一点差异,但这并不重要。)然而,由于作者正在Linux上开发和使用这个程序,其他平台可能需要更多的关注,尽管使用的所有库都是跨平台的。(欢迎提交补丁!)
原始autojump
附带的Windows批处理文件中硬编码了Python,显然这与autojump-rs
不兼容。请使用windows
目录中的批处理文件;只需替换原始文件,并将autojump.exe
与其一起放入即可。(感谢@tomv564的Windows测试!)
话虽如此,与原始Python实现相比,还有一些我认为非常微小的差异。这些是:
-
参数处理和帮助信息。
原始
autojump
使用Python的argparse
来解析其参数。有一个Rust端口,但它并不像docopt.rs
库那样受欢迎,正如在crates.io
统计和GitHub活动所显示的那样。因此,至少需要重新排列帮助信息,因为docopt
家族的参数解析器要求它们具有特定的格式。然而,这不应该有任何问题,只是不同而已。再次强调,谁整天都在看使用说明屏幕呢?XD -
选择了不同的模糊匹配算法。
Python版本使用
difflib.SequenceMatcher
算法进行模糊匹配。由于它相当复杂,我选择使用strsim
库。分别计算每个文件名与查询针的最后一部分之间的Jaro-Winkler距离,并基于此过滤结果。 -
jc
可能会跳出当前目录。确切原因可能涉及不同的过滤逻辑,但我对此并不十分确定。这种行为在原始的
autojump
上也有所观察,但频率似乎较低,而且这两种实现实际上都没有检查目标是否位于当前目录下方。然而,我主要使用普通的j
,所以如果你高度依赖于jc
及其相关功能,请提交一个问题!
未来计划
鉴于平台支持基本令人满意,下一步将是进行更多重构和错误修复。在原始的 autojump
上也观察到了 jc
的行为差异,即在 $(pwd)
之外进行跳跃,但实际跳转到的目录不同;这需要进一步调查。甚至我想写一个 fasd
后端,但目前我没有那么多空闲时间。无论如何,欢迎贡献和错误报告!
依赖关系
~5–16MB
~205K SLoC