1

我正在用 klish 编写一个 xml 文件。我想知道我们如何通过按 klish xml 文件中的选项卡按钮来自动完成参数。例如,我希望用户在 klish 命令行上输入启用或禁用,但如果用户按下“e”和选项卡,那么应该完成自动启用,或者如果用户按下“d”和选项卡,那么应该自动禁用。我正在由用户在 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

4

3 回答 3

2

经过大量研究,我终于成功实现了命令的自动完成。就像在我的示例中一样,我希望用户在命令行中输入启用或禁用。这可以通过以下 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>
于 2017-04-24T12:46:49.623 回答
1

关于完成。有几种方法可以实现它。第一种方法是这样的:

<PARAM name="module-name"
   help="Specify the module name i.e. enable or disable"
   ptype="STRING"
   completion="enable disable"/>

这很简单但并不严格,即用户可以键入除“启用/禁用”之外的其他内容。

第二种方式是带有method="select"的PTYPE:

<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。

关于 VAR... klish 中的 VAR 是全球性的。所以它可以在没有 COMMAND 标签或 VIEW 标签的情况下出现。将它放在与“VIEW”标签相同的级别。

于 2018-01-15T08:39:40.883 回答
0

我不确定上述 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 repoclish.xsd中的以下架构版本:

Author: Serj Kalichev <serj.kalichev@gmail.com>
Date:   Fri Dec 15 18:03:53 2017 +0300

Version 2.1.4
于 2018-01-15T07:52:14.230 回答