web-dev-qa-db-ja.com

正しく設定する方法GNU現在実行中のプログラムをハードステータスで表示する画面

Bashで、現在のプログラムの名前をGNU Screen hardstatus行に表示するには、2つの構成行のみが必要です。最初に、プロンプトの終わりが通常どのように見えるかを画面に通知し、デフォルトを指定しますシェルに座っているときのウィンドウのタイトル:

shelltitle "$ | bash"

次に、このエスケープシーケンスをPS1変数の、通常はプロンプトを終了する文字の前に配置します'$ ' この場合: \033k\033\\

この手法は、ある程度は機能します。ハードステータスウィンドウのタイトルは、現在実行中のプログラムの名前に更新され、実行が終了するとすぐにデフォルトのタイトルに戻ります。ただし、大きな問題の1つは、このエスケープ文字列自体がエスケープされないため、最初の行より長いコマンドで行の折り返しの問題が発生することです。

これは面倒だったので、私は解決策を探し始めました。結局のところ、前のエスケープシーケンスをエスケープするだけで、行の折り返しが修正されます。\[\033k\]\[\033\\\]

すごい!ハードステータスウィンドウのタイトルは、現在実行中のプログラムの名前に更新されたままになり、長いコマンドは2行目に正しく折り返されます。ただし、PS1のこの新しいエスケープシーケンスでは、画面のタイトルが、実行された現在のプログラムの名前だけでなく、入力している実際のコマンドに更新されます。

私は疑問に思っています、誰かがこれを正しく機能させましたか?つまり、行の折り返しとハードステータスウィンドウのタイトルの適切な更新ですか?

3
johnny_bgoode

画面はそのコピーを更新するのに適切な場所ではないと思います。シェル構成から行うのは本当に簡単です。 shellrcファイルでpreexec()関数を定義して、実行する前に実行しようとしている内容の詳細を送信できます。そこから印刷して、現在のウィンドウタイトルを変更するように画面に指示できます。私はbashではなくzshを使用しているので、マイレージは異なりますが、同じことが可能であることもわかっています。 zshrcファイルでの参照用に、次のようなものがあります。

# If running in screen, set the window title to the command about to be executed
preexec() {
    [ -n "$WINDOW" ] && print -Pn "^[k$2^[\\"
}

# If in screen, blank the window title when displaying the Prompt
premd() {
    [ -n "$WINDOW" ] && print -Pn "^[k ^[\\"
}

実際には、コマンドをタイトルとして表示する前に、コマンドのクリーンアップを行います。たとえば、上記のpreexec()でprint -Pn "^[k`echo $2|Perl -pne 's!\s.*/! !g'|cut -c1-16`^[\\"を使用して、実行しようとしている内容に関するよりクリーンな情報を表示できます。これにより、最後のコンポーネントへのパスが削除され、忍者のトリックがいくつか実行されます。

4
Caleb

Bashの作業手順は以下のとおりです。 root userで作業していると仮定します。したがって、shelltitleで使用されます。通常のユーザーの場合は$を使用します

.screenrc

hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
shelltitle '# |bash'

.bashrc

PS1='\u@\h [\w] \$ '

if echo $TERM | grep ^screen -q
then
    PS1='\[\033k\033\\\]'$PS1
fi
1
Pavel Piatruk