18

私のアプリケーションにはコマンド ライン インターフェースがあり、履歴や編集可能なコマンド ラインなどを提供するためにGNU Readline ライブラリを使用することを考えています。

問題は、私のコマンドが非常に長く複雑になる可能性があることです (SQL を考えてください)。ユーザーがコマンドを複数の行に広げて、履歴で読みやすくすることを許可したいと考えています。

readline でこれを行うことは可能ですか (おそらく、改行とコマンドの終わりの違いを指定することによって)?

それとも、独自のコマンド ラインを実装した方がよいでしょうか (ただし、GNU History ライブラリを使用することもできます)。

4

1 に答える 1

18

きっとできます。

'\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);
}
于 2008-10-02T09:56:11.713 に答える