Bash機能によりMC起動時間が長くなる

Bash機能によりMC起動時間が長くなる

bashコマンドの後に改行を保証する次の関数があります。

user at terra in ~
$ echo "m"
m
user at terra in ~
$ echo -n "m"
m↵

関数自体は次のとおりです.bashrc

function prompt_command {
    # get cursor position and add new line if we're not in first column
    echo -en "\033[6n" && read -sdR CURPOS
    [[ ${CURPOS##*;} -gt 1 ]] && echo "$(tput setab 1)↵$prompt_reset"
}
PROMPT_COMMAND=prompt_command

私がPROMPT_COMMAND設定すると、MCは10〜30秒ほど始まりますが、コメントするとほとんどすぐに始まります。

なぜこれが起こるのですか?この問題を無効にせずにどのように解決できますか?

strace、もう少しよく見てください13:59:06。 9秒遅れがあります...(通常)strace比較しよう)

答え1

私が理解したのは、標準入力の入力を待っています。

`3021  13:58:57 read(0,  <unfinished ...>
3019  13:59:06 <... select resumed> )   = 0 (Timeout)`

それが何をしているのかを見つけなければなりません。しかし、私の推測は次のとおりです。

read -sdR CURPOS

read問題を解決したりタイムアウトを変更したりするには、それを削除できます。

答え2

MCは端末でbashを実行します。 MCは実行中の端末と同じ値に設定されますが、TERMサブシェルと端末間の一部の交換をバッファリングまたはフィルタリングしているようです。

Bash が MC の直系サブプロセスとして実行されている場合は、別のカスタマイズを使用したい場合があります。 MCの粗いシェルはプロンプト行だけを表示するので、カーソル位置について心配する必要はありません。体系的に改行を追加するだけです。

if [[ "$(ps -o comm= -p $PPID)" == "mc" ]]; then
  PS1=$'\n'$PS1
else
  function prompt_command {
    # get cursor position and add new line if we're not in first column
    echo -en "\033[6n" && read -sdR CURPOS
    [[ ${CURPOS##*;} -gt 1 ]] && echo "$(tput setab 1)↵$prompt_reset"
  }
  PROMPT_COMMAND=prompt_command
fi

関連情報