redraw-current-line
キーストロークのマッピングを使用する方法の多くの説明に触れましたが、bind
ユーザーがキーストロークを入力せずに他の理由(タイマー、バックグラウンドタスクなど)のプロンプトを再描画したいと思います。簡単だと思いましたが、何も見つけられません。ありがとうございます!
答え1
私は同じ問題に直面しましたが、満足のいくものが見つからなかったので、ここにいくつかの解決策があります。
${PS1@P}
最新のbashバージョンでは、独自の印刷プロンプトを使用できますecho "${PS1@P}"
。変数拡張の形式は、${var@P}
変数内のプロンプトエスケープ文字を拡張することを意味します。
kill -WINCH "$$"
もう一度試すことができる方法は、kill your shellを使用することですSIGWINCH
。これにより、readlineはプロンプトを再描画します。例:
$ (sleep 2; echo foo; sleep 2; kill -WINCH "$$") &
[1] 2295
<immediately press l and s; the "foo" text will mess up the current line>
$ lsfoo
<after 1s the prompt is redrawn again without the parasitic text>
$ ls
ioctl(TIOCSTI)
もう1つのトリックは、通常どおりredraw-current-line
未使用のキーをバインドしてから、TIOCSTI
ioctlを使用してそのキーをシミュレートすることです(追加の権限なしで動作し続けます)。現在のLinuxではtty)。しかし、C、Perl、Pythonなどが必要です。
$ bind '"\xff": redraw-current-line'
$ redraw_current_line(){ perl -e 'ioctl STDIN, 0x5412, $x = "\xff"' </dev/tty; }
$ (sleep 2; echo foo; sleep 2; redraw_current_line) &
.... same as in SIGWINCH example ...
この最後のヒントはLinuxでのみ機能します。TIOCSTI
ioctl番号は、それをサポートする他のシステムとは異なる場合があります。
メモ:require "sys/ioctl.h"
誰かが私がioctl番号を直接リンクする必要があると思うなら:いいえ、できません。。偶然に働いてもこれこの場合、Perlh2ph
はボーキングされ、.ph
ファイルは次のようになります。いいえ使用:
$ perl -e 'require "sys/ioctl.ph"; printf "%x\n", TIOCGPTN()'
80005430
$ cc -include stdio.h -include sys/ioctl.h -xc - \
<<<'int main(){printf("%lx\n",TIOCGPTN);}' -o /tmp/foo && /tmp/foo
80045430
実際の追加ビットに注意してください80045430
。80005430