如何实现按文件后缀筛选结果?

很多时候想对文件列表进行过滤,用后缀可以方便地筛选文件类型,比如使用 el$ 筛选出 el 文件。

我的想法是实现一个 orderless-literal-suffix,类似于自带的 orderless-literal-prefix,但是没有成功,能不能帮忙看看下面的实现哪儿有问题?或者有没有更好的办法

(defun orderless-literal-suffix (component)
  "Match COMPONENT as a literal suffix string."
  `(seq (literal ,component) eos))

(add-to-list 'orderless-affix-dispatch-alist (cons ?$ #'orderless-literal-suffix))

如果是在 find-file 時用 $ 會被轉成環境變量的值吧,換個關鍵字試試,例如用 ` (反引號)。

如果是過濾文件後輟,用 =.el 也可以吧,= 應用了 orderless-literal. 會當作普通字符,要求完全匹配 .el 几個字符,這應該就過濾了大部分文件了。

如果還存在 .elc , .eld 之類的,還可以再加個條件,如 =.el !.elc !.eld,將不想要的再進一步排除。

2 个赞

可以看看consult 的wiki里面例子 Home · minad/consult Wiki · GitHub

1 个赞

如果是 find-file

  1. 沒有添加 minad 配置的表現:

看了 @lwczzhiwu 分享的連結,我知道 \' 在 Emacs 的正則里可以表達 end of string [1],而 orderless 默認開啟了正則模式,所以也可以這麼寫:.el\'

不過奇怪的是在 consult-buffer 里,\' 并沒有生效,可能是因為 consult 加了額外的 tofu 隱藏字符导致的。

  1. 添加了 minad 的配置

但不管是否添加 minad 的配置,find-file$ 都是不能用的,minad 的配置只处理在 consult-buffer 時的 $


  1. 35.3.1.3 Backslash Constructs in Regular Expressions ↩︎

1 个赞

find-file默认的实现是把$当环境变量扩展符用了,不会用在regex上。如果你想改变这个行为,要自己实现一个read-file-name-internal函数,或者不要用find-file,用consult-fd写个wrapper就行了。

感谢各位的回复,换为绑定到 ' 这个字符上, find-file 能用已经解决我很大的问题了。