Skip to content

/tpa 的 Tab 补全总是默认到第一个匹配项,而不是按输入前缀匹配 #27

@xiaoleaw

Description

@xiaoleaw

问题描述
在使用 /tpa <玩家名> 输入部分玩家名字时,Tab 补全总是默认补全为匹配列表中的第一个玩家,而不是根据我输入的前缀去补全到正确的玩家名字。

复现步骤
有两个在线玩家,例如 oaes 和 4ddd。

输入 /tpa oa 并按一次 Tab。

命令会变成 /tpa 4ddd,而不是 /tpa oaes。

再按一次 Tab 才会在 oaes 和 4ddd 之间循环切换。

预期行为
如果输入的前缀(不区分大小写)能够唯一匹配某个玩家名,按一次 Tab 应该直接补全成该玩家的完整名字。

示例:

/tpa oa → 按 Tab → /tpa oaes

/tpa m → 按 Tab → /tpa mt2u(如果 mt2u 是唯一匹配项)

运行环境
leaves-1.21.5 基于paper

插件版本:TPA 3.2.5

Java 版本:Java 17

补充说明
看起来当前 TabCompleter 的逻辑是直接返回所有在线玩家列表,并默认取列表中的第一个匹配项,而不是按前缀过滤。

建议调整补全逻辑,使用 startsWith 根据前缀筛选,并返回所有匹配项,这样在唯一匹配时可直接补全到目标玩家名。

参考代码示例
java
Copy
Edit
@OverRide
public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
if (args.length == 1) {
String prefix = args[0].toLowerCase(Locale.ROOT);
return Bukkit.getOnlinePlayers().stream()
.map(Player::getName)
.filter(name -> name.toLowerCase(Locale.ROOT).startsWith(prefix))
.sorted(String.CASE_INSENSITIVE_ORDER)
.collect(Collectors.toList());
}
return Collections.emptyList();
}
这样在只有一个匹配结果时,客户端会直接将其补全成完整玩家名;在有多个匹配时,会循环显示候选项。

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions