Czy ustawić tytuł okna xterm (PuTTY) podczas korzystania z ekranu?

12

Próbuję screenustawić xtermtytuł. Mam to działające poza screen, ale screenzachowuje każdy tytuł, który był na miejscu, kiedy go uruchomiłem. Oto moje .bashrc:

funkcja bash_prompt_command () {
    # Ile znaków $ PWD powinno być zachowanych
    lokalne pwdmaxlen = 25
    # Wskaż, że nastąpiło obcięcie reż
    local trunc_symbol = ".."
    katalog lokalny = $ {PWD ## * /}
    pwdmaxlen = $ (((pwdmaxlen <$ {# katalog})? $ {# katalog}: pwdmaxlen))
    NEW_PWD = $ {PWD / # $ HOME / \ ~}
    lokalny pwdoffset = $ (($ {# NEW_PWD} - pwdmaxlen))
    if [$ {pwdoffset} -gt „0”]
    następnie
        NEW_PWD = $ {NEW_PWD: $ pwdoffset: $ pwdmaxlen}
        NEW_PWD = $ {trunc_symbol} / $ {NEW_PWD # * /}
    fi

    eksportuj NEW_PWD
}

PROMPT_COMMAND = polecenie bash_prompt_command
# Karta kolorów @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
przypadku „$ {TERM}” w
    „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 ”
        ;;
    "ekran")
        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

A oto moje .screenrc:

hardstatus alwayslastline
hardstatus string '% {= 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 włączony
shelltitle „$ | bash”

Co robię niepoprawnie?

Aktualizacja (19 sierpnia 2010 r.): Problem polega na tym, że po ustawieniu nie można zaktualizować tytułu terminala z poziomu ekranu alwayslastline. Więc moim rozwiązaniem było po prostu poddać się i zadowolić z góry ustalonym, użytecznym tytułem dla moich sesji ekranowych. Mój zaktualizowany .bashrci .screenrcmożna go znaleźć na stronie http://bitbucket.org/jsumners/rcfiles/src .

James Sumners
źródło

Odpowiedzi:

4

Kody ucieczki są różne na ekranie .

To poza ekranem:

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

jest równoważne z tym ekranem wewnętrznym:

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

Zmiana skrzynki $ {TERM} = "screen" pasek tytułowy na

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

rozwiąże twój problem.

crb
źródło
To nie działa. Nie rozumiem dlaczego.
James Sumners
Określiłem to ustawienie hardstatus alwayslastlinetak, jak robię to, aby screenuniemożliwić screenustawienie xtermtytułu. Teraz, jeśli mogę po prostu dowiedzieć się, jak to zrobić jednocześnie.
James Sumners,
Czy to dlatego, że twój status zawiera% t (dla tytułu)?
crb
Nie. Po prostu to usunąłem i uzyskaj ten sam wynik. Myślę, że będę musiał ustawić alias, screenktóry ustawia tytuł okna, a następnie uruchomi program. A potem po prostu zrezygnuj z dynamicznych tytułów terminalowych podczas używania screen. :(
James Sumners
1
bugs.launchpad.net/byobu/+bug/338722/comments/10 mówi, że jest to ograniczenie na ekranie
agnul
7

W rzeczywistości istnieje sposób na wysłanie sekwencji ucieczki bezpośrednio do xtermu, przechodząc przez ekran. Nie było łatwo go znaleźć, ale z kodu ekranowego (src / ansi.c) Myślę, że jest tam od 2005 roku. Mam go w Xterm, Gnome Terminal i Kit. Znalazłem notatkę w miętowym źródle wskazującą, że tam nie działa po prostu dlatego, że nie obsługują DCS (chyba że zostało to ostatnio naprawione).

Z dokumentacji ekranu poniżej (pod adresem 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.

ANSI DCS (Device Control String) to kod ucieczki, który jest używany do wysyłania bezpośrednio do terminala (myślę, że był to pierwotny cel sprzed wielu lat). Taki ciąg jest zakończony kodem ucieczki ST (String Terminator).

Zawiń ciąg, aby ustawić tytuł okna terminala w bloku DCS..ST, a on przejdzie przez ekran i zaktualizuje poprawnie, nawet przy hardstatus alwayslastline.

DCS = \ 033P, ST = \ 033 \

Przykład - aby zaktualizować tytuł okna z bieżącym katalogiem roboczym, użyj

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

Lepiej późno niż wcale! Mam nadzieję, że to komuś pomoże.

Na wszelki wypadek mylę się co do zmian źródła ekranu: uruchamiam najnowszą wersję z git-screen-session, która z kolei używa prawie najnowszej wersji z git-screen (z pewnymi zmianami specyficznymi dla sesji screen). Ale komunikaty dziennika są datowane na ekranie z 2005 roku (możesz zobaczyć zmiany dokonane w tym zatwierdzeniu dotyczące obsługi DCS, jeśli sklonujesz ekran git repo i użyjesz polecenia poniżej).

git clone git://git.savannah.gnu.org/screen.git
git difftool e6618a14^! src/ansi.c
bwillan
źródło
1

crb ma rację, ale

a) kod ucieczki, którego używa, nie działa dla mnie. Powinno być \033kzamiast \033_. Patrz screen (1)poniżej "TITLES (naming windows)". Tak powinno być:

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

b) ten rodzaj ucieczki służy wyłącznie do ustawiania tytułu okna ekranowego. Jedna instancja ekranie może mieć wiele okien, każde z nich ma swoją nazwę, to jest to, co jest wyświetlane w hardstatusi captionz tsekwencji ucieczki.

c) normalne ucieczkowanie bash działa, jeśli ustawisz właściwe terminfo dla xterm w .screenrc:

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

(dotyczy to również works on my machineszpachli)

Aby więc ustawić odpowiedni tytuł zarówno dla okna ekranowego, jak i dla putty / xterm, używam czegoś takiego:

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

w celach informacyjnych: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html

0x89
źródło
1

Nie zamierzam odpowiedzieć całkowicie na pytanie, ale pozwól mi zasugerować sposób rozwiązania problemu. Wiele menedżerów okien obsługuje specyfikację EWMH . Istnieje również narzędzie wiersza poleceń, wmctrlktóre może z nimi współdziałać. Za pomocą tego narzędzia można łatwo zmienić tytuł aktywnego okna za pomocą następującego polecenia:

  wmctrl -r :ACTIVE: -T "FooTitle"

Można również zmienić ikonę okna, układ i inne właściwości. Narzędzie prawdopodobnie nie będzie działać dla PuTTY, ponieważ Windows nie obsługuje EWMH, ale większość systemów Linux powinna to zaakceptować.

Dzięki tej metodzie nie ma znaczenia, czy używasz screenczy nie.

grwlf
źródło
0

W ciągu ostatnich 2 tygodni przeszukałem wiele forów i nie znalazłem odpowiedzi na pytanie:

Jak uzyskać wszystkie dane wyjściowe polecenia do tytułu Putty?

Potrzebne, aby inne programy wiedziały, kiedy niektóre zadania na serwerze są wykonywane i czy wykonano je dobrze, czy źle. Plink stdout i stdin nie działały, użyłem wielu poprawek z opóźnieniami oczekiwania i dla niektórych poleceń, które działały dla innych nie. XSEL i XCLIP nie mogły zostać zainstalowane na tym serwerze.

Oto rozwiązanie:

  1. Uzyskaj dane wyjściowe polecenia w pliku.
  2. Echo ten plik do tytułu.

Na kitach i serwerach Suse wygląda to tak:

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

Mam nadzieję, że ktoś będzie mógł z tego skorzystać. Oczywiście nie będzie działać dla wszystkich typów serwerów i ustawień klienta szpachli, ale pomysł powinien działać dobrze.

Jacek Domagała
źródło