Impostare il titolo della finestra xterm (PuTTY) quando si usa lo schermo?


12

Sto cercando di arrivare screena stabilire il mio xtermtitolo. Ho questo lavoro al di fuori di screen, ma screenmantiene qualsiasi titolo fosse a posto quando l'ho iniziato. Ecco il mio .bashrc:

funzione bash_prompt_command () {
    # Quanti caratteri di $ PWD devono essere mantenuti
    pwdmaxlen locale = 25
    # Indica che c'è stato un troncamento diretto
    local trunc_symbol = ".."
    dir locale = $ {PWD ## * /}
    pwdmaxlen = $ ((((pwdmaxlen <$ {# dir})? $ {# dir}: pwdmaxlen))
    NEW_PWD = $ {PWD / # $ HOME / \ ~}
    local pwdoffset = $ (($ {# NEW_PWD} - pwdmaxlen))
    if [$ {pwdoffset} -gt "0"]
    poi
        NEW_PWD = $ {NEW_PWD: $ pwdoffset: $ pwdmaxlen}
        NEW_PWD = $ {} trunc_symbol / $ {NEW_PWD # * /}
    fi

    esporta NEW_PWD
}

PROMPT_COMMAND = bash_prompt_command
# Color chart @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
caso "$ {TERM}" in
    "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 "
        ;;
    "schermo")
        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 "
    ;;
esac

Ed ecco il mio .screenrc:

hardstatus alwayslastline
stringa 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; schermo \ 007'

sempre acceso
shelltitle '$ | bash'

Cosa sto facendo in modo errato?

Aggiornamento (19 agosto 2010): il problema è che non è possibile aggiornare il titolo del terminale dalla schermata durante l'impostazione alwayslastline. Quindi la mia soluzione era quella di arrendermi e accontentarmi di un titolo predeterminato, utile, per le mie sessioni sullo schermo. Il mio aggiornato .bashrce .screenrcpuò essere trovato su http://bitbucket.org/jsumners/rcfiles/src .

Risposte:


4

I codici di escape sono diversi all'interno dello schermo .

Questo al di fuori dello schermo:

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

è equivalente a questo schermo interno:

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

Modifica del caso $ {TERM} = barra del titolo "schermo" in

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

risolverà il tuo problema.


Questo non funziona. Non capisco perché.
James Sumners,

Ho determinato che l'impostazione hardstatus alwayslastlinecome faccio per screenimpedisce screendi impostare il xtermtitolo. Ora se riesco solo a capire come fare entrambi allo stesso tempo.
James Sumners,

È perché il tuo hardstatus ha% t (per il titolo) in esso?
crb,

No. L'ho appena rimosso e ottieni lo stesso risultato. Credo che dovrò impostare un alias per screenimpostare il titolo della finestra e quindi avviare il programma. E poi rinuncia a titoli di terminali dinamici durante l'utilizzo screen. :(
James Sumners,

1
bugs.launchpad.net/byobu/+bug/338722/comments/10 afferma che è una limitazione sullo schermo
agnul

7

In realtà, c'è un modo per inviare sequenze di escape direttamente all'xterm, passando attraverso lo schermo. Non è stato facile da trovare, ma dal codice dello schermo (src / ansi.c) penso che sia stato lì dal 2005. Ho funzionato in xterm, Gnome Terminal e putty. Ho trovato una nota nella fonte mintty che indica che non funziona lì semplicemente perché non gestiscono DCS (a meno che non sia stato corretto di recente).

Dalla documentazione per la schermata seguente (all'indirizzo 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.

L'ANSI DCS (Device Control String) è un codice di escape che viene utilizzato per inviare direttamente a un terminale (penso che fosse lo scopo originale di molti anni fa). Tale stringa viene terminata con un codice di escape ST (String Terminator).

Avvolgere la stringa per impostare il titolo della finestra del terminale all'interno di un blocco DCS..ST, che passa attraverso lo schermo e si aggiorna correttamente, anche con hardstatus alwayslastline.

DCS = \ 033P, ST = \ 033 \

Esempio: per aggiornare il titolo della finestra con la directory di lavoro corrente, utilizzare

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

Meglio tardi che mai! Spero che questo aiuti qualcuno.

Nel caso in cui mi sbagli sulle modifiche alla sorgente dello schermo: sto eseguendo l'ultimo da Git della sessione dello schermo, che a sua volta sta usando quasi l'ultimo di GIT dello schermo (con alcune modifiche specifiche per la sessione dello schermo). Ma i messaggi di registro sono datati dalla schermata del 2005 (puoi vedere le modifiche apportate a quel commit riguardo alla gestione di DCS se cloni lo screen git repo e usi il comando qui sotto).

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

1

crb ha ragione, ma

a) il codice di escape che usa non funziona per me. Dovrebbe essere \033kinvece di \033_. Vedi screen (1)sotto "TITLES (naming windows)". Quindi dovrebbe essere:

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

b) questo tipo di escape viene utilizzato solo per impostare il titolo della finestra dello schermo. Un esempio di schermata può avere più finestre, ognuno di loro ha un nome, che è ciò che viene visualizzato nella hardstatuse captioncon la tsequenza di escape.

c) la normale fuga bash funziona se si imposta il terminfo giusto per xterm in .screenrc:

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

(questo anche works on my machineper lo stucco)

Quindi, al fine di impostare il titolo giusto sia per la finestra dello schermo che per il titolo putty / xterm, uso qualcosa del tipo:

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

come riferimento: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html


1

Non ho intenzione di rispondere completamente alla domanda, ma lasciatemi suggerire il modo di risolvere il problema. Molti gestori di finestre supportano le specifiche EWMH . C'è anche uno strumento da riga di comando wmctrlche è in grado di interagire con loro. Usando questo strumento, si può facilmente cambiare il titolo della finestra attiva con il seguente comando:

  wmctrl -r :ACTIVE: -T "FooTitle"

È anche possibile cambiare l'icona della finestra, il layout e altre proprietà. Lo strumento probabilmente non funzionerà per PuTTY poiché Windows non supporta EWMH, ma la maggior parte dei sistemi Linux dovrebbe accettarlo.

Con questo metodo non importa se lo usi screeno meno.


0

Nelle ultime 2 settimane ho cercato in molti forum e non ho trovato la risposta alla domanda:

Come ottenere tutto l'output del comando nel titolo Putty?

Necessario per altri programmi per sapere quando alcuni lavori su un server sono stati eseguiti ed è fatto nel modo giusto o sbagliato. Plink stdout e stdin non funzionavano, ho usato molte modifiche con ritardi di attesa e per alcuni comandi che funzionavano per altri no. XSEL e XCLIP non possono essere installati su quel server.

Quindi ecco la soluzione:

  1. Ottieni l'output del comando in un file.
  2. Eco quel file al titolo.

Sul client putty e sul server suse è simile al seguente:

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

Spero che qualcuno sarà in grado di usarlo. Ovviamente non funzionerà per tutti i tipi di server e le impostazioni del client putty, ma l'idea dovrebbe funzionare bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.