используя readline () для редактирования команд, в c - PullRequest
1 голос
/ 01 сентября 2011

Мне нужно реализовать несколько функций CLI, и теперь я пытаюсь использовать readline (), чтобы пользователь мог редактировать или выполнять свои команды.До сих пор он работал так, что позволяет пользователю вводить свои команды и просматривать историю.Это когда пользователь пытается редактировать команду.Курсору каким-то образом удается передать команду и перейти в приглашение, например «desktop r1234 | 5 $: ls», где «desktop r12345 (sp) $:» - это приглашение, показывающее рабочий каталог и корневой каталог;и "|"это курсор.Курсор должен останавливаться между '$' и 'ls', т. Е. "Desktop r12345 $: | ls". Метод showWrkngDir () просто отображает приглашение, как обычный терминал.

int main (int argc, char * argv[])
{

    showWrkngDir();
    static char *line_read = (char *)NULL;
    using_history();
    rl_readline_name = basename(argv[0]);
    if (line_read)
    {
            free (line_read);
            line_read = (char *)NULL;
    }

    while(strcmp((line_read = readline ("")) , "EXIT") != 0)
    {
            if (line_read && *line_read)
                    add_history (line_read);

            tokenize(line_read);
            showWrkngDir();
    }

    return 0;
}


void showWrkngDir()
{
    char curDir[MAX_COMMAND_SZ];
    char *env;

    getcwd(curDir, sizeof(curDir));
    env = (char *)getenv("USER");

    printf("%s ",basename(curDir));

    printf("%s(sp)$ ", env);
}

Ответы [ 2 ]

4 голосов
/ 01 сентября 2011

Я вполне уверен, что readline хочет отобразить само приглашение, потому что иногда ему нужно стереть всю строку экрана и перерисовать ее с нуля. Это особенно актуально при просмотре истории, а также при редактировании команды, которая переносится на следующую строку, или при нажатии ^ L.

Дайте приглашение в качестве аргумента readline (),

2 голосов
/ 01 сентября 2011

Передайте приглашение на readline и дайте ему распечатать, а не печатать его самостоятельно, используя printf.

...