klish - динамические переменные и пополнение

Я пишу XML-файл на klish. Я хочу знать, как мы можем автоматически заполнить параметр, нажав кнопку табуляции в файлах 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

3 ответа

Решение

После долгих исследований, наконец, я успешно реализовал автоматическое завершение команды. Как и в моем примере, я хочу, чтобы пользователь вводил включить или отключить в командной строке. Это может быть достигнуто с помощью следующего XML-файла. Просто мы должны были использовать тег VAR в файле 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"
       completion="${third_par}"/>

 <ACTION>c_file.c 3 ${module-name}</ACTION>

<VAR name="third_par" help="enable/disable" value="enable disable"/>
 </COMMAND>

О завершении. Есть несколько способов реализовать это. Первый способ примерно такой:

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

Это просто, но не строго, то есть пользователь может ввести что-то еще, кроме "включить / отключить".

Второй способ - PTYPE с method="select":

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

Этот способ строгий. Автозаполнение покажет "true/false", но пользователь получит соответствующий PARAM со значениями "1/0" в ACTION. Но вы можете использовать pattern="true(true) false(false)", чтобы получить "true" или "false" в ACTION.

Третий способ - это переключение:

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

Это строгое Пользователь должен выбрать (ввести) только одну из ПАРАМ внутри ПАРАМ "переключателя".

О VAR... VAR в klish является глобальным. Таким образом, он может появиться без тега COMMAND или VIEW. Поместите его на тот же уровень, что и тег "Просмотр".

Я не уверен, правильно ли указан 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 должно быть в следующем порядке:

  • ДЕТАЛЬ
  • PARAM
  • CONFIG
  • ДЕЙСТВИЯ

Так что если вы поместите DETAIL после PARAM, он будет недопустим по отношению к схеме. Я имею в виду следующее clish.xsd Версия схемы в klish git repo:

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

Version 2.1.4
Другие вопросы по тегам