completion-cycle-threshold 是干啥用的 ?

今天看很多company的配置里,都把这个变量设置为nil,或者一个数。

我看了说明……但是我还是不明白,这个“循环”到底指的是啥?

来,让 emacs 描述下变量!

Documentation:
Number of completion candidates below which cycling is used.
Depending on this setting ‘completion-in-region’ may use cycling, like ‘minibuffer-force-complete’.
If nil, cycling is never used.
If t, cycling is always used.
If an integer, cycling is used so long as there are not more
completion candidates than this number.

读完文档大概清楚:该变量用来控制 minibuffer 的自动补全行为。当候选词数小于变量阀值时,在 minibuffer 显示候选词(cycle);大于阀值或者 nil 时,不显示。比如按某个键请求自动补全时,emacs 发现才一个候选词,那直接在光标处插入不就对了?还在 minibuffer 显示个鬼啊!

此处的 “cycle” 指的是在候选词间循环跳转,首尾相连。感觉和 yank ring 是同一种数据存储结构。

所以到这里,就能猜到为何 company 等补全前端为何要将 completion-cycle-threshold 设置为 nil。它们本身就能在光标处创建完成列表,还在 minibuffer 显示什么呢?!干掉,坚决干掉!

还没有验证,不过感觉我的猜想还蛮对的。:slight_smile:

1 个赞

所以说我就是被这个cycle绕进里面去了……

另外我不知道的是……这里的“候选词“是 谁的 ……

这个变量并不是company设置的,而是自行设置的。但大家都会这么设置

验证过了,该变量确实是这意思。

候选词可能来自 buffer、abbr、snippet 或者补全后端,这点应该和 Vim 一样的。company 等不过是把这些收集,筛选,呈现出来。

该变量是 emacs 的出厂变量,默认就是 nil。和 company 等补全插件关系还是挺大的,因为这个值可能之前被用户或者某插件改动过。当使用补全插件时,按个 tab 键,光标处和 minibuffer 同时出现候选词,会让绝大多数人感觉恼火。所以,作为补全插件作者,保证该值为 nil 是很正确的做法。

你是对的。感谢。

如果把那个值设置成t或者一个数的话,一旦候选词数量多于阈值,就会出现company和minibuffer同时显示候选词的状况……这真的很糟糕。

另外我试了,候选词来自于 completion-at-point-functions……