Titel auf GNU-Bildschirm erzwingen

9

Standardmäßig ist der Titel einer Bildschirmsitzung der Name des zuletzt eingegebenen Befehls, was für mich in Ordnung ist, aber in einigen Fällen möchte ich ihn ändern. Ich kenne den Befehl Ctrl- A Aaber er ändert nur den Titel bis zum nächsten Befehl, und ich möchte, dass er dort bleibt, bis ich mich anders entscheide.

EDIT: Hier ist die preexecFunktion, die ich in meinem gefunden habe.zshrc

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

Antworten:

9

Hängt davon ab, wie die Dinge eingerichtet sind, aber standardmäßig sollte so etwas funktionieren.

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

Dann renne:

settitle NEWTITLE.

Weitere Informationen finden Sie in den Bildschirmtitel-Dokumenten und in den GNU-Bildschirm-FAQ .

Wenn Ctrl+ A Aes nur bis zum nächsten Befehl ändert, wird es wahrscheinlich durch $PS1(alle Shells) oder $PROMPT_COMMAND/ DEBUG trap(nur Bash) oder precmd/ preexec(nur zsh) gesetzt.

Sie sollten für jeden Ort suchen , dass \eoder \033erscheint mit koder \\nach ihm, im Grunde wie mein settitleBeispiel oben.

AKTUALISIEREN

Sie sagten, Sie hätten einen Brauch preexec.

Warum ändern Sie es nicht so:

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

Anschließend können Sie einen benutzerdefinierten Titel festlegen, indem Sie Folgendes ausführen:

TITLE="my title"

und deaktivieren Sie den Titel durch Ausführen

TITLE=

Vergessen Sie nicht, sich zu ändern precmdund $PS1bei Bedarf auch.

BEISEITE

Man könnte sogar diese an alle Endgeräte erweitern (zB xterm, gnome-terminalusw.) durch nicht schwer die Codierung \ekund \e\\.

So mache ich es:

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

Dann können Sie Ihre ändern preexeczu:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   settitle "${TITLE:-$CMD}"
fi
Mikel
quelle
Der Befehl, den Sie geben, macht genau das Gleiche wie Ctrl-A A. Und was die Eingabeaufforderung betrifft, meinst du, ich muss ändern, $PS1wann immer ich möchte, dass sich der Titel nicht ändert?
Gregseth
Ich meine, überprüfen Sie, ob es kein ESC enthält. Das Gleiche gilt für PROMPT_COMMAND.
Mikel
ESC könnte geschrieben werden \eoder \033.
Mikel
Die Links der Bildschirmtitel-Dokumente sollten die erforderlichen Informationen enthalten
Mikel
5

Wenn Ihr Fenstertitel die aktuell im Fenster ausgeführte Anwendung widerspiegelt, liegt dies daran, dass Ihre Shell dies tut. Wenn dies der Fall ist, liegt dies daran, dass Ihre Distribution, Ihr Systemadministrator oder Sie es konfiguriert haben.

Wenn der Befehl während der Ausführung des Befehls als Fenstertitel angezeigt wird, erfolgt dies über die preexecFunktion (in zsh) oder eine Emulation davon unter bash .

Wenn sich der Titel nach Abschluss jedes Befehls ändert, erfolgt dies durch die precmdFunktion in zsh, den PROMPT_COMMANDParameter in bash oder als Teil der Eingabeaufforderung ( PS1Parameter) in einer beliebigen Shell. (Der Befehl zum Ändern des Titels ist eine Escape-Sequenz, die von einer beliebigen Anwendung als Teil des Ausgabestreams des Terminals ausgegeben wird, sodass sie in eine Eingabeaufforderung eingebettet werden kann.)

Geben Sie für eine Escape - Sequenz wie \e]0;new title\a, \e]2;new title\aoder \eknew title\e\\in der Shell - Initialisierungsdatei ( ~/.bashrc, ~/.zshrc, ...). Wenn es nichts relevant ist, kann die Einstellung in einer Systemdatei (zB /etc/bash.bashrc, /etc/zsh/zshrc); Überschreiben Sie dann diesen Parameter oder diese Funktion in Ihrer eigenen Initialisierungsdatei.

Siehe Mikels Antwort für eine überschreibbare Titeleinstellung in preexec.

Gilles 'SO - hör auf böse zu sein'
quelle
Danke, du hast es sehr deutlich gemacht. Ich habe tatsächlich eine preexecin meiner .zshrc definierte Funktion gefunden. Die Sache ist, das ist das Verhalten, das ich will ... die meiste Zeit. Ich möchte es auf einem bestimmten Bildschirm im laufenden Betrieb deaktivieren können. Es gibt vielleicht eine Variable, die ich in der preexecFunktion erhalten kann, wenn ich den Titel manuell einstelle, oder so etwas?
Gregseth
@gregseth: Es ist im Allgemeinen etwas schwer zu erklären, aber wenn Sie Ihre preexecFunktion veröffentlichen, kann ich oder jemand anderes wahrscheinlich eine einfache Änderung vorschlagen.
Gilles 'SO - hör auf böse zu sein'
Ich wollte es erwähnen preexec, aber Greg sagte nicht, dass er es benutzte zsh. Das wird mich lehren. ;-)
Mikel
@Mikel: Meine Erklärung war besser als deine, aber dein neues preexecDesign ist besser als meine.
Gilles 'SO - hör auf böse zu sein'
Genau. :-) Meine ursprüngliche Antwort war, dem OP beizubringen, die Antwort für sich selbst zu finden. Ihre war sofort hilfreich. In jedem Fall gewinnen wir alle.
Mikel