Zsh: Vared 組み込みタイムアウト

Zsh: Vared 組み込みタイムアウト

私はwhileループを使用しています。varedユーザーに入力するように求められます。タイムアウトを設定し、デフォルト変数を実行し、一定時間が経過してもユーザー入力がない場合は、プロンプトに戻る方法を探しています。読み取りコマンドとそのタイムアウトパラメータについて知っていますが、これは通過可能ですかvared

varedまた、プロンプトに印刷されないようにデフォルト値を設定する方法はありますか?

local command

while :

   do
     echo "Enter a command or type 'quit' to exit:"
     vared -p "[*]: " command

     if [ "$command" = "quit" ]; then
         break

     else
         run command
     fi

     clear

   done

答え1

次のことができます。

default=foobar
if
  command=$(
    saved_settings=$(stty -g)
    trap 'stty $saved_settings; exit 1' ALRM
    v=
    TMOUT=10 vared -p "Enter a command [$default]: " v &&
      printf %s $v
  )
then
  command=${command:-$default}
  printf 'Got: "%s"\n' $command
else
  print timeout
fi

変える始めるデフォルト値を持つ変数は空の文字列で埋められ、戻っvaredても変数がまだ空の場合にのみデフォルト値に設定されます。

タイムアウトを処理するには、$TMOUTサブシェルで特殊変数を使用します。この変数は、zleサブシェルが数秒後に終了するようにします$TMOUT

これは10秒のグローバルタイムアウトです。もう1つのアプローチは、ユーザーに大きなコマンドを入力するのに十分な時間を提供しますが、3秒間アクティビティがない場合は、タイムアウトするターミナル行ルール文字間のタイムアウト(stty time x10分の1としてマーク)を使用することです。x

default=foobar
if
  command=$(
    saved_settings=$(stty -g)
    trap 'stty $saved_settings' EXIT INT TERM ALRM
    zle-line-init() stty -icanon time 30 min 0 <&2
    zle -N zle-line-init
    v=
    vared -p "Enter a command [$default]: " v &&
      printf %s $v
  )
then
  command=${command:-$default}
  printf 'Got: "%s"\n' $command
else
  print
  print timeout
fi

これらの操作はスクリプトで機能しますが、現在、対話型シェルでは機能しません。varedサブシェルでの実行は拒否されるためです。で問題が解決するまでインタラクティブシェルで実行する必要がある場合は、次のようにzsh変更できます。

command=$(
  ...
)

到着

command=$(default=$default zsh -c '
  ...
')

関連情報