4

ZSHシェルプロンプトを描画する関数内から、現在のカーソル位置(現在の行番号と列)を変数に読み込もうとしています。私の目標は、余分なスクロールを引き起こさないように十分な空行がある場合にのみ、プロンプトの下に表示することです。

インタラクティブ シェルでは、次のコマンドを使用できます。

echo -ne "\033[6n"
read -t 1 -s -d 'R' line
line="${line##*\[}"
line="${line%;*}"
echo "XX $line XX"
# Prints: XX 2 XX"

ただし、 clean を開始し、zsh -fこれをプロンプトのレンダリング時に実行される関数に入れると、機能しなくなります。

setopt prompt_subst
prompt_fn(){
  echo -ne "\033[6n"
  read -t 1 -s -d 'R' line
  line="${line##*\[}"
  line="${line%;*}"
  echo "XX $line XX"
}
PROMPT='`prompt_fn` '

端末から返された ANSI エスケープ シーケンスは、現在のコマンドに追加されます (キーボードで入力したかのように) が、read -t 1 -s -d 'R' line上記のコマンドでは取り込まれません。プロンプトの描画中に ZSH が STDIN へのアクセスを無効にしていると思われますが、一時的にアクセスを回復する方法がわかりません (プロンプトを描画する前、またはプロンプトを描画するのにかかる 10 分の 1 秒の間に入力された通常のキーボード キーストロークは、または、ZLE を使用してその情報にアクセスする方法。

編集:プロンプトが表示される前にユーザーがコマンドの先頭を既に入力している場合、その入力は破棄されるべきではありません。私がこれまでに見つけた解決策 (以下の私自身の回答を参照) は、残念ながらこれらの文字を読み取ってドロップします。新しいターミナル ウィンドウを開いてすぐに入力を開始すると、プロンプトが表示される前に入力した文字が破棄されるため、これはイライラします。

4

2 に答える 2