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