したがって、基本的にユーザー入力の文字を読み取り、「q」が入力されるまでそれらを出力する次のコードがあります。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<termios.h>
int main(void) {
char c;
static struct termios oldtio, newtio;
tcgetattr(0, &oldtio);
newtio = oldtio;
newtio.c_lflag &= ~ICANON;
newtio.c_lflag &= ~ECHO;
tcsetattr(0, TCSANOW, &newtio);
printf("Give text: ");
fflush(stdout);
while (1) {
read(0, &c, 1);
printf("%c", c);
fflush(stdout);
if (c == 'q') { break; }
}
printf("\n");
tcsetattr(0, TCSANOW, &oldtio);
return 0;
}
メイン関数の冒頭で、正規モードをオフにして、ユーザーが自分の入力を表示できるようにします。また、エコーをオフにして、たとえば上矢印キーを押したときに「^[[A」のようなものがポップアップしないようにします。これは機能しますが、端末ウィンドウの上部の行にカーソルを移動することもできますが、これは良くありません。ユーザーが現在の行内でのみ移動できるように、これを修正する方法はありますか?
別の問題は、バックスペースです。それを押すと、プログラムはカーソルの現在の位置に残っている文字を消去する代わりに、奇妙な記号 (0x7f と思われます) を出力します。プログラムで何らかの方法でバックスペース キーの出力を適切に処理する必要がありますが、この奇妙な 16 進数であるため、その方法がわかりません。これに関するヒントはありますか?
これを機能させるために私が考えていたオプションの 1 つは、正規モードを使用して、矢印キーとバックスペース機能が自動的に使用されるようにすることです。ただし、標準モードは行ごとに機能するため、ユーザーが「Enter」を押すまでテキストは表示されません。これまでのところ、入力中にユーザーに自分の入力を表示させる方法はわかりませんでした。これは可能ですか?
そして、ncurses や readline の提案はしないでください。termios.h を使用してこれを行いたいです。