История - Экран управления прокруткой текста на месте (стрелка вверх -> цикл, хотя команды на месте / в том же месте) - PullRequest
0 голосов
/ 03 апреля 2011

При прокрутке истории текст меняется в приглашении. Я посмотрел на соответствующие структуры, но недостаточно глубоко изучил исходный код, чтобы выяснить, как он изменяет текст на экране, не изменяя весь текст над ним (подсказка, предыдущий текст, который был распечатан).

Он не может просто очистить экран и перепечатать все с небольшим изменением после запроса - это было бы просто неэффективно. Как они это делают?

Возможно, это звучит очень глупо, но я попытался напечатать символ возврата на одну позицию, в результате чего курсор переместился в подсказку, в которой при вводе он просто пишет поверх подсказки.

Я просто не могу понять, как они распечатывают текст и меняют его или циклически перебирают текст на месте.

Если кто-нибудь знает, как это делается, я был бы очень признателен.

Спасибо

1 Ответ

3 голосов
/ 03 апреля 2011

bash использует библиотеку GNU readline для этого. В конечном итоге это оболочка библиотеки terminfo (из System V или библиотеки ncurses ), цель которой - использовать описания терминалов, чтобы выяснить, как выполнять эти обновления. Если тип терминала неизвестен или объявлен неправильно, вы заметите, что у вас либо мусор, либо все красивые обновления на месте исчезают.

Описание терминала выглядит примерно так:

xterm-color|nxterm|generic color xterm,
        am, km, mir, msgr, xenl,
        colors#8, cols#80, it#8, lines#24, ncv@, pairs#64,
        acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=^M,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
        dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
        el=\E[K, enacs=\E)0, home=\E[H, ht=^I, hts=\EH, il=\E[%p1%dL,
        il1=\E[L, ind=^J,
        is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, kbs=^H,
        kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
        kdch1=\E[3~, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~,
        kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
        kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
        kf2=\E[12~, kf20=\E[34~, kf3=\E[13~, kf4=\E[14~,
        kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
        kfnd=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
        kslt=\E[4~, meml=\El, memu=\Em, op=\E[m, rc=\E8, rev=\E[7m,
        ri=\EM, rmacs=^O, rmcup=\E[2J\E[?47l\E8, rmir=\E[4l,
        rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
        rs2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, sc=\E7,
        setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[m, smacs=^N,
        smcup=\E7\E[?47h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m,
        smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n,
        u8=\E[?1;2c, u9=\E[c,

и описывает, как выполнять различные обновления экрана, какие функциональные клавиши и клавиши действий доступны и что они отправляют, а также специальные действия терминала (рисование линий, цвета и другие формы выделения, может ли он вставлять символы в середине линия и т. д.). Обычно вам не нужно это понимать, если только что-то не настроено неправильно или вы не пользуетесь продвинутыми терминалами. (Если вы делаете хотите понять это, начните с terminfo(5) и другой curses / ncurses / terminfo документации. Если ничего другого, вы узнаете, как сделать действительно модную оболочку подсказки.)

...