Yayin Story Studio logo Yayin Story Studio 项目文档
回到主页 用户手册

Visindigo::General::CommandHost Class

class Visindigo::General::CommandHost

此类提供了一个命令主机,用于注册和管理命令处理程序. 详情...

头文件: #include <General/CommandHost.h>
自以下版本: Visindigo 0.13.0

公开成员函数

(自 Visindigo 0.13.0 引入) ~CommandHost()
(自 Visindigo 0.13.0 引入) QStringList completeCommand(const QString &commandLine)
(自 Visindigo 0.13.0 引入) Visindigo::General::CommandHandler *getCommandHandler(const QString &commandName)
(自 Visindigo 0.13.0 引入) QStringList getCommandHistory(const QString &startWith = "") const
(自 Visindigo 0.13.0 引入) QString getLastCommand() const
(自 Visindigo 0.13.0 引入) qsizetype getMaxCommandHistorySize() const
(自 Visindigo 0.13.0 引入) QStringList getRegisteredCommandNames() const
(自 Visindigo 0.13.0 引入) bool isCommandRegistered(Visindigo::General::CommandHandler *handler)
(自 Visindigo 0.13.0 引入) void registerCommand(Visindigo::General::CommandHandler *handler)
(自 Visindigo 0.13.0 引入) void setMaxCommandHistorySize(qsizetype size)
(自 Visindigo 0.13.0 引入) void setStdInListeningEnabled(bool enabled)
(自 Visindigo 0.13.0 引入) void unregisterCommand(Visindigo::General::CommandHandler *handler)

公开槽函数

(自 Visindigo 0.13.0 引入) void executeCommand(const QString &commandLine)

静态公开成员

(自 Visindigo 0.13.0 引入) Visindigo::General::CommandHost *getInstance()

详细说明

Note: 这是一个从旧版Visindigo继承下来的功能(VICore/VICommand),但已经重新实现,因此行为和接口与旧版 有所不同。建议用户参考本类的文档和示例代码,以了解如何使用新版本。

命令主机是一个单例类,负责维护所有注册的命令处理程序,并提供执行命令的接口。

命令格式

Visindigo将命令格式分为两类:匿名参数命令和具名参数命令。 匿名参数命令的格式为:

commandName arg1 arg2 ...

具名参数命令的格式为:

commandName -key value -key value

在具名参数命令中,参数以键值对的形式出现,键以短横线(-)开头,后跟对应的值。 Visindigo不支持某些命令格式中的纯标志设置语法(如–flag),所有具名参数都必须有对应的值。

Visindigo允许混用具名参数和匿名参数,也不要求参数的前后顺序,因为Visindigo这样解析命令: 如果一个参数以短横线开头,则将其视为具名参数的键,后续的参数直到下一个空格之前都视为该键的值。 而在任何值之后的参数都视为匿名参数,直到再次遇到可以视为键名(即以短横线开头)的参数为止。 例如,在以下命令中:

commandName -key1 value1 arg1 -key2 value2 arg2 arg3

Visindigo会将-key1和value1解析为具名参数,将arg1解析为匿名参数,然后将-key2和value2解析为另一个具名参数,最后将arg2和arg3解析为匿名参数。

不过,这样的写法可能会降低命令的可读性,我们仍然建议用户将具名参数和匿名参数分开书写,以提高命令的清晰度和可维护性。

对于开发者而言,具名参数和匿名参数在CommandHandler的onCommand 和 onComplete 方法中分别通过namedArgs 和unnamedArgs 参数传递。 它们分别对应于QMap<QString, QString> 类型的具名参数和QStringList 类型的匿名参数。因此匿名参数是有序的,而具名参数则是无序的。

如果参数中要出现空格,则整个参数都必须用引号括起来。(这与Windows Batch不同,在bat中你可以只在空格处用引号, 比如arg" "withspace,但在Visindigo中你必须使用"arg withspace"这种形式。),同样的,如果参数头部要出现短横线, 也必须使用引号括起来以避免被误解析为具名参数的键名。要使用引号本身,请在引号前加反斜杠进行转义,例如:"。

命令名和别名

Visindigo中的每个命令处理程序都有一个唯一的命令名(command name),用于标识该命令。 此外,命令处理程序还可以有一个或多个别名(alias),这些别名也是用于标识该命令的有效名称。 但是,所有命令名和别名在整个命令主机中必须是唯一的,不能重复注册。如果注册命令时发现 命令名已被占用,则注册将失败,命令处理程序仍然保持未注册状态。

但重复的别名不影响注册本身,只是后来者的别名将无法使用,因为命令主机会优先匹配最先注册的命令处理程序。

命名建议

Visindigo命令处理框架的灵感来源于Minecraft的命令系统,因此在命令命名方面,我们推荐遵循 Minecraft插件社区大部分作品所采用的一种不成文的规则:

  • 1. 命令名应和插件名(或功能模块名)相关联并尽量采取全名。如果插件名为TianyuAreaManager, 则命令名应为tianyareamanager,而不是tam或tamgr
  • 2. 命令名(包括别名和命令解析)应全部采用小写字母,也不需要任何连字符或下划线。
  • 3. 命令名尽量避免使用缩写,除非该缩写已经被广泛接受和使用(例如,cfg代表config)。
  • 4. 命令名缩写的形式,例如,假设AdvancedCfg插件的作者是Visindigo团队, 则可以使用viac作为advancedcfg命令的别名。

监听stdin和多线程

Visindigo的命令主机默认并不监听标准输入(stdin),因此用户无法直接在控制台中输入命令。 如果需要启用stdin监听功能,请参考setStdInListeningEnabled 方法的说明。

除了stdin之外,在很多情况下命令执行可能需要在其他线程中进行或调用,而 CommandHost只在主线程中执行命令处理程序的onCommand 和onComplete 方法,也只在 主线程实现命令解析。不过为了方便起见,executeCommand方法被置为了槽函数,使得 用户可以通过Qt的信号槽机制在其他线程中调用它来执行命令。但它本身仍然只在主线程中执行。

命令提示和自动补全

Visindigo的命令主机支持命令提示和自动补全功能,这些功能通过CommandHandler的onComplete 方法实现。 onComplete 方法接受与onCommand 方法相同的参数,但返回一个QStringList,表示可能的补全选项。

而调用者可以通过CommandHost的completeCommand 方法来获取补全选项。 这对于实现命令行界面(CLI)或集成开发环境(IDE)中的命令补全功能非常有用。

错误处理

Visindigo的命令主机提供了基本的错误处理机制,通过CommandHost的getLastError 方法获取最后一次命令执行的错误信息。 如果executeCommand 方法返回false,则可以调用getLastError 方法获取详细的错误信息, 有关Visindigo::General::CommandErrorData 类的说明,请参考相应的文档。

成员函数文档

[noexcept, since Visindigo 0.13.0] CommandHost::~CommandHost()

销毁命令主机实例。 没有任何情况需要手动调用此函数,它应与应用程序保持相同的生命周期。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] QStringList CommandHost::completeCommand(const QString &commandLine)

根据部分命令行字符串获取可能的命令补全选项。

commandLine 部分命令行字符串。

return 可能的补全选项字符串列表。

这个function 从 Visindigo 0.13.0 开始支持。

[slot, since Visindigo 0.13.0] void CommandHost::executeCommand(const QString &commandLine)

执行一个命令行字符串。

commandLine 要执行的命令行字符串。

此函数为了便于跨线程调用而置为槽函数,因此没有返回值。 如果命令执行出现问题,则会通过errorOccurred 信号发出错误信息。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] Visindigo::General::CommandHandler *CommandHost::getCommandHandler(const QString &commandName)

根据命令名获取对应的命令处理程序。

commandName 要查找的命令名字符串。

如果找到对应的命令处理程序,则返回其指针;否则返回nullptr。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] QStringList CommandHost::getCommandHistory(const QString &startWith = "") const

startWith 可选的命令前缀字符串,如果提供,则只返回以此字符串开头的命令历史记录项。

return 命令历史记录的列表。

这个function 从 Visindigo 0.13.0 开始支持。

[static, since Visindigo 0.13.0] Visindigo::General::CommandHost *CommandHost::getInstance()

return 命令主机的单例实例。 如果实例尚未创建,则会创建一个新的实例。 return 命令主机的单例实例指针。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] QString CommandHost::getLastCommand() const

return 最后执行的命令。

如果没有命令被执行过,则返回一个空字符串。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] qsizetype CommandHost::getMaxCommandHistorySize() const

return 命令历史记录的最大大小。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] QStringList CommandHost::getRegisteredCommandNames() const

return 已注册命令名的字符串列表。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] bool CommandHost::isCommandRegistered(Visindigo::General::CommandHandler *handler)

检查一个命令处理程序是否已注册。

handler 要检查的命令处理程序指针。

return 如果命令处理程序已注册,则返回true;否则返回false。

CommandHandler的isEnabled方法本质是调用此函数。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] void CommandHost::registerCommand(Visindigo::General::CommandHandler *handler)

注册一个命令处理程序。

handler 要注册的命令处理程序指针。

如果命令处理程序的命令名已被占用,则注册将失败,命令处理程序仍然保持未注册状态。 各CommandHandler的enable方法本质是调用此函数。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] void CommandHost::setMaxCommandHistorySize(qsizetype size)

设置命令历史记录的最大大小。 当命令历史记录超过此大小时,最旧的命令将被删除。 size 命令历史记录的最大大小。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] void CommandHost::setStdInListeningEnabled(bool enabled)

启用或禁用标准输入(stdin)监听功能。

enabled 如果为true,则启用stdin监听;如果为false,则禁用stdin监听。

这个function 从 Visindigo 0.13.0 开始支持。

[since Visindigo 0.13.0] void CommandHost::unregisterCommand(Visindigo::General::CommandHandler *handler)

注销一个命令处理程序。

handler 要注销的命令处理程序指针。

CommandHandler的disable方法本质是调用此函数。

这个function 从 Visindigo 0.13.0 开始支持。