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" 标签放在同一层级。