Festlegen des Fenstertitels für xterm (PuTTY) bei Verwendung des Bildschirms?

12

Ich versuche, screenmeinen xtermTitel festzulegen . Ich arbeite außerhalb davon screen, screenbehalte aber den Titel bei, den ich zu Beginn hatte. Hier ist mein .bashrc:

Funktion bash_prompt_command () {
    # Wie viele Zeichen der $ PWD sollen erhalten bleiben?
    lokales pwdmaxlen = 25
    # Zeigt an, dass Dir abgeschnitten wurde
    local trunc_symbol = ".."
    lokales Verzeichnis = $ {PWD ## * /}
    pwdmaxlen = $ (((pwdmaxlen <$ {# dir})? $ {# dir}: pwdmaxlen))
    NEW_PWD = $ {PWD / # $ HOME / \ ~}
    local pwdoffset = $ (($ {# NEW_PWD} - pwdmaxlen))
    if [$ {pwdoffset} -gt "0"]
    dann
        NEW_PWD = $ {NEW_PWD: $ pwdoffset: $ pwdmaxlen}
        NEW_PWD = $ {trunc_symbol} / $ {NEW_PWD # * /}
    fi

    Exportieren Sie NEW_PWD
}

PROMPT_COMMAND = bash_prompt_command
# Farbkarte @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
case "$ {TERM}" in
    "xterm")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        PS1 = "$ {TITLEBAR} \ [\ e [1; 32 m \] [\ e [0; 36 m \] \ u \ e [1; 32 m \] @ \ e [1; 33 m \] \ h \ e [ 1; 32m \]] \ e [0; 37m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ \ [\ e [0m "
        ;;
    "Bildschirm")
        TITLEBAR = '\ [\ 033] 0; \ u @ \ h> $ {NEW_PWD} \ 007 \]'
        ESC = '\ [\ ek \ e \\\]'
        PS1 = $ {TITLEBAR} \ [\ e [1; 32 m \] [\ e [0; 36 m \] \ u \ e [1; 32 m \]] \ e [0; 37 m \] \ $ {NEW_PWD} / \ e [1; 32m \] \ $ $ {ESC} \ [\ e [0m "
        ;;
    *)
        PS1 = [\ e [1; 32 m \] [\ e [0; 36 m \] \ u \ e [1; 32 m \] @ \ e [1; 33 m \] \ h \ e [1; 32 m \ ]] \ e [0; 37 m \] \ $ {NEW_PWD} / \ e [1; 32 m \] \ $ \ [\ e [0 m "
    ;;
esac

Und hier ist meine .screenrc:

hardstatus alwayslastline
Hardstatus-Zeichenfolge '% {= 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 ein
Shelltitel '$ | bash'

Was mache ich falsch?

Update (19. August 2010): Das Problem besteht darin, dass Sie den Titel des Terminals nicht über den Bildschirm aktualisieren können, wenn Sie dies festlegen alwayslastline. Meine Lösung bestand also darin, auf einen bestimmten, nützlichen Titel für meine Bildschirmsitzungen zu verzichten und sich damit abzufinden. Mein aktualisiertes .bashrcund .screenrckann bei http://bitbucket.org/jsumners/rcfiles/src gefunden werden .

James Sumners
quelle

Antworten:

4

Die Escape-Codes sind auf dem Bildschirm unterschiedlich .

Dies außerhalb des Bildschirms:

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

ist äquivalent zu diesem inneren Bildschirm:

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

Ändern Sie die Titelleiste $ {TERM} = "screen" in

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

wird dein Problem lösen.

crb
quelle
Das funktioniert nicht. Ich verstehe nicht warum.
James Sumners
Ich habe festgestellt, dass die Einstellung, hardstatus alwayslastlinedie ich für screenvornehme, das screenFestlegen des xtermTitels verhindert. Nun, wenn ich nur herausfinden kann, wie man beides gleichzeitig macht.
James Sumners
Liegt es daran, dass Ihr Hardstatus% t (für Titel) enthält?
Crb
Nee. Entferne das einfach und erhalte das gleiche Ergebnis. Ich glaube, ich muss einen Alias ​​für screenden Fenstertitel festlegen und dann das Programm starten. Und dann verzichten Sie einfach auf dynamische Terminaltitel screen. :(
James Sumners
1
bugs.launchpad.net/byobu/+bug/338722/comments/10 sagt es eine Einschränkung in Bildschirm ist
agnul
7

Tatsächlich gibt es eine Möglichkeit, Escape-Sequenzen direkt über den Bildschirm an das xterm zu senden. Es war nicht leicht zu finden, aber vom Bildschirmcode (src / ansi.c) aus glaube ich, dass es seit 2005 da ist. Ich habe es in xterm, Gnome Terminal und Putty. Ich habe in mintty source eine Notiz gefunden, die besagt, dass es dort nicht funktioniert, nur weil sie nicht mit DCS umgehen (es sei denn, es wurde kürzlich behoben).

In der Dokumentation zum Bildschirm unten (unter 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.

Der ANSI-DCS-Code (Device Control String) ist ein Escape-Code, der zum direkten Senden an ein Terminal verwendet wird (ich glaube, dies war der ursprüngliche Zweck vor vielen Jahren). Ein solcher String wird mit einem ST-Escape-Code (String Terminator) abgeschlossen.

Wickeln Sie die Zeichenfolge ein, um den Fenstertitel des Terminals in einem DCS..ST-Block festzulegen. Die Zeichenfolge durchläuft den Bildschirm und wird korrekt aktualisiert, auch wenn hardstatus alwayslastline verwendet wird.

DCS = \ 033P, ST = \ 033 \

Beispiel - Um den Fenstertitel mit dem aktuellen Arbeitsverzeichnis zu aktualisieren, verwenden Sie

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

Besser spät als nie! Hoffe das hilft jemandem.

Nur für den Fall, dass ich mich bei den Änderungen an der Bildschirmquelle irre: Ich verwende das neueste von Screen-Session-Git, das wiederum fast das neueste von Screen-Git verwendet (mit einigen Änderungen, die für Screen-Session spezifisch sind). Die Protokollnachrichten stammen jedoch aus dem Bildschirm 2005 (Sie können die an diesem Commit vorgenommenen Änderungen in Bezug auf die DCS-Verarbeitung sehen, wenn Sie das Bildschirm-Git-Repo klonen und den folgenden Befehl verwenden).

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

crb ist irgendwie richtig, aber

a) Der von ihm verwendete Escape-Code funktioniert bei mir nicht. Es sollte \033kstatt \033_. Siehe screen (1)unter "TITLES (naming windows)". So sollte es sein:

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

b) Diese Art des Escapings wird nur zum Setzen des Fenstertitels verwendet. Eine Instanz des Bildschirms kann mehrere Fenster haben, von denen jedes einen Namen hat. Dies ist das, was in hardstatusund captionmit der tEscape-Sequenz angezeigt wird.

c) Das normale Bash-Escape funktioniert, wenn Sie den richtigen Terminfo für xterm in setzen .screenrc:

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

(dies auch works on my machinefür Kitt)

Um den richtigen Titel sowohl für das Bildschirmfenster als auch für den Putty / Xterm-Titel festzulegen, verwende ich Folgendes:

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

Als Referenz: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html

0x89
quelle
1

Ich werde die Frage nicht vollständig beantworten, aber ich möchte vorschlagen, wie das Problem gelöst werden kann. Viele Fenstermanager unterstützen die EWMH- Spezifikation. Es gibt auch ein Befehlszeilen-Tool, wmctrldas mit ihnen interagieren kann. Mit diesem Tool kann der Titel des aktiven Fensters einfach mit dem folgenden Befehl geändert werden:

  wmctrl -r :ACTIVE: -T "FooTitle"

Es ist auch möglich, Fenstersymbol, Layout und andere Eigenschaften zu ändern. Das Tool wird wahrscheinlich nicht für PuTTY funktionieren, da Windows EWMH nicht unterstützt, aber die meisten Linux-Systeme sollten es akzeptieren.

Bei dieser Methode spielt es keine Rolle, ob Sie verwenden screenoder nicht.

grwlf
quelle
0

In den letzten 2 Wochen habe ich viele Foren durchsucht und die Antwort auf die Frage nicht gefunden:

Wie bekomme ich alle Befehlsausgaben in den Putty-Titel?

Benötigt, damit andere Programme wissen, wann einige Aufträge auf einem Server ausgeführt wurden und ob sie richtig oder falsch ausgeführt wurden. Plink stdout und stdin funktionierten nicht, ich benutzte viele Optimierungen mit Wartezeiten und für einige Befehle, die für andere nicht funktionierten. XSEL und XCLIP konnten auf diesem Server nicht installiert werden.

Also hier ist die Lösung:

  1. Kommandoausgabe in eine Datei holen.
  2. Echo diese Datei zum Titel.

Auf Putty Client und Suse Server sieht es so aus:

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

Hoffentlich kann das jemand nutzen. Es wird natürlich nicht für alle Servertypen und Putty-Client-Einstellungen funktionieren, aber die Idee sollte gut funktionieren.

Jacek Domagała
quelle