GNU readlineで複数行入力を処理する良い方法はありますか?
-
03-07-2019 - |
質問
私のアプリケーションにはコマンドラインインターフェイスがあり、の使用を考えています。履歴、編集可能なコマンドラインなどを提供するGNU Readlineライブラリ
問題は、私のコマンドが非常に長く複雑になる可能性があることです(SQLを考えてください)。ユーザーがコマンドを複数の行に広げて履歴で読みやすくできるようにしたいと思います。
readlineでこれを行うことは可能ですか(おそらく、改行とコマンドの終わりの違いを指定することによって)?
または、独自のコマンドラインを実装する方が良いでしょう(ただし、 GNU履歴ライブラリ)?
解決
もちろんできます。
「\ r」および「\ n」値のオプションを定義できます
rl_bind_key('\r', return_func);
return_funcは、これらのキーをどうするかを決定できるようになりました。
int return_func(int cnt, int key) { ... }
UNIXターミナル内でこれを行う場合、カーソルを動かしたい場合はANSIターミナルコードについて学ぶ必要があります。ウィキペディアには開始リファレンスがあります。
readlineを使用して複数行を読み取り、セミコロンを入力すると編集を停止するサンプルコードを次に示します(EOQまたはend-or-queryとして設定しました)。 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);
}
所属していません StackOverflow