1

CLI アプリケーションにオートコンプリート機能を実装したいと考えています。getc() のデフォルトの動作は、次の文字リストが入力された場合にのみ戻ります: NEW_LINE または EOF。自動補完アルゴリズムをトリガーできるように、このリストに TAB を追加したいと考えています。

たとえば、termios を使用してそれを行う方法はありますか? editline ライブラリ (http://www.thrysoee.dk/editline/) はそれを行うことができますが、どのように行うのかわかりませんでしたか?

4

3 に答える 3

1

tcsetattr()を必要としない、またはまったく必要としない最も簡単な方法は、tcgetattr()を使用cbreak()して端末を「cbreak」モードにすることです。このモードでは、制御文字のバッファリングや処理nocbreak()が行われず、リセットが完了したら を使用します。

man ページには、termio を完全に理解していなくても端末を制御するために使用できるやcbreakなど、さまざまな関連機能が記載されています。raw()noecho()

より細かい制御が必要な場合は、termios を直接使用する必要があります。少し前にブログ投稿を書きました。

于 2010-12-23T22:09:34.727 に答える
0

getc()で自分を殺すのではなく、 gnureadlineを使用する必要があります...;)

于 2010-11-12T10:05:43.870 に答える
0

「UNIX 環境での高度なプログラミング」の第 2 版では、ターミナル IO の処理に約 40 ページかかります。 \n のように振る舞う追加の文字があります。

stty でこれを試すこともできます

$ cat -
abc\tdef
abc\tdef
^d
$stty eol ^i
abc\tabc\tdef
def
^d

プログラムでの実行方法の例(実際には、エラー処理と終了時、中断時、シグナル時などの元の状態への復元を忘れないでください...そのため、パッケージ化されたライブラリを使用してそれを行う方が良いです、堅牢なアプリケーションに適した詳細がたくさんあります)。

struct termios term;
tcgetattr(STDIN_FILENO, &term);
term.c_cc[EOL] = '\t';
tcsetattr(STDION_FILENO, TCSAFLUSH, &term);
于 2010-11-12T12:33:00.113 に答える