Как Vim показывает: результаты ls (curses / cooked mode) - PullRequest
2 голосов
/ 20 сентября 2010

Когда я нахожусь внутри Vim и набираю :ls, Vim перечисляет буферы. Скорее всего, он входит в «приготовленный режим» с использованием def_prog_mode() и endwin(). Я хотел бы знать, как это печатать значения. Лучшее, что я получил, это использование system("echo ...."), что было бы довольно трудоемко. Я пробовал printf - без эффекта и printw.

Мне нужно сделать то же самое в моих приложениях, и вместо того, чтобы создавать Windows или всплывающие окна, я хотел бы перечислить внутреннюю информацию, как это делает Vim.

Вот пример того, что я пробовал, с http://gist.github.com/587622

#include <ncurses.h>

// it seems system echo is the only way to print some stuff in cooked mode
// i am trying to figure out how VIM displays the result of :ls

int main()
{       
        initscr();                      /* Start curses mode              */
        printw("Hello World !!! Hit a key\n");    /* Print Hello World              */
        refresh();                      /* Print it on to the real screen */
        getch();
        def_prog_mode();                /* Save the tty modes             */
        endwin();                       /* End curses mode temporarily    */
        int i = 0;
        for (i = 0; i < 5; i++) {
            system("echo inside cooked mode");
        }
        //printf("helllow there\n");
        //system("/bin/ls");              /* Do whatever you like in cooked mode */
        //system("read");
        //system("/bin/sh");              /* Do whatever you like in cooked mode */
        //system("echo hit a key");              /* Do whatever you like in cooked mode */
        //printw("Hit a key buddy\n");    /* Print Hello World              */
        reset_prog_mode();              /* Return to the previous tty mode*/
        getch();
                                        /* stored by def_prog_mode()      */
        refresh();                      /* Do refresh() to restore the    */
                                        /* Screen contents                */
        printw("After cooked mode.\nKey to quit");     /* Back to curses use the full    */
        getch();
        refresh();                      /* capabilities of curses         */
        endwin();                       /* End curses mode                */

        return 0;
}

Скомпилируйте его, используя:

gcc -o a.out -lncurses a.c && ./a.out

Ответы [ 2 ]

2 голосов
/ 21 сентября 2010

Возможно, вам просто нужно очистить буфер stdio, используя fflush.То есть после использования printf для написания некоторого текста вызовите fflush(stdout), чтобы убедиться, что текст отправляется на терминал.ncurses, вероятно, вызывает setbuf или setvbuf для включения буферизованного ввода-вывода в терминал, и это не считается частью сохраненных и восстановленных режимов tty.

1 голос
/ 21 марта 2011

Если вы вызываете setbuf (stdout, NULL), вам не нужно каждый раз вызывать fflush (stdout) ...

setbuf объявляется в заголовке stdio.h

...