很多时候想对文件列表进行过滤,用后缀可以方便地筛选文件类型,比如使用 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 个赞
如果是 find-file:
- 沒有添加 minad 配置的表現:
看了 @lwczzhiwu 分享的連結,我知道 \' 在 Emacs 的正則里可以表達 end of string ,而 orderless 默認開啟了正則模式,所以也可以這麼寫:.el\'
不過奇怪的是在 consult-buffer 里,\' 并沒有生效,可能是因為 consult 加了額外的 tofu 隱藏字符导致的。
- 添加了 minad 的配置
但不管是否添加 minad 的配置,find-file 時 $ 都是不能用的,minad 的配置只处理在 consult-buffer 時的 $。
1 个赞
find-file默认的实现是把$当环境变量扩展符用了,不会用在regex上。如果你想改变这个行为,要自己实现一个read-file-name-internal函数,或者不要用find-file,用consult-fd写个wrapper就行了。
感谢各位的回复,换为绑定到 ' 这个字符上, find-file 能用已经解决我很大的问题了。