Skip to content

Commit f7ca444

Browse files
Copilotnixel2007
andauthored
include subcommands in bash completions via nested case statements
Agent-Logs-Url: https://github.com/oscript-library/ovm/sessions/bd06fa86-ee67-41b7-8808-5df53c01d281 Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
1 parent 080f005 commit f7ca444

1 file changed

Lines changed: 89 additions & 18 deletions

File tree

src/cmd/Классы/КомандаCompletions.os

Lines changed: 89 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,56 @@
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

Comments
 (0)