Wymuś tytuł na ekranie GNU

9

Domyślnie tytuł sesji ekranowej to nazwa ostatnio wprowadzonego polecenia, co jest dla mnie w porządku, ale w niektórych przypadkach chciałbym to zmienić. Wiem polecenia Ctrl- A Aale to tylko zmienia tytuł aż do następnego polecenia, i chciałbym go tam pozostać, dopóki nie zdecydują inaczej.

EDYCJA: Oto preexecfunkcja, którą znalazłem w moim.zshrc

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

Odpowiedzi:

9

Zależy od tego, jak rzeczy są skonfigurowane, ale domyślnie coś takiego powinno działać.

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

Następnie uruchomić:

settitle NEWTITLE.

Zobacz dokumentację tytułów ekranów i często zadawane pytania dotyczące ekranu GNU, aby uzyskać więcej informacji.

Biorąc pod uwagę, Ctrl+ A Azmienia się tylko do następnego polecenia, prawdopodobnie jest ustawiany przez $PS1(wszystkie powłoki) lub $PROMPT_COMMAND/ DEBUG trap(tylko bash) lub precmd/ preexec(tylko zsh).

Należy spojrzeć na każdym miejscu, \elub \033pojawia się klub \\po nim, w zasadzie jak moim settitleprzykładzie powyżej.

AKTUALIZACJA

Powiedziałeś, że masz zwyczaj preexec.

Dlaczego nie zmienić tego na to:

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

Następnie możesz ustawić niestandardowy tytuł, uruchamiając:

TITLE="my title"

i rozbroić tytuł, uruchamiając

TITLE=

Nie zapomnij zmienić precmdi $PS1również w razie potrzeby.

NA BOK

Możesz nawet rozszerzyć to do wszystkich terminali (np xterm, gnome-terminalitp) przez nie ciężko kodowania \eki \e\\.

Tak to robię:

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

Następnie możesz zmienić preexecna:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   settitle "${TITLE:-$CMD}"
fi
Mikel
źródło
Wydane polecenie robi dokładnie to samo, co Ctrl-A A. A jeśli chodzi o monit, masz na myśli, że muszę modyfikować $PS1za każdym razem, gdy chcę, aby tytuł się nie zmieniał?
gregseth
Mam na myśli sprawdzenie, czy nie zawiera ESC k czegoś ESC \. Ditto PROMPT_COMMAND.
Mikel
ESC może być napisane \elub \033.
Mikel
Odsyłacze do tytułów ekranów powinny zawierać niezbędne informacje
Mikel
5

Jeśli tytuł okna odzwierciedla aplikację aktualnie uruchomioną w oknie, to dlatego, że robi to twoja powłoka. Jeśli to robi, to dlatego, że twoja dystrybucja, administrator systemu lub skonfigurowałeś ją.

Jeśli polecenie pojawia się jako tytuł okna, gdy polecenie jest uruchomione, odbywa się to przez preexecfunkcję (w zsh) lub jej emulację pod bash .

Jeśli tytuł zmienia się po zakończeniu każdego polecenia, jest to wykonywane przez precmdfunkcję w zsh, PROMPT_COMMANDparametr w bash lub jako część znaku zachęty ( PS1parametru) w dowolnej powłoce. (Polecenie zmiany tytułu jest sekwencją zmiany znaczenia emitowaną przez dowolną aplikację jako część strumienia wyjściowego terminala, dzięki czemu można ją osadzić w monicie).

Sprawdzić sekwencji ucieczki podobnego \e]0;new title\a, \e]2;new title\aalbo \eknew title\e\\w pliku inicjującym powłoki ( ~/.bashrc, ~/.zshrc...). Jeśli nic odpowiednie ustawienie może być w pliku systemowym (np /etc/bash.bashrc, /etc/zsh/zshrc); następnie zastąp ten parametr lub funkcję we własnym pliku inicjującym.

Zobacz odpowiedź Mikela na nadpisywanie ustawień tytułu w preexec.

Gilles „SO- przestań być zły”
źródło
Dzięki, wyjaśniłeś to bardzo jasno. Rzeczywiście znalazłem preexecfunkcję zdefiniowaną w moim .zshrc. Chodzi o to, że takie zachowanie chcę ... przez większość czasu. Chciałbym móc go wyłączyć w locie na jednym ekranie. Może jest zmienna, którą mogę uzyskać w preexecfunkcji, gdy ręcznie ustawię tytuł, czy coś takiego?
gregseth
@gregseth: Ogólnie trudno jest to wyjaśnić, ale jeśli opublikujesz swoją preexecfunkcję, ja lub ktoś inny prawdopodobnie zaproponuje prostą zmianę.
Gilles „SO- przestań być zły”
Chciałem wspomnieć preexec, ale Greg nie powiedział, że używa zsh. To mnie nauczy. ;-)
Mikel
@Mikel: Moje wyjaśnienie było lepsze niż twoje, ale twój nowy preexecprojekt jest lepszy niż mój.
Gilles „SO- przestań być zły”
Zgadzam się. :-) Moja pierwotna odpowiedź próbowała nauczyć OP znaleźć odpowiedź dla siebie. Twoja była od razu bardziej pomocna. Tak czy inaczej, wszyscy wygrywamy.
Mikel