私のプログラムがユーザー入力を読むとき、垂直矢印キーは何もしません。行ルールがすべてをコンソールに再反映すると、カーソルは端末の前の行の上に移動しませんか?私の言葉が正しい場合、線の規則が応答しない他の文字はありますか?
ところで、bashが使用していると思います。「オリジナルモード」(これはエコーなどを無効にします。) ただし、実行すると端末がstty -echo
「停止」し、通常のbash実行中にエコーが有効になったことを示します。
Zshはこれらの動作を示していませんが、そのためのようです。エコフラグリセットコマンドが終了したとき。
答え1
「私のプログラム」が何を意味するのか、プログラムがターミナルラインの設定をどのように変更するのかわからないと、答えることは困難です。
これはテキストエディタであり、ファイル内のカーソルを移動できます。他のシェルでも、履歴項目をスクロールすることもできます。音量を上げたり下げたりするオーディオコントロールソフトウェアです。など。
このような場合、行ルールは元の形式に再エコーせずにバイトを人間が読めるテキストと文字に変換するために表示され、表示されsleep 1000
ます^[[A
。^[[B
ESC
^
[
cat
裏面をクリックすると、カーソルが垂直Enterに移動していることがわかります。遅延の理由は、ラインの弟子がアプリケーションへの文字転送を遅らせるためです(つまり、cat
入力ライン全体が完了するまで)。カーソルが垂直方向に移動するのは、ラインルールとは無関係で、生データがcat
エコーされるだけであり、矢印キーによって生成された入力エスケープシーケンスがライン上でカーソルを移動するための出力エスケープシーケンスと同じであるためです。方向を教えてください。
答え2
TUIアプリケーションまたはより一般的にキーボード入力自体を処理するアプリケーション持つキーを押したときに送信された文字を読み取って独自の操作を実行する必要があるため、ラインルールの独自のラインエディタ(ICANON
)とローカルエコー()を無効にします。ECHO
echo
これらのアプリケーションは起動時にtermios設定を変更し、終了(または一時停止)したときに復元します。
readline(bashで使用される行エディタ)とzle(zsh行エディタ)も例外ではありません。
このラインエディターここに行くシェルがプロンプトを発行し、停止コマンドを実行するとき。
したがって、他のコマンドを実行すると、stty -a
readline / zleで使用されているtermios設定は表示されず、出発時に復元された設定が表示されます。
有効にすると、ECHO
端末の入力はエコーされますが、制御文字に関して考慮する必要がある2つの異なる点があります。 3番目は矢印キーに関連しています。
ICANON
デフォルトでオンになっていると、ラインルール内のラインエディタは独自のライン編集のためにBSやDELなどのいくつかの制御文字を傍受し^W
ます^U
。 ESC(矢印キーに送信される最初の文字は通常これらの文字ではありません)。- この機能もオンの場合(通常はデフォルトで設定されている)、制御文字はそのままではなくそのまま
ECHOCTL
エコーされます。^X
- 端末は通常、「キーボード転送」モードにあるかどうかにかかわらず、他のエスケープシーケンスを送信できます。
tput smkx
その後、Upキー押下が送信され\eOA
、その後カーソルを上に移動するシーケンス(送信されたものと同じシーケンス)に正確に対応するシーケンスが送信されるtput rmkx
ことがわかります。一部の端末は、キーが押されたときに送信される内容に影響を与える他のモードもサポートしています。ここではこれについて説明しません。\e[A
tput cuu1
したがって、矢印キーを押したときに端末ルールLocal Echoにカーソルを移動させるには、次の手順を実行する必要があります。
tput rmkx; stty -icanon echo -echoctl; cat > /dev/null