2929
3030Функция СкриптАвтодополненияBash ()
3131
32- СписокКоманд = ПолучитьСписокКоманд ();
32+ ДеревоКоманд = ПолучитьДеревоКоманд ();
3333
3434 МассивИменВсехКоманд = Новый Массив();
3535 СтрокиCase = Новый Массив();
3636
37- Для Каждого ОписаниеКоманды Из СписокКоманд Цикл
37+ Для Каждого ОписаниеКоманды Из ДеревоКоманд Цикл
3838 Для Каждого ИмяКоманды Из ОписаниеКоманды.Имена Цикл
3939 МассивИменВсехКоманд.Добавить(ИмяКоманды);
4040 КонецЦикла ;
4141
4242 ПаттернCase = СтрСоединить (ОписаниеКоманды.Имена, "|" );
43- СтрокаОпций = СтрСоединить (ОписаниеКоманды.Опции, " " );
4443
45- СтрокиCase.Добавить(" " + ПаттернCase + ")" );
46- СтрокиCase.Добавить(" COMPREPLY=($(compgen -W "" " + СтрокаОпций + """ -- "" $cur"" ))" );
47- СтрокиCase.Добавить(" ;;" );
44+ Если ОписаниеКоманды.Подкоманды.Количество() > 0 Тогда
45+ МассивИменПодкоманд = Новый Массив();
46+ МассивПодкомандCase = Новый Массив();
47+
48+ Для Каждого ОписаниеПодкоманды Из ОписаниеКоманды.Подкоманды Цикл
49+ Для Каждого ИмяПодкоманды Из ОписаниеПодкоманды.Имена Цикл
50+ МассивИменПодкоманд.Добавить(ИмяПодкоманды);
51+ КонецЦикла ;
52+
53+ ПаттернПодкомандCase = СтрСоединить (ОписаниеПодкоманды.Имена, "|" );
54+ СтрокаОпцийПодкоманды = СтрСоединить (ОписаниеПодкоманды.Опции, " " );
55+
56+ МассивПодкомандCase.Добавить(" " + ПаттернПодкомандCase + ")" );
57+ МассивПодкомандCase.Добавить(" COMPREPLY=($(compgen -W "" " + СтрокаОпцийПодкоманды + """ -- "" $cur"" ))" );
58+ МассивПодкомандCase.Добавить(" ;;" );
59+ КонецЦикла ;
60+
61+ ИменаПодкоманд = СтрСоединить (МассивИменПодкоманд, " " );
62+ СтрокаОпцийРодителя = СтрСоединить (ОписаниеКоманды.Опции, " " );
63+ ТелоПодкомандCase = СтрСоединить (МассивПодкомандCase, Символы.ПС);
64+
65+ СтрокиCase.Добавить(" " + ПаттернCase + ")" );
66+ СтрокиCase.Добавить(" if [ $cword -eq 2 ]; then" );
67+ СтрокиCase.Добавить(" COMPREPLY=($(compgen -W "" " + ИменаПодкоманд + " " + СтрокаОпцийРодителя + """ -- "" $cur"" ))" );
68+ СтрокиCase.Добавить(" else" );
69+ СтрокиCase.Добавить(" local subcommand="" ${words[2]}"" " );
70+ СтрокиCase.Добавить(" case "" $subcommand"" in" );
71+ СтрокиCase.Добавить(ТелоПодкомандCase);
72+ СтрокиCase.Добавить(" esac" );
73+ СтрокиCase.Добавить(" fi" );
74+ СтрокиCase.Добавить(" ;;" );
75+ Иначе
76+ СтрокаОпций = СтрСоединить (ОписаниеКоманды.Опции, " " );
77+
78+ СтрокиCase.Добавить(" " + ПаттернCase + ")" );
79+ СтрокиCase.Добавить(" COMPREPLY=($(compgen -W "" " + СтрокаОпций + """ -- "" $cur"" ))" );
80+ СтрокиCase.Добавить(" ;;" );
81+ КонецЕсли ;
4882 КонецЦикла ;
4983
5084 ВсеКоманды = СтрСоединить (МассивИменВсехКоманд, " " );
@@ -89,21 +123,18 @@ complete -F _ovm_completions ovm";
89123
90124КонецФункции
91125
92- Функция ПолучитьСписокКоманд ()
126+ Функция ПолучитьДеревоКоманд ()
93127
94128 ОпределенияКоманд = Поделка.ПолучитьОпределенияЖелудей("КомандаПриложения" );
95129
96- Результат = Новый Массив();
130+ // Первый проход: собрать все команды с их именами желудей и родителями
131+ ВсеИнфо = Новый Соответствие();
97132
98133 Для Каждого КлючЗначение Из ОпределенияКоманд Цикл
134+ ИмяЖелудя = КлючЗначение.Ключ;
99135 ОпределениеЖелудя = КлючЗначение.Значение;
100136 Конструктор = ОпределениеЖелудя.Завязь().ДанныеМетода();
101137
102- АннотацияПодкоманды = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "ПодкомандаПриложения" );
103- Если АннотацияПодкоманды <> Неопределено Тогда
104- Продолжить ;
105- КонецЕсли ;
106-
107138 АннотацияКоманды = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "КомандаПриложения" );
108139 Если АннотацияКоманды = Неопределено Тогда
109140 Продолжить ;
@@ -114,12 +145,33 @@ complete -F _ovm_completions ovm";
114145 Продолжить ;
115146 КонецЕсли ;
116147
117- ЧастиИмени = СтрРазделить (ИмяКоманды, " " );
118- Опции = ПолучитьОпцииКоманды(ОпределениеЖелудя);
148+ Родитель = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияКоманды, "Родитель" , "" );
149+
150+ ИнфоКоманды = Новый Структура("ИмяЖелудя, Родитель, Имена, Опции" );
151+ ИнфоКоманды.ИмяЖелудя = ИмяЖелудя;
152+ ИнфоКоманды.Родитель = Родитель;
153+ ИнфоКоманды.Имена = СтрРазделить (ИмяКоманды, " " );
154+ ИнфоКоманды.Опции = ПолучитьОпцииКоманды(ОпределениеЖелудя);
155+
156+ ВсеИнфо.Вставить(ИмяЖелудя, ИнфоКоманды);
157+ КонецЦикла ;
158+
159+ // Второй проход: собрать дерево — верхнеуровневые команды со своими подкомандами
160+ Результат = Новый Массив();
161+
162+ Для Каждого КлючЗначение Из ВсеИнфо Цикл
163+ ИнфоКоманды = КлючЗначение.Значение;
164+
165+ Если ЗначениеЗаполнено (ИнфоКоманды.Родитель) Тогда
166+ Продолжить ;
167+ КонецЕсли ;
168+
169+ Подкоманды = НайтиПодкоманды(ИнфоКоманды.ИмяЖелудя, ВсеИнфо);
119170
120- ОписаниеКоманды = Новый Структура("Имена, Опции" );
121- ОписаниеКоманды.Имена = ЧастиИмени;
122- ОписаниеКоманды.Опции = Опции;
171+ ОписаниеКоманды = Новый Структура("Имена, Опции, Подкоманды" );
172+ ОписаниеКоманды.Имена = ИнфоКоманды.Имена;
173+ ОписаниеКоманды.Опции = ИнфоКоманды.Опции;
174+ ОписаниеКоманды.Подкоманды = Подкоманды;
123175
124176 Результат.Добавить(ОписаниеКоманды);
125177 КонецЦикла ;
@@ -128,6 +180,25 @@ complete -F _ovm_completions ovm";
128180
129181КонецФункции
130182
183+ Функция НайтиПодкоманды (ИмяРодителя , ВсеИнфо )
184+
185+ Результат = Новый Массив();
186+
187+ Для Каждого КлючЗначение Из ВсеИнфо Цикл
188+ ИнфоКоманды = КлючЗначение.Значение;
189+
190+ Если НРег (ИнфоКоманды.Родитель) = НРег (ИмяРодителя) Тогда
191+ ОписаниеПодкоманды = Новый Структура("Имена, Опции" );
192+ ОписаниеПодкоманды.Имена = ИнфоКоманды.Имена;
193+ ОписаниеПодкоманды.Опции = ИнфоКоманды.Опции;
194+ Результат.Добавить(ОписаниеПодкоманды);
195+ КонецЕсли ;
196+ КонецЦикла ;
197+
198+ Возврат Результат;
199+
200+ КонецФункции
201+
131202Функция ПолучитьОпцииКоманды (ОпределениеЖелудя )
132203
133204 Опции = Новый Массив();
0 commit comments