2010-09-20 29 views
2

Lorsque je suis dans Vim et tapez :ls, Vim liste les tampons. Très probablement, il va en "mode cuit" en utilisant def_prog_mode() et endwin(). Je voudrais savoir comment il imprime les valeurs. Le meilleur que je sors est d'utiliser system("echo ....") ce qui serait assez laborieux. J'ai essayé printf - aucun effet, et printw.Comment Vim affiche-t-il: ls résultats (curses/mode cuit)

Je dois faire le même genre de chose dans mes applications, et plutôt que de créer des fenêtres ou des fenêtres pop-up, je voudrais répertorier des informations internes comme Vim.

Voici un échantillon de ce que j'ai essayé, de 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; 
} 

Compile à l'aide:

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

Répondre

2

Vous avez probablement juste besoin de vider le tampon stdio en utilisant fflush. C'est-à-dire, après avoir utilisé printf pour écrire du texte, appelez fflush(stdout) pour vous assurer que le texte est envoyé au terminal. ncurses appelle probablement le setbuf ou le setvbuf pour activer les E/S bufferisées sur le terminal et ceci n'est pas considéré comme faisant partie des modes tty enregistrés et restaurés.

+0

Eh oui fonctionnait très bien! Je n'ai pas pensé à fflush puisque j'utilise du ruby ​​et que je n'ai pas écrit en C depuis 18 ans. Merci. – rahul

+0

Cela fonctionne très bien. Cependant, je vois que dans les micro-ordinateurs lorsque vous tapez C-x c pour aller à l'interpréteur de commande, cela n'efface pas l'écran. Vim fait et fait aussi mon prog, en raison de 'endwin()'. Si je supprime 'endwin' l'écran n'est pas effacé. mais au retour, il reste défilé. J'ai essayé def_shell_mode (???) mais ça gâche. Donc, comment conserver les fenêtres et les panneaux existants, et inversement. THX. – rahul

+0

ok, compris, nous devons arrêter et redémarrer ncurses. – rahul

1

Si vous appelez setbuf (stdout, NULL) vous n'avez pas appeler fflush (stdout) à chaque fois ...

setbuf est déclaré dans l'en-tête stdio.h