私はBashを使用しており、PS1は2行にわたっています。
╭-ivan·dotfiles (master)
╰ဝ █
場合によっては、出力に改行文字がなく、プロンプトが誤ってソートされるコマンドを実行します。
╭-ivan·dotfiles (master)
╰ဝ curl localhost:3002/is_alive
{"web_server_status":"success","db_status":"success"}╭-ivan·dotfiles (master)
╰ဝ █
カーソルが最初の列を超えている場合は、最後にプロンプトの前に条件付き改行を追加するソリューションを見つけました。
build_prompt() {
export PS1="\$(ps1_head)...
}
ps1_head() {
if (( $(cursor_col) > 1 )); then
printf '\n╭-'
else
printf '╭-'
fi
}
cursor_col() {
local _row col
IFS=';' read -s -dR -p $'\033[6n' _row col
echo "${col}"
}
これにより、元の問題が解決されました。
╭-ivan·dotfiles (master)
╰ဝ curl localhost:3002/is_alive
{"web_server_status":"success","db_status":"success"}
╭-ivan·dotfiles (master)
╰ဝ █
しかし、新しいものを紹介します。現在のコマンドが完了する前に、次のコマンドを入力できるようにオートコンプリート機能を使用します。条件付きラップによってこの動作が中断されるようです。
条件付きラップロジックがない例:
╭-ivan·dotfiles (master)
╰ဝ git status
On branch master
Your branch is up-to-date with 'origin/master'.
lnothing to commit, working tree clean
s╭-ivan·dotfiles (master)
╰ဝ ls
myfile.txt
最初のコマンドの出力が印刷を完了する前に()を入力しl
、最初のコマンドが完了した後にプロンプトが印刷される前にそれを入力しました。 typeaheadは、2つの文字()を次のコマンドでエレガントに取得します。lnothing to commit
s
ls
これで、私のプロンプトで条件付きラップロジックを使用するのと同じ例があります。
╭-ivan·dotfiles (master)
╰ဝ git status
On branch master
Your branch is up-to-date with 'origin/master'.
lnothing to commit, working tree clean
s╭-ivan·dotfiles (master)
╰ဝ s
bash: s: command not found
今回は、typeaheadがどのようにs
2番目のコマンドをエレガントにインポートしますが、後ろに残るのかを確認してくださいl
。
これをよりエレガントに処理する方法はありますか?それとも最終的にzshに切り替える必要がありますか?
答え1
このような動的なプロンプトテキストがありますが、オートコンプリートには問題ありません。ただし、セットアップメソッドPS1
の呼び出しにプロセスの置き換えを直接含めませんでした。PROMPT_COMMAND
適切な動的テキストを生成し、それを変数に保存してからPS1
。
それでは、これを試してみてください...
export ps1_head_text
build_prompt() {
export PS1="\${ps1_head_text}..."
}
ps1_head() {
if (( $(cursor_col) > 1 )); then
ps1_head_text=$'\n'╭-
else
ps1_head_text=╭-
fi
}
export PROMPT_COMMAND=ps1_head
私はプロセスの置き換えに問題があったので、最終的にこれを行うようになりました。 (たとえこれがあらかじめ入力されたのか他のものなのかは覚えていないが)。
編集する:今考えてみるとタイミングの問題があるかもしれません。PROMPT_COMMAND
カーソル位置が正しく読み取れない時間に if が呼び出されています。これが発生した場合は、「zshを使用」を選択できます。しかし、一度試してみてください。
修正する:によるとdave_thompson_085でコメントエスケープシーケンス(カーソル位置を印刷するために使用されます)放出に対する応答を読み取ると、オートコンプリート機能と競合する可能性があります。
オートコンプリートテキストが入力されたのと同じシェルから読み取られるので、これは意味があります。それでは、同じシェルで実行されないとどうなりますか?かっこを使ってサブシェルに入れるのは役に立ちますか?端末から応答をリダイレクト(ファイルやパイプなど)してそこから読むのはどうですか?
この問題を解決する方法があるようで、壁にいくつかのものを投げて何が付くのかを確認しました。