#文件 #端口 #Python #系统 #替换 #目录

bin+lib autojump

A Rust 版本的 autojump,可以作为直接替换

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 文件系统

GPL-3.0+

48KB
1K SLoC

autojump-rs Crates.io 版本 Crates.io 下载 Crates.io 许可证 GitHub 分支检查状态

将广泛使用的辅助应用程序 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功能,如自动补全,也应该可以正常工作。(除了jcjco;请参阅下面的内容。)

至于文本数据库,磁盘上的格式应该完全相同。(实际上在浮点数的表示上有一点差异,但这并不重要。)然而,由于作者正在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