Forza il titolo sullo schermo GNU


9

Per impostazione predefinita, il titolo di una sessione schermo è il nome dell'ultimo comando inserito, il che va bene per me, ma in alcuni casi mi piacerebbe cambiarlo. Conosco il comando Ctrl- A A, ma cambia solo il titolo fino al comando successivo e mi piacerebbe che rimanesse lì fino a quando non deciderò diversamente.

EDIT: Ecco la preexecfunzione che ho trovato nel mio.zshrc

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

Risposte:


9

Dipende da come sono impostate le cose, ma per impostazione predefinita, qualcosa del genere dovrebbe funzionare.

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

Quindi eseguire:

settitle NEWTITLE.

Vedi i documenti dei titoli delle schermate e le faq delle schermate GNU per maggiori dettagli.

Dato Ctrl+ lo A Asta cambiando solo fino al prossimo comando, probabilmente è impostato da $PS1(tutte le shell), o $PROMPT_COMMAND/ DEBUG trap(solo bash) o precmd/ preexec(solo zsh).

Dovresti cercare qualsiasi posto che \eo \033appare con ko \\dopo di esso, sostanzialmente come il mio settitleesempio sopra.

AGGIORNARE

Hai detto di avere un'usanza preexec.

Perché non cambiarlo in questo:

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

Quindi puoi impostare un titolo personalizzato eseguendo:

TITLE="my title"

e disinserire il titolo eseguendo

TITLE=

Non dimenticare di cambiare precmde $PS1anche se necessario.

A PARTE

Potresti persino estenderlo a tutti i terminali (es xterm. gnome-terminal, Ecc.) Non codificando a fondo il \eke \e\\.

Ecco come lo faccio:

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}"
}

Quindi puoi modificare il tuo preexecin:

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

Il comando che dai fa esattamente la stessa cosa di Ctrl-A A. E riguardo al prompt, vuoi dire che devo modificare $PS1ogni volta che voglio che il titolo non cambi?
Gregregh,

Voglio dire, controlla che non contenga ESC k qualcosa ESC \. Idem PROMPT_COMMAND.
Mikel,

ESC potrebbe essere scritto \eo \033.
Mikel,

I collegamenti dei documenti del titolo dello schermo dovrebbero avere le informazioni necessarie
Mikel,

5

Se il titolo della finestra riflette l'applicazione attualmente in esecuzione nella finestra, è perché la tua shell lo sta facendo. Se lo fa, è perché la tua distribuzione, l'amministratore di sistema o lo hai configurato.

Se il comando appare come il titolo della finestra mentre il comando è in esecuzione, questo viene fatto dalla preexecfunzione (in zsh) o da una sua emulazione in bash .

Se il titolo cambia al completamento di ciascun comando, ciò viene eseguito dalla precmdfunzione in zsh, dal PROMPT_COMMANDparametro in bash o come parte del prompt ( PS1parametro) in qualsiasi shell. (Il comando per modificare il titolo è una sequenza di escape emessa da qualsiasi applicazione come parte del flusso di output del terminale, quindi può essere incorporata in un prompt.)

Se vuoi inserire una sequenza di escape, come \e]0;new title\a, \e]2;new title\ao \eknew title\e\\nel file di inizializzazione della shell ( ~/.bashrc, ~/.zshrc, ...). Se non c'è nulla di rilevante, l'impostazione potrebbe essere in un file di sistema (ad esempio /etc/bash.bashrc, /etc/zsh/zshrc); quindi sovrascrivere quel parametro o funzione nel proprio file di inizializzazione.

Vedi la risposta di Mikel per un'impostazione del titolo scavalcabile in preexec.


Grazie, l'hai chiarito molto. Ho effettivamente trovato una preexecfunzione definita nel mio .zshrc. Il fatto è che è questo il comportamento che voglio ... il più delle volte. Vorrei poterlo disabilitare al volo su una schermata specifica. C'è forse una variabile che posso ottenere nella preexecfunzione quando imposto manualmente il titolo, o qualcosa del genere?
Gregregh,

@gregseth: è un po 'difficile da spiegare in generale, ma se pubblichi la tua preexecfunzione, io o qualcun altro probabilmente possiamo suggerire una semplice modifica.
Gilles 'SO- smetti di essere malvagio' il

Stavo per menzionare preexec, ma Greg non ha detto che stava usando zsh. Questo mi insegnerà. ;-)
Mikel,

@Mikel: la mia spiegazione è stata migliore della tua, ma il tuo nuovo preexecdesign è migliore della mia.
Gilles 'SO- smetti di essere malvagio' il

Sono d'accordo. :-) La mia risposta originale stava cercando di insegnare all'OP a trovare la risposta per se stesso. Il tuo è stato più immediatamente utile. Ad ogni modo, vinciamo tutti.
Mikel,
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.