2008-10-02 35 views
16

Ứng dụng của tôi có giao diện dòng lệnh và tôi đang nghĩ đến việc sử dụng GNU Readline library để cung cấp lịch sử, dòng lệnh có thể chỉnh sửa, v.v.Có cách nào tốt đẹp để xử lý đầu vào nhiều dòng với GNU readline không?

Vấn đề là lệnh của tôi có thể khá dài và phức tạp (nghĩ SQL) và tôi muốn cho phép người dùng truyền các lệnh qua nhiều dòng để làm cho chúng dễ đọc hơn trong lịch sử.

Có thể thực hiện điều này ở chế độ đọc (có thể bằng cách chỉ định sự khác biệt giữa dòng mới và kết thúc lệnh)?

Hoặc tôi có nên thực hiện tốt hơn dòng lệnh của riêng mình (nhưng có thể sử dụng GNU History library)?

Trả lời

16

Bạn chắc chắn có thể.

Bạn có thể xác định các tùy chọn cho các giá trị '\ n' '\ r' và với

rl_bind_key('\r', return_func); 

return_func của bạn bây giờ có thể quyết định phải làm gì với những phím.

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

Nếu bạn làm điều này bên trong thiết bị đầu cuối UNIX, bạn sẽ cần tìm hiểu về mã đầu cuối ANSI nếu bạn muốn di chuyển con trỏ. Có một số starting reference trên wikipedia.

Dưới đây là một số mã mẫu sử dụng readline để đọc nhiều dòng và sẽ ngừng chỉnh sửa khi bạn nhập vào dấu chấm phẩy (tôi đã đặt đó là EOQ hoặc kết thúc hoặc truy vấn). Readline cực kỳ mạnh mẽ, có rất nhiều thứ để học.

#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); 
} 
Các vấn đề liên quan