Jak zmienić tytuł okna miętowego?

35

MinTTY to nowa domyślna konsola dla Cygwin.

Co to jest polecenie powłoki (coś, co mogę umieścić w .bashrc, a nawet lepiej w .zshrc), aby zmienić tytuł okna MinTTY?

Chciałbym, aby tytuł okna był ścieżką do bieżącego katalogu i aktualizował go, gdy przełączam katalogi w konsoli.

Leonel
źródło
1
Domyślne ustawienie zachęty Cygwin (tj. $PS1) Zawiera już sekwencję kontrolną, która ustawia tytuł okna na użytkownik @ maszyna: katalog_działający.
ak2,
Niedawny pakiet MSYS2_packages / system plików commit 6e6310d (system plików: Nowa specyficzna zmienna MSYS2_PS1., 2016-05-01) wprowadził skrypt zachęty MSYS2_PS1, umożliwiający różne konfiguracje Cygwin / MSYS2. Zaproponowałem poprawkę, aby upewnić się, że każdy istniejący PS1 ma pośredni priorytet github.com/Alexpux/MSYS2-packages/pull/651 . Mam nadzieję że to pomoże.
Philip Oakley,
@Philip, (notatka od siebie) Ta poprawka okazała się kontrowersyjna, a kolejne poprawki są dodawane (lub usuwane) w celu stworzenia minimalnej możliwej poprawki obejmującej różne zastosowania.
Philip Oakley,
1
Powiązane, jeśli potrzebujesz tylko statycznego tytułu, takiego jak „Cygwin i686” lub „Cygwin x86_64” , możesz go użyć -T <title>we właściwościach skrótu systemu Windows. Zobacz także mintty man page.
jww

Odpowiedzi:

50

Co jest nie tak

Następujące polecenie nie działało dla mnie:

echo -ne "\e]0;MYTITLE\a"

Okazuje się, że moja domyślna instalacja Cygwin zawiera następującą definicję pytania w .bashrc:

PS1=\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$

Zauważ, że pierwsza część pytania ( \e]0;\w\a) ustawia tytuł okna za każdym razem, gdy pojawia się pytanie.

Rozwiązanie

Dodaj te linie, .bashrcktóre definiują 2 funkcje:

function settitle() {
      export PS1="\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$ "
      echo -ne "\e]0;$1\a"
}
function settitlepath() {
      export PS1="\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n$ "
}

Następnie możesz ustawić niestandardowy tytuł za pomocą tego polecenia:

settitle "MYWonderfullTest here"

lub możesz powrócić do domyślnych ustawień cygwina (bieżąca ścieżka) za pomocą tego polecenia:

settitlepath

Mam nadzieję że to pomoże

boly38
źródło
1
Świetna robota, rozwiązująca problem PS1, na który napotyka większość użytkowników przy domyślnych ustawieniach cygwina.
Markku K.,
3
To powinno zostać zaakceptowane jako odpowiedź, ponieważ działa idealnie w przeciwieństwie do najwyżej głosowanej odpowiedzi
Tapan Chandra
1
Uwielbiam odpowiedź, którą mogę wyciąć i wkleić. A także jasno wyjaśnia, na czym tak naprawdę polega problem.
Darrel Lee
te funkcje działają dla mnie dobrze! pamiętaj, że aby cygwin mógł ponownie załadować .bashrc, będziesz musiał zrestartować cygwin, LUB napisać source ~/.bashrc- w przeciwnym razie cygwin będzie nadal uruchamiał starą wersję bashrc, która była na dysku, gdy uruchomiono cygwin. - testowany na Cygwin version 2.8.1 (64 bit)- wersji 2017
hanshenrik
Dlaczego ta odpowiedź nigdy nie została zaakceptowana?
asmith
26

Możesz to zmienić za pomocą sekwencji kontrolnej xterm:

echo -ne '\e]0;Title\a'

Zobacz: http://code.google.com/p/mintty/issues/detail?id=241

James Fu
źródło
4
Nie ma to dla mnie żadnego wpływu: / Może ta sztuczka zepsuła się w ciągu ostatnich 6 miesięcy?
voltrevo
Używasz bash?
James Fu
2
Nie działa, gdy jest wydawany z poziomu ekranu.
Ярослав Рахматуллин
10
Prawdopodobnie problem polega na tym, że wiersz polecenia jest już skonfigurowany do aktualizacji tytułu (na przykład z bieżącą ścieżką), więc polecenie działa, ale nagle zostaje zastąpione przez wiersz polecenia.
Andrea Polci
2
Aby to przetestować „echo -ne” \ e] 0; Title \ a „&& cat”. Ta metoda zapobiega natychmiastowemu zresetowaniu monitu. (Jeśli to działa, możesz zmienić PS1 w swoim profilu zgodnie z opisem w innych odpowiedziach)
Curtis Yallop
3

Umieść to w .zshrc:

# Change title of MinTTY to current dir
function settitle() {
    echo -ne "\033]2;"$1"\007"
}
function chpwd() {
    settitle $(cygpath -m `pwd`)
}

Sekwencja znaków specjalnych w ustawieniach funkcji powoduje, że MinTTY zmienia tytuł okna.

W zsh , jeśli zdefiniujesz funkcję o specjalnej nazwie chpwd, będzie ona wywoływana po każdym chdir .

Działa na WinXP z Cygwin 1.7 i MinTTY z uruchomionym zsh.

Leonel
źródło
Działa również w WSL (oczywiście bez cygpatha): settitle "$(pwd)@$HOST"
zzxyz
2

W bash, zmienną PROMPT_COMMAND można ustawić tak, aby zawierała wiele poleceń, oddzielonych średnikami. możesz użyć tego, aby dokonać tego samego ustawienia tytułu, jak opisano w innej odpowiedzi, która mówi o zsh.

garbaty
źródło
2
1) echo $ PS1 i skopiuj ten ciąg do schowka lub edytora tekstu, jak w
   echo $ PS1
2) edytuj ~ / .bash_profile i dodaj kod powłoki poniżej, zastępując $ PS1 w razie potrzeby, ale utrzymuj zmienną $ {TERMINAL_TITLE} w „fałszywym” stanie.
3) Zapisz plik i ustaw zmienną środowiskową TERMINAL_TILE, jak w
   export TERMINAL_TITLE = „Mój niestandardowy tytuł”
4) Źródło profilu bash, jak w
   . ~ / .bash_profile
Cieszyć się

jeśli [-z "$ {TERMINAL_TITLE}"]
następnie
  PS1 = '\ [\ e] 0; \ w \ a \] \ n \ [\ e [32m \] \ u @ \ h \ [\ e [33m \] \ w \ [\ e [0m \] \ n \ $ '
jeszcze
  PS1 = '\ [\ e] 0; $ {TERMINAL_TITLE} \ a \] \ n \ [\ e [32m \] \ u @ \ h \ [\ e [33m \] \ w \ [\ e [0m \ ] \ n \ $ '
fi
orbita andrews
źródło
1

Użyłem odpowiedzi Leonela, ale okazało się, że tytuł miga tylko wtedy, gdy to robi, co oznacza, że ​​przynajmniej polecenie echa działa zgodnie z przeznaczeniem. Uruchomiłem zsh interaktywnie z włączonym trybem debugowania

zsh -xv

Zmiana katalogu ewidentnie wywołuje inną funkcję wywoływaną title()po precmd()i chpwd()skutecznie ją zastępuje. Więc podłączyłem to do mojego .zshrc i zadziałało.

function settitle() {
    echo -ne "\033]2;"$1"\007"
}
function title() {
    settitle $(cygpath -m `pwd`)
}

Jeśli wolisz używać chpwd()albo precmd()zamiast, po prostu wyłączyć funkcję napisów: title(){}.

użytkownik239512
źródło
1

Chciałem tylko udostępnić moje rozwiązanie tego problemu, ponieważ używam mintty do wykonania skryptu.

Mój miętowy skrót jest skonfigurowany jako:

C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico /usr/bin/bash.exe -l -c /scripts/connect.sh

Skrypt connect.sh, który napisałem, który jest wywoływany w powyższym skrócie, wyświetli monit o serwer, z którym chcę się połączyć, ORAZ wykona funkcję osadnika zdefiniowaną w skrypcie.

connect.sh

#!/bin/bash

echo "Enter servername when prompted"
echo -n "servername: " 
read servername
function settitle() {
    echo -ne "\033]2;"$servername"\007"
}
function title() {
    settitle $(cygpath -m `pwd`)
}
settitle
ssh my_username@$servername
użytkownik273306
źródło
Dlaczego definiujesz funkcję, titlejeśli jej nie używasz?
pabouk
0

spróbuj dodać to do .bash_profile

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

Mi to pasuje.

woda netto
źródło
2
Pytanie dotyczy zmiany tytułu okna, a nie wiersza polecenia.
kenorb
1
dodaj to do .bash_profile, możesz zmienić tytuł, dziękuję!
netawater