Skip to content

Commit 080f005

Browse files
Copilotnixel2007
andauthored
generate bash completions dynamically from registered commands via autumn DI
Agent-Logs-Url: https://github.com/oscript-library/ovm/sessions/620f0b3d-4ded-4eb4-8aea-b21995ed3cb7 Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
1 parent 217fbfe commit 080f005

1 file changed

Lines changed: 93 additions & 29 deletions

File tree

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

Lines changed: 93 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
#Использовать annotations
2+
13
&ЛогOVM
24
Перем Лог;
35

6+
&Пластилин
7+
Перем Поделка;
8+
49
&Опция(Имя = "shell s", Описание = "Тип оболочки для генерации автодополнения (поддерживается: bash)")
510
&ТСтрока
611
&ПоУмолчанию("bash")
@@ -24,6 +29,27 @@
2429

2530
Функция СкриптАвтодополненияBash()
2631

32+
СписокКоманд = ПолучитьСписокКоманд();
33+
34+
МассивИменВсехКоманд = Новый Массив();
35+
СтрокиCase = Новый Массив();
36+
37+
Для Каждого ОписаниеКоманды Из СписокКоманд Цикл
38+
Для Каждого ИмяКоманды Из ОписаниеКоманды.Имена Цикл
39+
МассивИменВсехКоманд.Добавить(ИмяКоманды);
40+
КонецЦикла;
41+
42+
ПаттернCase = СтрСоединить(ОписаниеКоманды.Имена, "|");
43+
СтрокаОпций = СтрСоединить(ОписаниеКоманды.Опции, " ");
44+
45+
СтрокиCase.Добавить(" " + ПаттернCase + ")");
46+
СтрокиCase.Добавить(" COMPREPLY=($(compgen -W """ + СтрокаОпций + """ -- ""$cur""))");
47+
СтрокиCase.Добавить(" ;;");
48+
КонецЦикла;
49+
50+
ВсеКоманды = СтрСоединить(МассивИменВсехКоманд, " ");
51+
ТелоCase = СтрСоединить(СтрокиCase, Символы.ПС);
52+
2753
Скрипт =
2854
"# ovm bash completions
2955
# Добавьте строку ниже в ~/.bashrc для активации автодополнения:
@@ -39,7 +65,7 @@ _ovm_completions() {
3965
cword=$COMP_CWORD
4066
}
4167
42-
local commands=""install i list ls use u which w config run r uninstall delete d completions""
68+
local commands=""" + ВсеКоманды + """
4369
4470
if [ $cword -eq 1 ]; then
4571
COMPREPLY=($(compgen -W ""$commands"" -- ""$cur""))
@@ -49,34 +75,7 @@ _ovm_completions() {
4975
local command=""${words[1]}""
5076
5177
case ""$command"" in
52-
install|i)
53-
COMPREPLY=($(compgen -W ""--name --clean --x86 --fdd --help"" -- ""$cur""))
54-
;;
55-
list|ls)
56-
COMPREPLY=($(compgen -W ""--remote --all --quiet --help"" -- ""$cur""))
57-
;;
58-
use|u)
59-
COMPREPLY=($(compgen -W ""--install --help"" -- ""$cur""))
60-
;;
61-
which|w)
62-
COMPREPLY=($(compgen -W ""--help"" -- ""$cur""))
63-
;;
64-
run|r)
65-
COMPREPLY=($(compgen -W ""--help"" -- ""$cur""))
66-
;;
67-
config)
68-
COMPREPLY=($(compgen -W ""--help"" -- ""$cur""))
69-
;;
70-
uninstall|delete|d)
71-
COMPREPLY=($(compgen -W ""--force --all --help"" -- ""$cur""))
72-
;;
73-
completions)
74-
if [ ""$prev"" = ""--shell"" ] || [ ""$prev"" = ""-s"" ]; then
75-
COMPREPLY=($(compgen -W ""bash"" -- ""$cur""))
76-
else
77-
COMPREPLY=($(compgen -W ""--shell --help"" -- ""$cur""))
78-
fi
79-
;;
78+
" + ТелоCase + "
8079
*)
8180
;;
8281
esac
@@ -89,3 +88,68 @@ complete -F _ovm_completions ovm";
8988
Возврат Скрипт;
9089

9190
КонецФункции
91+
92+
Функция ПолучитьСписокКоманд()
93+
94+
ОпределенияКоманд = Поделка.ПолучитьОпределенияЖелудей("КомандаПриложения");
95+
96+
Результат = Новый Массив();
97+
98+
Для Каждого КлючЗначение Из ОпределенияКоманд Цикл
99+
ОпределениеЖелудя = КлючЗначение.Значение;
100+
Конструктор = ОпределениеЖелудя.Завязь().ДанныеМетода();
101+
102+
АннотацияПодкоманды = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "ПодкомандаПриложения");
103+
Если АннотацияПодкоманды <> Неопределено Тогда
104+
Продолжить;
105+
КонецЕсли;
106+
107+
АннотацияКоманды = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "КомандаПриложения");
108+
Если АннотацияКоманды = Неопределено Тогда
109+
Продолжить;
110+
КонецЕсли;
111+
112+
ИмяКоманды = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияКоманды, "Имя");
113+
Если НЕ ЗначениеЗаполнено(ИмяКоманды) Тогда
114+
Продолжить;
115+
КонецЕсли;
116+
117+
ЧастиИмени = СтрРазделить(ИмяКоманды, " ");
118+
Опции = ПолучитьОпцииКоманды(ОпределениеЖелудя);
119+
120+
ОписаниеКоманды = Новый Структура("Имена, Опции");
121+
ОписаниеКоманды.Имена = ЧастиИмени;
122+
ОписаниеКоманды.Опции = Опции;
123+
124+
Результат.Добавить(ОписаниеКоманды);
125+
КонецЦикла;
126+
127+
Возврат Результат;
128+
129+
КонецФункции
130+
131+
Функция ПолучитьОпцииКоманды(ОпределениеЖелудя)
132+
133+
Опции = Новый Массив();
134+
Опции.Добавить("--help");
135+
136+
Свойства = ОпределениеЖелудя.Свойства();
137+
Для Каждого Свойство Из Свойства Цикл
138+
АннотацияОпции = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Опция");
139+
Если АннотацияОпции = Неопределено Тогда
140+
Продолжить;
141+
КонецЕсли;
142+
143+
ИмяОпции = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияОпции, "Имя");
144+
Для Каждого ЧастьОпции Из СтрРазделить(ИмяОпции, " ") Цикл
145+
Если СтрДлина(ЧастьОпции) = 1 Тогда
146+
Опции.Добавить("-" + ЧастьОпции);
147+
Иначе
148+
Опции.Добавить("--" + ЧастьОпции);
149+
КонецЕсли;
150+
КонецЦикла;
151+
КонецЦикла;
152+
153+
Возврат Опции;
154+
155+
КонецФункции

0 commit comments

Comments
 (0)