原文:http://jeremymikkola.com/posts/2019_03_19_rules_for_autocomplete.html
翻译(0.1):
使用已知选项做文本的自动完成似乎是一件简单的事情,但是许多UI的文本自动完成都做错了。这种情况太频繁了,就不一一吐槽了,于是我专门写了这篇指南,可以看到他们都违反了哪些规则。
在许多情况下,下面的规则未必是最好的,但是一般是在有好的理由的情况下才应该打破规则(例如如果列表必须是像美国的州列表这样的固定列表时)。遵守下面这些规则总是可以带来预期的自动完成体验。
- 优先显示精确的匹配。如果用户输入完整的选项,其他匹配总是在它之后。
- 除了精确的匹配,接下来匹配前缀。例如输入“Fr”,我喜欢获得“Fresno”而不是“San Fracisco”。
- 在前缀匹配之后,选择子字符串匹配。如果一开始就做子字符串匹配总是错的,因为用户一般从开头开始输入字符,而不是中间。
- 如果子字符串没有匹配到,可选的可以做子序列匹配。子序列匹配一般只在少数情况下有效。
- 如果子序列匹配失败,则可以开始做近似匹配,提供近似匹配是必要的。
- 匹配必须根据字母典序排序。
- 有共同前缀的,短的排前面。
- 匹配应该是大小写敏感的。如果两个选项的差别只是大小写,越接近用户输入的排在前面。
- 选择选项的快捷键(例如在选项里搜索)应该和接受首选项的快捷键不同。除非你必须做某些动作后才使用建议的自动完成(例如使用方向键选择)。用户不应该为了不使用任何自动完成选项而做额外的操作。
- 如果当前有可自动完成选项,Tab键应该总是接受当前的自动完成选项。
- 如果自动完成选择是高亮的,按下确定键应该总是使用高亮选择的选项。永不应该返回去使用默认选项,即使自动完成列表只加载了部分。实际上,如果自动完成列表还在加载中,最好忽略确定键以免跳转到了错误的选项上。
- 没有获得焦点时,自动完成应该总是不响应按键。
- 自动完成的结果应该在100ms之内响应。
- 如果用户输入过快,则应该暂停自动完成,但是不要让用户中间输入的结果干扰用户结束输入时的结果。最好是等到用户输入结束后一次性显示最后的自动完成列表。(这是一条很主观的看法)
- 如果一个选项被高亮了,永远不要改变它的内容,即使加载了新的数据。
下面是一些在某些情况下适用的自动完成规则,但是在另外一些情况下不适用。
- 自动完成获得了焦点,如果不输入,则根据历史记录显示以前用过的选项
- 自动完成最近的前缀模糊匹配。如果输入“g”,匹配到了“Google”和“GoodReads”,应该自动匹配两个“o”字母,以允许我直接输入最近的“g”或者“d”选择我最需要的。
- 多部分匹配。在匹配路径的时候这个很有用,例如我可能输入“e/b/a”来自动完成“env/bin/acive”,ZSH在这方面做的很好。
- 递归匹配。由于自动完成有时候被用来快速的查看选项,有时候你需要做大致的匹配,然后在匹配结果里搜索或过滤。例如输入“.pdf”可以看到所有的PDF文件,我可以继续输入字符搜索,即使我现在输入的是之前输入过的。
- 拼写自动校正,对搜索引擎来说,这个很有用
- 别名匹配。当尝试做用户名的自动完成,用户的第一个或最后一个名字都应该被允许作为名字的匹配关键字。州名字缩略词也适合这种情况。
- 对自动完成结果添加必要的信息。例如你搜索一个函数名,你当然也希望看到函数的参数。
- 上下文感知建议。对代码或者单词的自动完成时,这个很有用。
- 允许回退,例如在接受了一个自动完成后输入了一些字符后,允许方便的回退。此时向上键总是有用的。
// 注:普通的自动完成相关相关的数据结构是Trie Tree:https://en.wikipedia.org/wiki/Trie