klish - 动态变量和完成
klish - dynamic variables and completion
我正在用 klish 编写 xml 文件。我想知道我们如何通过在 klish xml 文件中按 Tab 按钮来自动完成参数。对于例如我希望用户在 klish 命令行上输入启用或禁用,但如果用户按 'e' 和 tab,则自动启用应该完成,或者如果用户按 'd' 和 tab,则自动禁用应该来。
我通过用户在 klish 命令行上接收这些参数。
我们也可以在 klish xml 文件中定义宏,这样我就可以在 klish ACTION 标记中使用该宏,将该宏值作为参数传递给我的 c 文件
我的XML代码是这样的:-
<?xml version="1.0" encoding="UTF-8"?>
<CLISH_MODULE xmlns="http://clish.sourceforge.net/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://clish.sourceforge.net/XMLSchema
http://clish.sourceforge.net/XMLSchema/clish.xsd">
<!--=======================================================-->
<COMMAND name="show"
help="some utility commands for show"/>
<COMMAND name="show connection"
help="Show the connection">
<DETAIL>
connection status
</DETAIL>
<ACTION>c_file.c 1</ACTION>
</COMMAND>
<COMMAND name="show debugcount"
help="It will show enable core">
<DETAIL>
Enable core.
</DETAIL>
<PARAM name="module-name"
help="Specify the module name i.e. enable or disable"
ptype="STRING"/>
<ACTION>c_file.c 3 ${module-name}</ACTION>
</COMMAND>
正如我提到的,我希望自动完成一条语句,因此参数即
${modulename}
将启用或禁用,所以我想如果用户按 e 和 tab 然后自动启用,或者如果用户按 d 和 tab 然后自动禁用。
关于宏,正如您在标签中看到的那样,我正在传递值,即
<ACTION>c_file.c 1</ACTION>
到我的 c 文件但我想使用一些变量名或宏而不是值,所以它会像
<ACTION>c_file ${var} ${modulename}</ACTION>
其中 $var=1
经过大量研究终于成功实现了命令自动补全。
就像在我的示例中一样,我希望用户在命令行中输入启用或禁用。这可以通过以下 xml 文件来实现。只是我们必须在 xml 文件中使用 VAR 标签,对于宏也是如此。
<?xml version="1.0" encoding="UTF-8"?>
<CLISH_MODULE xmlns="http://clish.sourceforge.net/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://clish.sourceforge.net/XMLSchema
http://clish.sourceforge.net/XMLSchema/clish.xsd">
<!--=======================================================-->
<COMMAND name="show"
help="some utility commands for show"/>
<COMMAND name="show connection"
help="Show the connection">
<DETAIL>
connection status
</DETAIL>
<ACTION>c_file.c 1</ACTION>
</COMMAND>
<COMMAND name="show debugcount"
help="It will show enable core">
<DETAIL>
Enable core.
</DETAIL>
<PARAM name="module-name"
help="Specify the module name i.e. enable or disable"
ptype="STRING"
completion="${third_par}"/>
<ACTION>c_file.c 3 ${module-name}</ACTION>
<VAR name="third_par" help="enable/disable" value="enable disable"/>
</COMMAND>
我不确定上面的 XML 是否合式。似乎在当前的 clish.xsd
模式中,<VAR>
元素不再有效地位于 <COMMAND>
元素之下。事实上,<VAR>
元素根本没有有效位置。
验证:xmllint -schema /path/to/latest/clish.xsd --noout /path/to/your/file.xml
您会注意到 <VAR>
的存在将使 XML 对架构无效。
下面是 <COMMAND>
元素架构:
<xs:complexType name="command_t">
<xs:sequence>
<xs:element ref="DETAIL" minOccurs="0"/>
<xs:element ref="PARAM" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="CONFIG" minOccurs="0"/>
<xs:element ref="ACTION" minOccurs="0"/>
</xs:sequence>
<xs:attributeGroup ref="menu_item_g"/>
<xs:attribute name="ref" type="xs:string" use="optional"/>
<xs:attribute name="view" type="xs:string" use="optional"/>
<xs:attribute name="viewid" type="xs:string" use="optional"/>
<xs:attribute name="access" type="xs:string" use="optional"/>
<xs:attribute name="args" type="xs:string" use="optional"/>
<xs:attribute name="args_help" type="xs:string" use="optional"/>
<xs:attribute name="escape_chars" type="xs:string"
use="optional"/>
<xs:attribute name="lock" type="bool_t" use="optional"
default="true"/>
<xs:attribute name="interrupt" type="bool_t" use="optional"
default="false"/>
</xs:complexType>
基本上,在 COMMAND 中指定应该按以下顺序:
- 详情
- 参数
- 配置
- 操作
因此,如果您将 DETAIL 放在 PARAM 之后,它对架构无效。我指的是 klish git repo 中的以下 clish.xsd
架构版本:
Author: Serj Kalichev <serj.kalichev@gmail.com>
Date: Fri Dec 15 18:03:53 2017 +0300
Version 2.1.4
关于完成。有几种方法可以实现它。
第一种方式是这样的:
<PARAM name="module-name"
help="Specify the module name i.e. enable or disable"
ptype="STRING"
completion="enable disable"/>
它很简单但并不严格,即用户可以输入 "enable/disable" 以外的其他内容。
第二种方法是 PTYPE 方法="select":
<PTYPE name="BOOL" method="select" pattern="true(1) false(0)" help="Boolean choice"/>
这种方式很严格。自动完成将显示 "true/false" 但用户将在 ACTION 中获得值为“1/0”的相应 PARAM。但是你可以使用 pattern="true(true) false(false)" 在 ACTION.
中得到 "true" 或者 "false"
第三种方式是切换:
<PARAM name="choose" help="switch example" mode="switch" ptype="SWITCH">
<PARAM name="enable" help="Enable" ptype="SUBCOMMAND" mode="subcommand"/>
<PARAM name="disable" help="Disable" ptype="SUBCOMMAND" mode="subcommand"/>
</PARAM>
很严格。用户必须仅选择(输入)"switch" PARAM.
内的 PARAM 之一
关于 VARs...klish 中的 VARs 是全球性的。所以它可以在没有 COMMAND 标签或 VIEW 标签的情况下出现。将其与 "VIEW" 标签放在同一层级。
我正在用 klish 编写 xml 文件。我想知道我们如何通过在 klish xml 文件中按 Tab 按钮来自动完成参数。对于例如我希望用户在 klish 命令行上输入启用或禁用,但如果用户按 'e' 和 tab,则自动启用应该完成,或者如果用户按 'd' 和 tab,则自动禁用应该来。 我通过用户在 klish 命令行上接收这些参数。
我们也可以在 klish xml 文件中定义宏,这样我就可以在 klish ACTION 标记中使用该宏,将该宏值作为参数传递给我的 c 文件
我的XML代码是这样的:-
<?xml version="1.0" encoding="UTF-8"?>
<CLISH_MODULE xmlns="http://clish.sourceforge.net/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://clish.sourceforge.net/XMLSchema
http://clish.sourceforge.net/XMLSchema/clish.xsd">
<!--=======================================================-->
<COMMAND name="show"
help="some utility commands for show"/>
<COMMAND name="show connection"
help="Show the connection">
<DETAIL>
connection status
</DETAIL>
<ACTION>c_file.c 1</ACTION>
</COMMAND>
<COMMAND name="show debugcount"
help="It will show enable core">
<DETAIL>
Enable core.
</DETAIL>
<PARAM name="module-name"
help="Specify the module name i.e. enable or disable"
ptype="STRING"/>
<ACTION>c_file.c 3 ${module-name}</ACTION>
</COMMAND>
正如我提到的,我希望自动完成一条语句,因此参数即
${modulename}
将启用或禁用,所以我想如果用户按 e 和 tab 然后自动启用,或者如果用户按 d 和 tab 然后自动禁用。
关于宏,正如您在标签中看到的那样,我正在传递值,即
<ACTION>c_file.c 1</ACTION>
到我的 c 文件但我想使用一些变量名或宏而不是值,所以它会像
<ACTION>c_file ${var} ${modulename}</ACTION>
其中 $var=1
经过大量研究终于成功实现了命令自动补全。 就像在我的示例中一样,我希望用户在命令行中输入启用或禁用。这可以通过以下 xml 文件来实现。只是我们必须在 xml 文件中使用 VAR 标签,对于宏也是如此。
<?xml version="1.0" encoding="UTF-8"?>
<CLISH_MODULE xmlns="http://clish.sourceforge.net/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://clish.sourceforge.net/XMLSchema
http://clish.sourceforge.net/XMLSchema/clish.xsd">
<!--=======================================================-->
<COMMAND name="show"
help="some utility commands for show"/>
<COMMAND name="show connection"
help="Show the connection">
<DETAIL>
connection status
</DETAIL>
<ACTION>c_file.c 1</ACTION>
</COMMAND>
<COMMAND name="show debugcount"
help="It will show enable core">
<DETAIL>
Enable core.
</DETAIL>
<PARAM name="module-name"
help="Specify the module name i.e. enable or disable"
ptype="STRING"
completion="${third_par}"/>
<ACTION>c_file.c 3 ${module-name}</ACTION>
<VAR name="third_par" help="enable/disable" value="enable disable"/>
</COMMAND>
我不确定上面的 XML 是否合式。似乎在当前的 clish.xsd
模式中,<VAR>
元素不再有效地位于 <COMMAND>
元素之下。事实上,<VAR>
元素根本没有有效位置。
验证:xmllint -schema /path/to/latest/clish.xsd --noout /path/to/your/file.xml
您会注意到 <VAR>
的存在将使 XML 对架构无效。
下面是 <COMMAND>
元素架构:
<xs:complexType name="command_t">
<xs:sequence>
<xs:element ref="DETAIL" minOccurs="0"/>
<xs:element ref="PARAM" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="CONFIG" minOccurs="0"/>
<xs:element ref="ACTION" minOccurs="0"/>
</xs:sequence>
<xs:attributeGroup ref="menu_item_g"/>
<xs:attribute name="ref" type="xs:string" use="optional"/>
<xs:attribute name="view" type="xs:string" use="optional"/>
<xs:attribute name="viewid" type="xs:string" use="optional"/>
<xs:attribute name="access" type="xs:string" use="optional"/>
<xs:attribute name="args" type="xs:string" use="optional"/>
<xs:attribute name="args_help" type="xs:string" use="optional"/>
<xs:attribute name="escape_chars" type="xs:string"
use="optional"/>
<xs:attribute name="lock" type="bool_t" use="optional"
default="true"/>
<xs:attribute name="interrupt" type="bool_t" use="optional"
default="false"/>
</xs:complexType>
基本上,在 COMMAND 中指定应该按以下顺序:
- 详情
- 参数
- 配置
- 操作
因此,如果您将 DETAIL 放在 PARAM 之后,它对架构无效。我指的是 klish git repo 中的以下 clish.xsd
架构版本:
Author: Serj Kalichev <serj.kalichev@gmail.com>
Date: Fri Dec 15 18:03:53 2017 +0300
Version 2.1.4
关于完成。有几种方法可以实现它。 第一种方式是这样的:
<PARAM name="module-name"
help="Specify the module name i.e. enable or disable"
ptype="STRING"
completion="enable disable"/>
它很简单但并不严格,即用户可以输入 "enable/disable" 以外的其他内容。
第二种方法是 PTYPE 方法="select":
<PTYPE name="BOOL" method="select" pattern="true(1) false(0)" help="Boolean choice"/>
这种方式很严格。自动完成将显示 "true/false" 但用户将在 ACTION 中获得值为“1/0”的相应 PARAM。但是你可以使用 pattern="true(true) false(false)" 在 ACTION.
中得到 "true" 或者 "false"第三种方式是切换:
<PARAM name="choose" help="switch example" mode="switch" ptype="SWITCH">
<PARAM name="enable" help="Enable" ptype="SUBCOMMAND" mode="subcommand"/>
<PARAM name="disable" help="Disable" ptype="SUBCOMMAND" mode="subcommand"/>
</PARAM>
很严格。用户必须仅选择(输入)"switch" PARAM.
内的 PARAM 之一关于 VARs...klish 中的 VARs 是全球性的。所以它可以在没有 COMMAND 标签或 VIEW 标签的情况下出现。将其与 "VIEW" 标签放在同一层级。