当我在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
答案 0 :(得分:2)
您可能只需要使用fflush
刷新stdio缓冲区。也就是说,在使用printf
写一些文本后,请调用fflush(stdout)
以确保文本被发送到终端。 ncurses可能正在调用setbuf
或setvbuf
来启用到终端的块缓冲IO,这不被认为是保存和恢复的tty模式的一部分。
答案 1 :(得分:1)
如果你调用setbuf(stdout,NULL),你不必每次都调用fflush(stdout)......
setbuf在头文件stdio.h中声明