2008-10-02 31 views
16

我的應用程序有一個命令行界面,和我正在考慮使用GNU Readline library提供的歷史,可編輯的命令行等使用GNU readline處理多行輸入是否有很好的方法?

的順利是我的命令可能會相當漫長而複雜的(想想SQL)我希望允許用戶通過多行傳播命令,使它們在歷史中更具可讀性。

是否有可能在readline中做到這一點(也許通過指定換行符和命令結束之間的區別)?

或者我會更好地執行我自己的命令行(但也許使用GNU History library)?

回答

16

你當然可以。

可以定義爲「\ r」和「\ n」值的選項與

rl_bind_key('\r', return_func); 

你return_func現在可以決定如何處理這些鍵可以完成。

int return_func(int cnt, int key) { ... } 

如果您在UNIX終端內執行此操作,則需要了解ANSI終端代碼,才能移動光標。在維基百科上有一個starting reference

下面是一些使用readline讀取多行的示例代碼,當您輸入分號(我將其設置爲EOQ或結束或查詢)時,將停止編輯。 Readline非常強大,有很多東西需要學習。

#include <stdio.h> 
#include <unistd.h> 
#include <readline/readline.h> 
#include <readline/history.h> 

int my_startup(void); 
int my_bind_cr(int, int); 
int my_bind_eoq(int, int); 
char *my_readline(void); 

int my_eoq; 

int 
main(int argc, char *argv[]) 
{ 

    if (isatty(STDIN_FILENO)) { 
    rl_readline_name = "my"; 
    rl_startup_hook = my_startup; 
    my_readline(); 
    } 
} 

int 
my_startup(void) 
{ 
    my_eoq = 0; 
    rl_bind_key('\n', my_bind_cr); 
    rl_bind_key('\r', my_bind_cr); 
    rl_bind_key(';', my_bind_eoq); 
} 

int 
my_bind_cr(int count, int key) { 
    if (my_eoq == 1) { 
    rl_done = 1; 
    } 
    printf("\n"); 
} 

int 
my_bind_eoq(int count, int key) { 
    my_eoq = 1; 

    printf(";"); 
} 

char * 
my_readline(void) 
{ 
    char *line; 

    if ((line = readline("")) == NULL) { 
    return NULL; 
    } 

    printf("LINE : %s\n", line); 
} 
相關問題