2017-04-23 545 views
1

我正在用klish编写一个xml文件。我想知道我们如何通过在klish xml文件中按tab按钮来自动完成一个参数。例如,我希望用户在klish命令行中输入启用或禁用,但如果用户按下'e'和标签,然后自动启用应该完成,或者如果用户按下'd'和标签,然后自动禁用应该来。 我正在用户在klish命令行上接收这些参数。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> 

正如我所说,我想作为自动完成tatement所以parametere即

${modulename} 

将启用或禁用,所以我想如果用户按e和标签,然后自动启用应该来,或者如果用户按下d和标签,然后自动禁用应来。

而关于宏,你可以在标签看到我传递值即

<ACTION>c_file.c 1</ACTION> 

我的C文件,而是价值我想用一些变量名或宏,以便它会是这样的

<ACTION>c_file ${var} ${modulename}</ACTION> 

其中$ VAR = 1

+0

到目前为止你做了什么?如果您有代码,请将其展示给我们,以便我们帮助您。学习[如何提出一个好问题。](https://stackoverflow.com/help/how-to-ask) –

+0

@naru罪我添加了我的XML文件。请帮助,如果您对此有任何想法 – vivek

回答

2

命令的大量研究最后我成功实施自动完成后。 就像我的例子中,我希望用户在命令行中输入enable或disable。这可以通过以下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> 
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
  • CONFIG
  • ACTION

因此,如果您在参数后放置细节,它对模式无效。我指的是以下clish.xsd架构版本在klish git repo

Author: Serj Kalichev <[email protected]> 
Date: Fri Dec 15 18:03:53 2017 +0300 

Version 2.1.4 
1

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

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

这很简单,但不严格,即用户可以输入一些东西比其他“启用/禁用”。

的第二种方法是用PTYPE METHOD = “选择”:

<PTYPE name="BOOL" method="select" pattern="true(1) false(0)" help="Boolean choice"/> 

这种方式是严格。自动完成将显示“true/false”,但用户将在ACTION中获得值为“1/0”的相应PARAM。但是你可以在ACTION中使用pattern =“true(true)false(false)”来获得“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> 

这是严格的。用户必须在“开关”参数中选择(输入)参数中的一个参数。

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

+0

谢谢@Serj,实际上最初当我开始使用klish时我不知道这一点,并且我在klish的谷歌组中也发布了这个查询,但没有人回答,但是有些时候我花了时间在klish的手册我来认识这种方式....所以我发布了这个答案堆栈溢出....现在后你的文章,我已经学会了两种方法来完成这件事情....再次感谢和欢迎到SO – vivek