Comments 14
Я так понимаю, что в приведённом коде закрывающая скобка находится не под макросом, чтобы следовать священному для всех программистов принципу «don’t repeat yourself».
Предлагаю ещё улучшить этот код в соответствии с озвученным принципом
#if defined(OS_WINDOWS)
std::string set_console_color(uint16_t color) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
return "";
#elif defined(OS_POSIX)
std::string set_console_color(std::string color) {
return "\033[" + color + "m";
#endif
}
Предлагаю ещё улучшить этот код в соответствии с озвученным принципом
std::string set_console_color(
#if defined(OS_WINDOWS)
uint16_t color) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
return ""
#elif defined(OS_POSIX)
std::string color) {
return "\033[" + color + "m"
#endif
;
}
Интересно, что в fish shell уже встроено подобное автодополнение, но оно работает только для файлов. Не смотрели, можно ли вместо Вашего подхода с заменой шелла допилить fish shell и встроить эту логику туда?
В zsh (а в macOS, например, это с некоторых пор дефолтная оболочка) тож есть расширяемое автодополнение, не только для файловой системы, а набор дополнений oh-my-zsh добавляет автодополнения сразу для сотен программ :). Не так красиво, возможно, зато выводит список всех возможных (по уже введённому префиксу) вариантов.
На Posix платформах все просто, достаточно вывести в консоль \033[2K, но естественно в Windows нет аналогов, конкретно я не смог найти, приходится писать свою реализацию.
SetConsoleMode()
+ ENABLE_VIRTUAL_TERMINAL_PROCESSING
, но осторожно: есть несовместимости.
Есть проблема с использованием контекста, опирающегося только на предыдущее слово.
Например, при таком конфиге:
при вводе «command arg1 samename child» в дополнении появится «child2». Проверил — баг действительно наблюдается.
Можно попробовать полностью разбирать введенную команду, а структуру из конфига хранить в дереве.
Например, при таком конфиге:
command
arg1
samename
child1
arg2
samename
child2
при вводе «command arg1 samename child» в дополнении появится «child2». Проверил — баг действительно наблюдается.
Можно попробовать полностью разбирать введенную команду, а структуру из конфига хранить в дереве.
AndreiNekrasOn Очень хорошее замечание, спасибо за совет, буду работать над этим.
AndreiNekrasOn Еще раз спасибо за наводку, данный баг был пофикшен в версии 2.0
UFO just landed and posted this here
Советую почитать man readline и не городить велосипедов.
UFO just landed and posted this here
Sign up to leave a comment.
Пишем автодополнение для ваших CLI проектов