【请教】consult-locate 中 mdfind使用方法

系统情况:GNU Emacs 28.2 , MacOS 12.6

我将consult-locate-args设置为mdfind -name

现test文件夹中通过创建4个内容为空的org文件,其文件名分别为:

  • apple_fruit.org
  • banana_香蕉_fruit.org
  • lemon_fruit.org
  • orange_橙子_fruit.org

当使用M-x consult-locate搜索包含fruit的org文件时,(假设电脑上只有这四个文件符合搜索条件)

第一种情况,输入fruit.org 或者 fruit org,搜索结果为:

  • apple_fruit.org
  • lemon_fruit.org

两个文件名字中包含中文字的文件没有显示在搜索结果中。

第二种情况,输入fruit kind:org时,则四个文件均显示在搜索结果中。

我想请教一下是什么导致这两种情况的区别? 是否有办法让第一种情况的搜索显示四个文件?

另附一些mdfind和spotlight的资料:

我这儿试了下没问题:

命令行也是正常的:

➜  ~ mdfind -name fruit.org | nl
2024-02-08 15:23:08.585 mdfind[60324:2667544] [UserQueryParser] Loading keywords and predicates for locale "en_US"
2024-02-08 15:23:08.585 mdfind[60324:2667544] [UserQueryParser] Loading keywords and predicates for locale "en"
     1	/Users/xcy/test/apple_fruit.org
     2	/Users/xcy/test/banana_香蕉_fruit.org
     3	/Users/xcy/test/lemon_fruit.org
     4	/Users/xcy/test/orange_橙子_fruit.org

大概率只和 mdfind 有关,可以先用命令行进行排查。我的系统语言是英文,但是应该不会分词吧?!

我在zsh中使用mdfind得到的还是不一样的结果。不知道可以通过什么方法去排查呢?

Evangeline@192 test % ls
apple_fruit.org		lemon_fruit.org
banana_香蕉_fruit.org	orange_橙子_fruit.org

Evangeline@192 test % mdfind -name fruit org
/Users/Evangeline/test/apple_fruit.org
/Users/Evangeline/test/lemon_fruit.org

Evangeline@192 test % mdfind -name fruit.org
/Users/Evangeline/test/apple_fruit.org
/Users/Evangeline/test/lemon_fruit.org

Evangeline@192 test % mdfind -name fruit kind:org
/Users/Evangeline/test/apple_fruit.org
/Users/Evangeline/test/banana_香蕉_fruit.org
/Users/Evangeline/test/orange_橙子_fruit.org
/Users/Evangeline/test/lemon_fruit.org

那这说明是 mdfind 的问题了,和 Emacs 无关。需要调查下 mdfind / Spotlight 的搜索匹配机制。

另外注意 mdfind -name fruit org 中,fruit-name 的参数,匹配文件名,但 orgquery,这两者不同。至于它们各自遵循什么规则 manpage 没有解释清楚,但是可以测试验证。

你可以尝试先调查清楚 -name 的作用,先不让 query 介入,即「为什么 mdfind -name fruit.org 搜索不到中文结果?」

➜  ~ mdfind -name fruit.org
2024-02-08 23:07:33.497 mdfind[61688:2735598] [UserQueryParser] Loading keywords and predicates for locale "en_US"
2024-02-08 23:07:33.498 mdfind[61688:2735598] [UserQueryParser] Loading keywords and predicates for locale "en"
/Users/xcy/test/apple_fruit.org
/Users/xcy/test/banana_香蕉_fruit.org
/Users/xcy/test/lemon_fruit.org
/Users/xcy/test/orange_橙子_fruit.org

另外,上面的日志一直提示这个搜索是 locale 相关的。

当我再创建一个文件orange_fruit.org_橙子.org。此时,我使用fruit.org搜索,结果中会出现这个新创建的文件。

这样试下来,就好像mdfind -name在中英文混杂的搜索中,不匹配中文字之后的字符一样。只要fruit 和 org出现在中文字符前面就可以被匹配到。

还有,mdfind -name只搜索文件名,且支持多个关键字搜索。比如,搜索mdfind -name fruit org orange ,即可得到刚刚新添加的文件orange_fruit.org_橙子.org。所以我觉得三个关键字都属于-name的参数。

hmm,我感到很迷惑。。。。

在zsh中执行locale可得:

Evangeline@evangelinedembp ~ % locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

好像是一些环境变量。不确定是否有关系。