GNU画面にタイトルを強制する


9

デフォルトでは、スクリーンセッションのタイトルは、最後に入力されたコマンドの名前です。これは私には問題ありませんが、場合によっては変更したいことがあります。私は、コマンドを知っているCtrl- A Aが、それだけで次のコマンドまでのタイトルを変更し、私は私がそうでなければ決定するまで、それはそこに滞在したいと思います。

編集:これpreexec私が見つけた機能です.zshrc

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek$CMD\e\\"
fi

回答:


9

設定方法によって異なりますが、デフォルトでは、このようなものが機能するはずです。

settitle() {
    printf "\033k$1\033\\"
}

次に実行します:

settitle NEWTITLE

詳細については、画面タイトルのドキュメントGNU画面に関するFAQ をご覧ください。

与えられたCtrl+するA Aだけで、次のコマンドまでそれを変更している、それはおそらくによって設定されています$PS1(すべてのシェル)、または$PROMPT_COMMAND/ DEBUG trap(bashの場合のみ)またはprecmd/ preexec(のみのzsh)。

あなたはそれを任意の場所を探す必要があります\eまたは\033が表示されますkか、\\基本的には私のように、それの後にsettitle、上記の例。

更新

あなたは習慣があると言いましたpreexec

これを次のように変更しないでください:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek${TITLE:-$CMD}\e\\"
fi

次に、次のコマンドを実行してカスタムタイトルを設定できます。

TITLE="my title"

実行してタイトルを設定解除します

TITLE=

必要に応じて変更することprecmdを忘れないでください$PS1

andをハードコーディングしないことxtermgnome-terminal、これをすべての端末(、など)に拡張することもできます。\ek\e\\

これが私のやり方です:

terminit()
{
    # determine the window title escape sequences
    case "$TERM" in
    aixterm|dtterm|putty|rxvt|xterm*)
        titlestart='\033]0;'
        titlefinish='\007'
        ;;
    cygwin)
        titlestart='\033];'
        titlefinish='\007'
        ;;
    konsole)
        titlestart='\033]30;'
        titlefinish='\007'
        ;;
    screen*)
        # status line
        #titlestart='\033_'
        #titlefinish='\033\'
        # window title
        titlestart='\033k'
        titlefinish='\033\'
        ;;
    *)
        if type tput >/dev/null 2>&1
        then
            if tput longname >/dev/null 2>&1
            then
                titlestart="$(tput tsl)"
                titlefinish="$(tput fsl)"
            fi
        else
            titlestart=''
            titlefinish=''
        fi
        ;;
    esac
}


# or put it inside a case $- in *i* guard
if test -t 0; then
    terminit
fi

# set the xterm/screen/etc. title
settitle()
{
    test -z "${titlestart}" && return 0

    printf "${titlestart}$*${titlefinish}"
}

次に、次のように変更できますpreexec

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   settitle "${TITLE:-$CMD}"
fi

あなたが与えるコマンドはと全く同じことをしCtrl-A Aます。プロンプトについては$PS1、タイトルを変更しない場合はいつでも変更する必要があるということですか?
gregseth 2011

つまり、ESC k何かESC \が含まれていないことを確認します。同上PROMPT_COMMAND。
ミケル

ESCは書くことができます\e\033
ミケル

画面タイトルのドキュメントリンクには必要な情報が含まれているはずです
Mikel

5

ウィンドウのタイトルが現在ウィンドウで実行されているアプリケーションを反映している場合は、シェルがそうしているためです。それを行っているのは、ディストリビューション、システム管理者、またはユーザーが設定したためです。

コマンドの実行中にコマンドがウィンドウタイトルとして表示される場合、これはpreexec(zshの)関数、またはbashでのエミュレーションによって行われます。

各コマンドの完了時にタイトルが変わる場合、これはprecmdzsh の関数PROMPT_COMMAND、bash のパラメーター、またはPS1シェルのプロンプト(パラメーター)の一部として行われます。(タイトルを変更するコマンドは、端末の出力ストリームの一部としてアプリケーションによって発行されるエスケープシーケンスであるため、プロンプトに埋め込むことができます。)

以下のようなエスケープシーケンスを探し\e]0;new title\a\e]2;new title\aまたは\eknew title\e\\あなたのシェル初期化ファイルに(~/.bashrc~/.zshrc、...)。何も関係がない場合、設定はシステムファイル(/etc/bash.bashrcなど/etc/zsh/zshrc)にある可能性があります。次に、独自の初期化ファイルでそのパラメーターまたは関数を上書きします。

でのオーバーライド可能なタイトル設定については、Mikelの回答を参照してくださいpreexec


ありがとう、あなたはそれを非常に明確にしました。実際preexec、.zshrcで定義されている関数を見つけました。問題は、それが私が望む行動です...ほとんどの場合です。特定の画面でオンザフライで無効にできるようにしたいのですが。preexecタイトルを手動で設定したときに関数で取得できる変数があるのでしょうか?
gregseth 2011

@gregseth:一般的に説明するのは少し難しいですが、preexec関数を投稿した場合、私または他の誰かがおそらく簡単な変更を提案できます。
Gilles 'SO-悪をやめる'

私は言及しようとしてpreexecいたが、グレッグは彼が使用しているとは言わなかったzsh。それが教えてくれます。;-)
ミケル

@Mikel:私の説明はあなたの説明よりも優れていましたが、あなたの新しいpreexecデザインは私の説明よりも優れています。
Gilles「SO-邪悪なことをやめなさい」

同意する。:-)私の最初の答えは、OPに自分で答えを見つけるように教えることでした。あなたの方がすぐに役に立ちました。いずれにせよ、我々全員が勝つ。
ミケル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.