helm-mode 开启时,Eshell 中按 tab 补全结尾多一个空格

比如 cd Desk 再按 Tab 会得到 "cd Desktop/ "(结尾多加了一个空格),关掉 helm-mode 就没这个问题,尝试看过 helm-mode 代码,不知道这个空格是哪里来的,helm 用户有没有遇到这个问题?

试了下确实有这个问题。

之前给 Selectrum 做 completion-at-point 整合的时候遇到过这个问题,请参考:https://github.com/raxod502/selectrum/pull/89

大概就是说,补全后端可以根据不同的 exit-status 运行不同的后续操作。如果用 Emacs 默认的 UI,应该只有文件名不能再往后补的时候,exit-status 会是 finished,这时候后端会添一个空格上去。补了一级路径但还能往后补的时候应该是 exact

用第三方其他补全框架的时候,一般一次只会补全一级路径,这样如果你选的是列表里有的,exit-status 就会置为 finished。这在一般自动补全的任务中是合理的,因为补全一个符号以后一般不需要再往后补了。但补全路径的时候就会出现这种问题。所以我后来直接借用 read-file-name 的 UI 来一次补完整个路径,这样再添一个空格就合理了。

update: 好像没有正面回答题主问题。看了一下插空格的罪魁祸首应该是 comint--complete-file-name-data

1 个赞

虽然还是没彻底清楚怎么回事,但下面这个 Helm 选项可以解决问题:

(setq helm-mode-handle-completion-in-region nil)