今天看很多company的配置里,都把这个变量设置为nil,或者一个数。
我看了说明……但是我还是不明白,这个“循环”到底指的是啥?
今天看很多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 显示什么呢?!干掉,坚决干掉!
还没有验证,不过感觉我的猜想还蛮对的。
所以说我就是被这个cycle绕进里面去了……
另外我不知道的是……这里的“候选词“是 谁的 ……
这个变量并不是company设置的,而是自行设置的。但大家都会这么设置
验证过了,该变量确实是这意思。
候选词可能来自 buffer、abbr、snippet 或者补全后端,这点应该和 Vim 一样的。company 等不过是把这些收集,筛选,呈现出来。
该变量是 emacs 的出厂变量,默认就是 nil
。和 company 等补全插件关系还是挺大的,因为这个值可能之前被用户或者某插件改动过。当使用补全插件时,按个 tab 键,光标处和 minibuffer 同时出现候选词,会让绝大多数人感觉恼火。所以,作为补全插件作者,保证该值为 nil
是很正确的做法。
你是对的。感谢。
如果把那个值设置成t或者一个数的话,一旦候选词数量多于阈值,就会出现company和minibuffer同时显示候选词的状况……这真的很糟糕。
另外我试了,候选词来自于 completion-at-point-functions
……