Pull to refresh

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
    ;
}
vamireh Спасибо, хорошее замечание, обязательно исправлю.

Интересно, что в fish shell уже встроено подобное автодополнение, но оно работает только для файлов. Не смотрели, можно ли вместо Вашего подхода с заменой шелла допилить fish shell и встроить эту логику туда?

В zsh (а в macOS, например, это с некоторых пор дефолтная оболочка) тож есть расширяемое автодополнение, не только для файловой системы, а набор дополнений oh-my-zsh добавляет автодополнения сразу для сотен программ :). Не так красиво, возможно, зато выводит список всех возможных (по уже введённому префиксу) вариантов.
На Posix платформах все просто, достаточно вывести в консоль \033[2K, но естественно в Windows нет аналогов, конкретно я не смог найти, приходится писать свою реализацию.

SetConsoleMode() + ENABLE_VIRTUAL_TERMINAL_PROCESSING, но осторожно: есть несовместимости.

kozlyuk Да, я рассмотривал этот вариант, но впоследствии решил отказаться.
Есть проблема с использованием контекста, опирающегося только на предыдущее слово.
Например, при таком конфиге:

command
  arg1
    samename
      child1
  arg2
    samename
      child2

при вводе «command arg1 samename child» в дополнении появится «child2». Проверил — баг действительно наблюдается.
Можно попробовать полностью разбирать введенную команду, а структуру из конфига хранить в дереве.
UFO just landed and posted this here
DmitryLTL Спасибо за хорошую идею. По поводу отображения нескольких возможных вариантов уже задумывался, буду реализовывать.
Советую почитать man readline и не городить велосипедов.
UFO just landed and posted this here
Sign up to leave a comment.

Articles