Jak mogę automatycznie zaktualizować tytuł na ekranie uruchomieniowym xterm?

14

To trochę kontynuacja tego pytania . Pracuję w tcsh na ekranie GNU w xterm .

Mam następujące .cshrc:

alias res_t 'xtset -t %h:%d "(%u:%g)" %e'       # reset titlebar
res_t                                           # reset title right now
alias precmd res_t

I to działa dobrze!

Jednak po uruchomieniu ekranu widzę, że tytuł nie jest aktualizowany w bieżącym katalogu. Jak mogę zaktualizować tytuł ekranu Xterm?

Nathan Fellman
źródło
Czy znalazłeś już rozwiązanie, które Ci się udało?
Trey Hunner
Nie. Próbowałem sugerowanych odpowiedzi, ale one nie zadziałały. Dlatego ich nie zaakceptowałem ani ich nie głosowałem.
Nathan Fellman

Odpowiedzi:

4

Możesz ustawić tytuł okna xterm, dodając go do swojego ( .tcshrclub .cshrczastąp swój obecny precmdalias):

alias precmd 'echo -n "\033]0;${PWD}\a"'

Upewnij się, że jest to jedyny alias precmd w twoim .cshrci .tcshrcplikach podczas korzystania z tego. Ta metoda wyświetla dla mnie bieżący katalog jako tytuł okna w terminalu gnome niezależnie od tego, czy sesja ekranowa GNU jest otwarta.

Moja odpowiedź była na tym oparta .

Trey Hunner
źródło
3

Rozumiem, że używasz tcsh, więc to prawdopodobnie nie zadziała ... Na wypadek, gdyby ktoś szukał bashowego sposobu na zrobienie tego.

Jeśli twój system (lokalny / zdalny) działa w trybie bash, możesz użyć zmiennej środowiskowej „PROMPT_COMMAND”, aby ustawić tytuł okna. PROMPT_COMMAND jest ewaluowany przed wyświetleniem monitu.

(w twoim .bashrc):

export PROMPT_COMMAND='history -a && echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007'

Wyjaśnienie:

'history -a'

Powoduje to, że powłoka dołącza się do pliku historii za każdym razem, gdy polecenie jest wykonywane, a nie po zakończeniu całej powłoki. (Nie ma to związku z tym przykładem).

'echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007"'

To echo kodu ucieczki „\ 033] 0;” który ustawia tytuł okna ze zmiennymi „user” @ „host” (usuwając najdłuższe dopasowanie od prawej do pierwszej „.”), a następnie katalog roboczy (zastępując „~” zamiast „$ HOME”).

Powyższa sztuczka będzie działać z każdą aplikacją terminalową, która obsługuje dynamiczną zmianę tytułu okna (co robią iTerm, Terminal.app, urxvt, aterm, eTerm. Xterm itp.). Możesz także zajrzeć do zmiennej powłoki „TITLEBAR” w dokumentacji bash, jest ona podobna.

wawawawa
źródło
1
to nie zadziała, gdy znajdziesz się w gnuscreen. przynajmniej mi to nie działa. dlatego
jestem
2

Powinno to działać w dowolnej powłoce, ale jest to brudny hack .screenrc. Przejmuje linię hardstatus do pracy, co może być nie do przyjęcia dla niektórych użytkowników. Ale działa w gnome-terminal na najnowszym Ubuntu, nawet bez poniższej linii termcapinfo . Niektóre sytuacje mogą wymagać głębszych poprawek (na przykład nie testowałem na PuTTY).

# enable xterm title setting; may not be necessary on some platforms
termcapinfo xterm*|rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

# dirty hack: put xterm title escapes in the hardstatus
# this example will yield "user@host || screen Win#:(windowtitle)
defhstatus "$USER@^EH || screen ^E:(^Et)"
# now turn it off so it doesn't print in the hardstatus line
hardstatus off

# and finally, use caption as a replacement hardstatus
caption always '%{= kG}[%{G}%H%{G}][%= %{= kw}%?%-Lw%?%{R}(%{W}%n*%f%t%?(%u)%?%{R})%{w}%?%+Lw%?%?%= %{G}][%{B}%C%a %M.%d%{G}]'

Znaleziono pod tym linkiem .

quack quixote
źródło
2
setenv TITLE "%{\033]0;%n@%m:%~\007%}"
set prompt = "${TITLE}%n@%m:%~%#"
SirDice
źródło
1
Ale czy to zaktualizuje tytuł podczas uruchamianiascreen
Nathan Fellman
1
Działa to dobrze z ekranem 4.00.02 + tcsh 6.12.00. Zakłada się, że masz hardstatusodpowiednio ustawioną zmienną ekranową i obsługuje termcap / terminfo hs|ts|fs|ds.
Darren Hall
w co gra Hardstatus?
gcb
2

Ta strona (do której odsyłam powyżej) jest rozwiązaniem, jednak musisz upewnić się, że ciąg terminala wpisu jest zgodny z ciągiem identyfikatora terminala (tj. Do czego ustawiona jest zmienna TERM), w przeciwnym razie nie przyniesie to żadnego efektu.

Oto podsumowanie tego, co zrobiłem, co zadziałało dla mnie po latach, gdy nie zainwestowałem wystarczająco dużo czasu, aby to zrozumieć:

  1. Sprawdź, jaki jest ciąg identyfikatora terminala, uruchamiając:

    echo $TERM
    

    Prawdopodobnie powie coś takiego jak „xterm”, „linux” lub „rxvt”.

  2. Teraz dodaj następujący wiersz do pliku .screenrc (lub utwórz go, jeśli nie istnieje) znajdującego się w katalogu głównym (~ / .screenrc):

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

    Kluczem do sukcesu jest upewnienie się, że „xterm” jest ciągiem identyfikacyjnym twojego TERM, który masz powyżej. Możesz wykonać wiele wierszy dla każdego używanego typu terminu.

Na przykład mam to jako plik .screenrc, ponieważ używam zarówno xterms, jak i typu „linux”, gdy SShing do pudełka:

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

Mam nadzieję, że to pomaga i jest całkowicie niezależne od powłoki. Pamiętaj, że jeśli uruchamiasz screen jako root, musisz zmodyfikować ~ root / .screenrc oprócz własnego pliku ~ / .screenrc w ten sposób.

Adam Strohl
źródło
1

Instrukcje tutaj pozwoliły mi zaktualizować tytuł w rxvt z bash dla mnie - co może nie jest żadną pomocą, ale pomyślałem, że warto to zbadać (sekcja Informacyjny pasek stanu, jeśli link nie przeskakuje do prawej części strony)

Barry
źródło