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.


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


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


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.


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.


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

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(){}.


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.