增强匹配算法

你可以通过设置环境变量来启用增强匹配模式:

  1. export _ZL_MATCH_MODE=1

或者使用下面语句:

  1. eval "$(lua /path/to/z.lua --init bash enhanced)"

进行初始化,他们是等效的,记得把上面的 bash 可以根据你的 shell 改为 zsh 或者 posix

对于一个给定的正则关键字序列(即 z 命令后面的参数),只有同时满足两个条件才算匹配成功:

  1. 正则关键字将按顺序进行匹配(这条和默认匹配法相同)。
  2. 最后一个关键字可以和路径名的最后一段相匹配。

如果两条规则同时启用找不到任何结果,那么将会退回到只用规则 1 进行筛选,这两条规则是参考 fasd 引入的。

  • 匹配路径名的最后一段:

    假设数据库内容为:

    1. 10 /home/user/workspace
    2. 20 /home/user/workspace/project1
    3. 30 /home/user/workspace/project2
    4. 40 /home/user/workspace/project3

    在增强模式下使用 "z wo" 的话,只有 /home/user/work 满足匹配,因为按照第二条规则,这是唯一一条最有一段名称匹配 wo 的路径。

    因为最后一级目录名称总是最容易记住的,所以给到它比较高的优先级。在默认匹配算法中,你同样可以用 "z space$" 来达到相同的目的,但是 "z wo" 可以打更少的字。

    小技巧:

    • 如果你在增强匹配算法下,想让最后一个关键字不当匹配最后一段路径名,还可以像默认匹配算法中一样匹配路径的其他部分的话,你可以在最后加一个独立的 ‘$’ 参数,比如:"z wo $"
    • 如果你在增强匹配算法下,想让最后一个关键字匹配最后一段路径名以前的部分,那么可以增加一个斜杆参数,比如:"z wo /"
  • 如果没法匹配,同时又存在一条路径名和关键字相同,那么 cd 过去:

    有时候如果你输入:

    1. z foo

    但是数据库里又没有任何匹配 foo 的记录,然后却存在一个可以在当前位置访问的目录,刚好名字是 “foo”,那么 “z foo“ 的效果将会和下面的命令效果相同:

    1. cd foo

    因此,在增强匹配算法中,你总可以象 cd 命令一样使用 z 命令,而不必当心目标路径是否被记录过。

  • 忽略当前路径:

    如果你使用 z xxx 但是当前路径恰好是最佳匹配结果,那么 z.lua 会使用次优结果进行跳转。假设有如下数据:

    1. 10 /Users/Great_Wall/.rbenv/versions/2.4.1/lib/ruby/gems
    2. 20 /Library/Ruby/Gems/2.0.0/gems

    默认情况下,当我使用 z gems 时,我会被带到 /Library/Ruby/Gems/2.0.0/gems,因为它有更高权重,但是可能并不是我想要去的地方,这时我按一下方向键上键,再次执行 z gems,那么我就能被带到 /Users/Great_Wall/.rbenv/versions/2.4.1/lib/ruby/gems 目录中,而这正是我想去的地方。

    我当然可以每次使用z env gems 来精确指明,但是每当我输入 z xxx 我必然是想进行路径跳转的,而不是呆在原地,所以使用增强匹配模式,即便当前目录是最佳匹配,它也能懂得你想跳转的心思。

再我最初实现 z.lua 时,只有一个和 z.sh 类似的默认匹配算法,在网友的建议下,我陆续学习了来自 fasd / autojump 中的优秀理念,并加以完善改进,成为如今集三家之长的 “增强匹配算法” ,给它取个昵称,叫做 “更懂你的匹配算法”。