On Sat, Nov 8, 2025 at 11:56 AM Hongyi Zhao <[email protected]> wrote:
>
> On Mon, Nov 3, 2025 at 4:06 AM Arash Esbati <[email protected]> wrote:
> >
> > Hongyi Zhao <[email protected]> writes:
> > > [...]
> > > 4. Is there a more elegant way to configure
> > > `completion-at-point-functions` itself to grant file completion higher
> > > priority in these specific command-argument contexts?
> >
> > This is my setup for the cape package:
> >
> > (use-package cape
> > :defer t
> > :init
> > (add-hook 'completion-at-point-functions #'cape-file 95)
> >
> > :custom
> > (cape-file-prefix '("file:" "./" "../" "~/"))
> >
> > :bind (:map corfu-map
> > ("C-c p f" . cape-file)))
> >
> > Not sure if it is an elegant way, but it works for me.
>
> Based on my tests, when typing ./ and ../, cape-file always displays
> the same list of filenames in the current directory,
In fact, when using `./`, `../`, or `~/` as the cape-file-prefix, they
all behave the same way as described above.
> but my following implementation doesn't have this issue:
>
> ```
> (defun my/file-path-annotation-function (cand)
> "An annotation function for file paths.
> Returns ' Dir' for directories and ' File' for files."
> (if (string-suffix-p "/" cand)
> " Dir"
> " File"))
>
> (defun my/smart-cape-file ()
> "A smart file completion backend that ONLY activates for path-like
> prefixes.
> In all other cases, it returns nil, allowing the completion chain to
> proceed.
> 它只在路径上下文中激活,并注入一个标注函数来提供丰富的'File/Dir'界面。"
> (interactive)
> (let* ((end (point))
> (start (save-excursion (re-search-backward "[ \t\n\\({]" nil t)))
> (start (if start (1+ start) (line-beginning-position)))
> ;; 我们计算出用户输入的前缀
> (prefix (buffer-substring-no-properties start end)))
>
> ;; 只有当这个前缀看起来像一个路径时 (以 ./ ../ ~/ / 开头),
> ;; 我们才返回一个 CAPF 指令。否则,我们返回 nil,保持沉默。
> (when (string-match-p "\\`\\(\\.\\.?/\\|~\\|/\\)" prefix)
> (list start end #'completion-file-name-table
> :annotation-function #'my/file-path-annotation-function))))
> ```
>
> > Best, Arash
>
> Regards,
> Zhao