如何在Emacs的find-file中应用dired的文件隐藏规则?
实现find-file复用dired的文件隐藏/排序规则
方法一:直接隐藏匹配文件
Emacs的补全系统支持通过completion-ignored-patterns变量忽略指定模式的文件,你可以直接复用已配置的dired-omit-files正则规则:
;; 将dired的忽略规则应用到find-file补全 (add-to-list 'completion-ignored-patterns dired-omit-files)
这条配置会让find-file的补全列表直接隐藏所有匹配dired-omit-files规则的文件,和dired中的效果一致。
方法二:无法隐藏时将匹配文件移至底部
如果某些补全系统不支持直接隐藏,或者你希望保留文件但放在列表末尾,可以自定义补全排序函数:
;; 定义排序函数:将匹配忽略规则的文件移至底部 (defun my-completion-sort-omit-files (a b) (let ((a-matches (string-match-p dired-omit-files a)) (b-matches (string-match-p dired-omit-files b))) (cond ;; 如果a匹配规则、b不匹配,a放后面 ((and a-matches (not b-matches)) nil) ;; 如果b匹配规则、a不匹配,a放前面 ((and (not a-matches) b-matches) t) ;; 都匹配或都不匹配时按字母顺序排序 (t (string< a b))))) ;; 将排序函数应用到文件类补全(包括find-file) (setq completion-category-overrides '((file (sort-function . my-completion-sort-omit-files))))
注意事项
- 如果你使用了Vertico、Icomplete等第三方补全框架,上述配置通常都能生效;
- 若要同时启用“优先隐藏,隐藏失败则排序”,可以先添加
completion-ignored-patterns配置,再设置排序函数作为兜底。
内容的提问来源于stack exchange,提问作者David Avarage
相关产品推荐
相关产品推荐

