Vim如何显示:ls结果(curses / cooked模式)

时间:2010-09-20 08:56:26

标签: vim ncurses

当我在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 个答案:

答案 0 :(得分:2)

您可能只需要使用fflush刷新stdio缓冲区。也就是说,在使用printf写一些文本后,请调用fflush(stdout)以确保文本被发送到终端。 ncurses可能正在调用setbufsetvbuf来启用到终端的块缓冲IO,这不被认为是保存和恢复的tty模式的一部分。

答案 1 :(得分:1)

如果你调用setbuf(stdout,NULL),你不必每次都调用fflush(stdout)......

setbuf在头文件stdio.h中声明