画面の使用時にxterm(PuTTY)ウィンドウのタイトルを設定しますか?


12

タイトルscreenを設定しようとしていますxterm。私はこれをの外で機能させていますがscreenscreen開始時にタイトルを保持していました。ここに私の.bashrc

関数bash_prompt_command(){
    #$ PWDの文字をいくつ保持するか
    ローカルpwdmaxlen = 25
    #dir切り捨てがあったことを示す
    ローカルtrunc_symbol = ".."
    ローカルdir = $ {PWD ## * /}
    pwdmaxlen = $(((pwdmaxlen <$ {#dir})?$ {#dir}:pwdmaxlen))
    NEW_PWD = $ {PWD /#$ HOME / \〜}
    ローカルpwdoffset = $(($ {#NEW_PWD}-pwdmaxlen))
    if [$ {pwdoffset} -gt "0"]
    それから
        NEW_PWD = $ {NEW_PWD:$ pwdoffset:$ pwdmaxlen}
        NEW_PWD = $ {trunc_symbol} / $ {NEW_PWD#* /}
    fi

    NEW_PWDをエクスポート
}

PROMPT_COMMAND = bash_prompt_command
#カラーチャート@ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
ケース「$ {TERM}」
    「xterm」)
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        PS1 = "$ {TITLEBAR} \ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \] @ \ e [1; 33m \] \ h \ e [ 1; 32m \]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ \ [\ e [0m "
        ;;
    "画面")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        ESC = '\ [\ ek \ e \\\]'
        PS1 = "$ {TITLEBAR} \ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ $ {ESC} \ [\ e [0m "
        ;;
    *)
        PS1 = "\ [\ e [1; 32m \] [\ e [0; 36m \] \ u \ e [1; 32m \] @ \ e [1; 33m \] \ h \ e [1; 32m \ ]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ \ [\ e [0m "
    ;;
エサック

そして、ここに私の.screenrc

hardstatus alwayslastline
hardstatus文字列 '%{= kg} [%{Y}%H%{g}] [%=%{= kw}%?%-Lw%?%{= b kR}(%{W}%n-% t%?(%u)%?%{= b kR})%{= kw}%?%+ Lw%?%?%=%{g}] [%{Y}%l%{g}]% {g} [%{B}%m。%d。%Y%{G}%c%{g}] '

termcapinfo xterm | xterms | xs | rxvt ti @:te @
termcapinfo xterm 'hs:ts = \ E] 2;:fs = \ 007:ds = \ E] 2; screen \ 007'

altscreenオン
shelltitle '$ | bash'

私は間違って何をしていますか?

更新(2010年8月19日): 問題は、を設定しalwayslastlineたときに画面内から端末のタイトルを更新できないことです。そのため、私の解決策は、スクリーンセッションの事前に決められた有用なタイトルをあきらめて決着することでした。私が更新し.bashrchttp://bitbucket.org/jsumners/rcfiles/src.screenrcで見つけることができます。

回答:


4

画面内ではエスケープコードが異なります

この画面外:

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

この内部画面と同等です:

PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME}: ${PWD}\033\\"'

ケース$ {TERM} = "screen"タイトルバーを変更

TITLEBAR='\[\033_\u@\h > ${NEW_PWD}\033\\\]'

あなたの問題を解決します。


これは機能しません。理由がわかりません。
ジェームズサムナーズ

私がするように設定することで、タイトルを設定できないhardstatus alwayslastlineようにしました。今、両方を同時に行う方法を理解できる場合。screenscreenxterm
ジェームズサムナーズ

hardstatusに%t(タイトル用)が含まれているからですか?
crb 09

いや。それを削除して同じ結果を得てください。screenウィンドウタイトルを設定し、プログラムを起動するためのエイリアスを設定する必要があると思います。そして、を使用してscreenいる間は動的な端末タイトルをあきらめます。:(
ジェームズサムナーズ

1
bugs.launchpad.net/byobu/+bug/338722/comments/10は、それが画面の制限だと言っています
agnul 09

7

実際には、エスケープシーケンスをxtermに直接送信して、画面を通過させる方法があります。見つけるのは簡単ではありませんでしたが、画面のコード(src / ansi.c)からは、2005年から存在していたと思います。xterm、Gnomeターミナル、およびパテで動作しています。minttyソースで、DCSを処理しないという理由だけで機能しないことを示すメモを見つけました(最近修正されていない限り)。

以下の画面のドキュメントから(http://www.gnu.org/software/screen/manual/html_node/Control-Sequences.html

ESC P (A) Device Control String
          Outputs a string directly to the host terminal without interpretation.

ANSI DCS(デバイス制御文字列)は、端末に直接送信するために使用されるエスケープコードです(これは何年も前からの本来の目的だったと思います)。このようなストリングは、STエスケープコード(ストリングターミネーター)で終了します。

文字列をラップして端末のウィンドウタイトルをDCS..STブロック内に設定すると、画面を通過して、hardstatus alwayslastlineであっても正しく更新されます。

DCS = \ 033P、ST = \ 033 \

例-現在の作業ディレクトリでウィンドウのタイトルを更新するには、次を使用します

NEW_TITLE="\033]0;${PWD/$HOME/~}\007"
echo -ne "\033P${NEW_TITLE}\033\\"

絶対に遅れるよりはましです!これが誰かを助けることを願っています。

画面ソースの変更について間違っている場合に備えて、screen-session gitから最新のものを実行していますが、screen gitからほぼ最新のものを使用しています(screen-sessionに固有のいくつかの変更を使用)。ただし、ログメッセージは2005年の画面から日付が付けられています(画面のgitリポジトリを複製して以下のコマンドを使用すると、DCSの処理に関してそのコミットに加えられた変更を確認できます)。

git clone git://git.savannah.gnu.org/screen.git
git difftool e6618a14^! src/ansi.c

1

crbは一種の権利ですが、

a)彼が使用するエスケープコードは私には機能しません。の\033k代わりになり\033_ます。screen (1)下を参照してください"TITLES (naming windows)"。したがって、次のようになります。

PROMPT_COMMAND='echo -ne "\033k${USER}@${HOSTNAME}: ${PWD}\033\\"'

b)この種のエスケープは、スクリーンウィンドウのタイトルの設定にのみ使用されます。画面の1つのインスタンスは、表示されているものであること、それらのそれぞれが名前を持つ、複数のウィンドウを持つことができるhardstatuscaptionしてtエスケープシーケンス。

c)でxtermに正しいterminfoを設定すると、通常のbashエスケープが機能します.screenrc

termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

(これもworks on my machineパテ用)

したがって、画面ウィンドウとputty / xtermタイトルの両方に適切なタイトルを設定するには、次のようなものを使用します。

XTERM_TITLE="${USER}@${HOSTNAME}: ${PWD}"
SCREEN_TITLE="${PWD}"
PROMPT_COMMAND='echo -ne "\033]0;$XTERM_TITLE\007\033k$SCREEN_TITLE\033\\"'

参照用:http : //tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html


1

質問に完全に答えるつもりはありませんが、問題を解決する方法を提案させてください。多くのウィンドウマネージャーはEWMH仕様をサポートしています。またwmctrl、それらと対話できるコマンドラインツールもあります。このツールを使用すると、次のコマンドを使用してアクティブウィンドウのタイトルを簡単に変更できます。

  wmctrl -r :ACTIVE: -T "FooTitle"

また、ウィンドウアイコン、レイアウト、その他のプロパティを変更することもできます。WindowsはEWMHをサポートしていないため、このツールはおそらくPuTTYで動作しませんが、ほとんどのLinuxシステムはそれを受け入れます。

この方法では、使用するかどうかは関係ありませscreenん。


0

過去2週間、私は多くのフォーラムを検索しましたが、質問に対する答えが見つかりませんでした。

すべてのコマンド出力をPuttyタイトルに取得する方法は?

他のプログラムがサーバー上のいくつかのジョブがいつ完了し、それが正しいか間違っているかを知るために必要でした。Plink stdoutとstdinは機能していませんでした。待機遅延を伴う多くの調整と、他のコマンドでは機能しないコマンドを使用しました。XSELとXCLIPをそのサーバーにインストールできませんでした。

だからここに解決策があります:

  1. コマンド出力をファイルに取得します。
  2. そのファイルをタイトルにエコーします。

パテクライアントとスーズサーバーでは、次のようになります。

ls /home | grep domagaja > logutoit.txt 
echo -e "\033]0\\;$(cat logutoit.txt)\\007\\c"

うまくいけば誰かがこれを使用できるようになります。もちろん、すべてのサーバータイプとパテクライアント設定で機能するわけではありませんが、アイデアはうまく機能するはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.