6 个版本 (3 个重大更改)

0.4.1 2023年12月29日
0.4.0 2023年12月28日
0.3.1 2020年12月8日
0.2.0 2019年1月16日
0.1.0 2019年1月7日

#128 in 操作系统

MIT 许可证

38KB
787

FREcency 跟踪 (fre)

fre 是一个用于跟踪最常使用的目录和文件的 CLI 工具。虽然受到了像 autojumpzshz 插件等工具的启发,但它采用了不同的跟踪和提供使用数据的方法。主要区别在于 fre 不支持跳跃。它只是跟踪和提供目录的排序方法,然后可以通过像 fzf 这样的其他应用程序进行筛选,后者在筛选方面做得更好。此外,它使用一种算法,其中每个目录的权重以指数方式衰减,因此最近使用的目录以平滑的方式获得更高的排名。

使用方法

fre 主要设计用于与 fzf 交互。对于一般使用,用户将创建一个 shell 钩子,每次当前目录更改时都会添加一个目录。这将开始构建最常使用目录的配置文件。然后,可以使用 fre 作为 fzf 的数据源。我个人使用 fzf 提供的控制-T 绑定,修改为使用 fre 作为输入。以下是一些示例。

基本用法

# Print directories, sorted by frecency, then pipe to fzf
fre --sorted | fzf --no-sort

# Print directories and their associated frecency, sorted by frecency
fre --stat

# Log a visit to a directory
fre --add /home/user/new_dir

# Decrease weight of a directory by 10 visits
fre --decrease 10 /home/user/too_high_dir

# Print directories and the time since they were last visited in hours
fre --stat --sort_method recent

# Print directories and the number of times they've been visited
fre --stat --sort_method frequent

# Purge directories that no longer exist
fre --sorted | while read dir ; do if [ ! -d "$dir" ] ; then fre --delete "$dir";  fi ; done

安装

从源码:git clone https://github.com/camdencheek/fre.git && cargo install --path ./fre

从软件包:cargo install fre

Arch Linux:yay -S fre

macOS:brew install camdencheek/brew/fre

为了与 fzf 的 CTRL-T 集成,请定义以下环境变量:

export FZF_CTRL_T_COMMAND='command fre --sorted'
export FZF_CTRL_T_OPTS='--tiebreak=index'

为了优先使用 fre 的结果,但回退到其他结果,我们可以在将结果发送到 fzf 之前使用 cat 来组合结果。我最喜欢的备选源是 fd (链接),但更常见的 find 也可以使用。以下选项首先使用 fre 的结果,然后使用当前目录的所有子目录,最后使用主目录中的所有子目录。这是我个人使用的。

export FZF_CTRL_T_COMMAND='command cat <(fre --sorted) <(fd -t d) <(fd -t d . ~)'
export FZF_CTRL_T_OPTS='--tiebreak=index'

Shell 集成

没有看到您的 shell?请随意提交 PR 来添加它!

zsh

(感谢 autojump)

fre_chpwd() {
  fre --add "$(pwd)"
}
typeset -gaU chpwd_functions
chpwd_functions+=fre_chpwd

bash

(感谢 autojump)

在您的 ~/.profile

PROMPT_COMMAND="${PROMPT_COMMAND:+$(echo "${PROMPT_COMMAND}" | awk '{gsub(/; *$/,"")}2') ; }"'fre --add "$(pwd)"'

与现有解决方案的比较

我熟悉且在功能上与此最接近的三个项目是 autojumpz shell 插件,以及 fasdd 部分(也许未来还有 f)。

与其他项目的主要区别在于,它依赖于像 fzf 这样的工具来提供任何可靠的目录跳转功能。这是一个有意的选择,坚持 Unix 哲学中的“只做一件事,做好一件事”。

与其他这些软件的主要不同之处在于用于对目录进行排名的算法。 autojump 使用以下公式


def add_path(data, path, weight=10):
    # ...
    data[path] = sqrt((data.get(path, 0) ** 2) + (weight ** 2))
    # ...

仔细观察,它似乎只是在计算一个三角形的斜边,其中一边是前一个权重的长度,另一边是正在添加的权重的长度。这根本不考虑访问时间已过去的时间,这不是很理想,因为我更愿意不将多年前的目录排名很高。

fasdz 都使用类似以下形式的频率函数

function frecent(rank, time) {
    dx = t-time
    if( dx < 3600 ) return rank*4
    if( dx < 86400 ) return rank*2
    if( dx < 604800 ) return rank/2
    return rank/4
}

这可以正常工作,直到您重新访问一个旧目录。然后,突然之间,dx 再次很小,并且所有以前的访问都被重新加权到 rank*4,导致它在排序输出中跳上来。这并不是很理想。我希望能够重新访问一个旧目录一次,而不会弄乱我的目录排名。

fre 使用一种频率算法,其中目录访问的权重随时间衰减。给定一个访问时间列表(粗体 x),目录的频率将类似于以下内容(使用 lambda 作为半衰期,“now”为计算时的当前时间)

通过一点数学魔法,我们实际上不需要存储访问时间向量。只要我们愿意不动态改变半衰期,我们就可以将一切压缩成一个数字。

该算法提供了一种更直观的频率实现,其结果往往更接近我们自然期望的结果。

支持

我在 MacOS 和 Linux 上经常使用它。我写它是为了在 Windows 上也能使用,但我没有对其进行任何测试。请自行承担风险。

稳定性

我已经使用这个工具超过一年,目前没有变化,它做到了我需要的一切。如果这不符合您的需求,我很乐意添加功能或接受更改。

关于算法

该算法将频率和最近使用概念结合成一个可排序的统计数据,称为“frecency”。据我所知,这个术语最初由Mozilla提出,用于描述他们的URL建议算法。实际上,Mozilla已经提出了几乎完全相同的算法,并考虑过使用它来替代Firefox的frecency算法。该算法与缓存替换问题也非常相似,关于其数学原理的更正式处理可以在这篇IEEE文章中找到(抱歉有付费墙)。

依赖关系

~3–13MB
~165K SLoC