私のコンピュータをよりよく理解し、ツールとして、私はmy own shellをC++で書いています。 Stephen Brennan's article on writing a simple shellは非常に役に立ちました。自分のシェルを書く:コマンド履歴をどのように実装するのですか?
しかし、私は、コマンド履歴をスクロールするために、上向き矢印キーと下向き矢印キーを押して処理する方法を誤解しています。
私は
ncurses
を試してみましたが、システム提供の殻がちょうどターミナルへの書き込み続けるように見えるのに対し、それは、画面全体を置き換えます。私は
tcgetattr
を使用して正準モードをオフにしましたが、入力時に矢印キーを押すと、テキストナビゲーションの左右矢印キーのすべての処理がオフになり、 Ctrl + C ... Ctr-Cに応答して自分自身で信号を送ることができますが、ターミナルでカーソルを戻す方法はわかりません(「戻る」を出力してスタートを書き換えるラインの)。また、私はXcodeの "ダム"ターミナルやMacのTerminal.appで動作しているかどうかによって、キーのエスケープシーケンスが異なるようです。私は
fish
シェルとbash
のソースを見て、ちょうどそんなにが、私は関連する部分を見つけることができないということが起こっていることがあるようです。
どのように標準シェルがキー押しを受信するのですか?彼らはどのようにカーソルの移動とバックスペースを処理するのですか?彼らは画面を乗り越えることなくラインの一部をどのように書き直すのですか?シェルが何をする必要があるかを定義する標準がありますか?
PS - 前のコマンドを記録する方法を知っています。誰かがリターンを押してから、私が仕事に就くことができないのとは対照的に、彼らがタイプされている間、実際にキー押しを取得しています。
使用[GNU readlineの](https://cnswww.cns.cwru.edu/php/chet/readline/rltop.html)または同等の[BSDのeditline](のhttp:// thrysoee.dk/editline/)。 –
Close-voters:更新された質問を読んでいただければ幸いです。 –
実際にどのように実装されているかわかりませんが、シェルが画面全体を書き換えているという疑いがありますncurses')。たとえば、 'bash'でC-lを押すと、画面全体が消去されます。これは、シェルが一度に1行を管理するだけではないことを示唆しています。私は 'readline'のようなライブラリも同様に端末全体を引き継ぐと思います。 –