W Bash + iTerm2, jak nazwać zakładki?

176

W iTerm2 (kompilacja 1.0.0.20120203) zazwyczaj otwieram kilka kart, z których każda ma podzielone panele i dotyczy jednego konkretnego tematu pracy, na przykład kontroli wersji, kodowania, zarządzania plikami, pracy terminala mysql. Zazwyczaj potrzebuję przełączać się między 5 lub więcej kartami w mojej pracy. Czasami trudno jest zapamiętać lub powiedzieć, który jest, patrząc na zawartość ekranu. Chciałbym jakoś nazwać zakładki, dzięki czemu mogę szybko stwierdzić, który jest, poprzez szybkie spojrzenie. czy to możliwe?

qazwsx
źródło
1
możliwy duplikat okna Zmień iTerm2 i tytułów kart w zsh
Daniel Beck
Nie do końca duplikat. Jak więc dodać aktualnie uruchomioną aplikację jako część tytułu karty? Czyli na której karcie działa emacs, mysql itp.?
qazwsx
1
Tzn. Wszystkie moje karty mają tego samego hosta i użytkownika. Używanie ich nie różnicuje moich kart.
qazwsx
Masz na myśli, że chcesz Pokaż aktualną nazwę pracy z preferencji iTerm? Pamiętaj, że powiązany temat nie dotyczy nazwy użytkownika ani hosta.
Daniel Beck
Tak, chcę pokazać jakieś wskazanie, który program działa lub został uruchomiony na każdej zakładce. Ponadto rozwiązanie podane w drugim poście nie działa dla Bash + iTerm2.
qazwsx

Odpowiedzi:

212

Ponieważ używasz iterm2 na komputerze Mac, kolejną opcją jest to, że możesz po prostu nacisnąć CmdI, wpisać coś i nacisnąć ESC.

Rozwiązanie terminalowe jest nieco szybsze, ale chciałem cię tylko poinformować.

Mawaldne
źródło
11
Działa to przez sekundę, dopóki nie wydam zwrotu na karcie, której nazwę zmieniłem.
Stewie
15
@Stewie W Preferencjach -> Profile -> Terminal, odznacz „Zezwalaj terminalowi na zgłaszanie tytułu okna”.
Max Cantor
3
Nie jest zaznaczone. Nadal zmienia tytuł.
Stewie
6
@ SteveBennett nie jest to sam „motyw” (tak naprawdę termin to „profil”); polecenie CMD + I brzmi „Edytuj bieżącą sesję ...” (w menu Widok), więc po prostu zmienia instancję tej karty w profilu. Uderzenie w klawisz Escape po prostu zamyka okno, co jest potrzebne, ponieważ w tym oknie nie ma przycisku „Zapisz”.
MidnightLightning
4
Co się stanie, jeśli masz otwartych wiele okien? Czy musisz zmienić nazwę każdego z nich, aby w pełni nazwać samą kartę?
theicfire,
119

Znalazłem następującą funkcję, umieszczoną w mojej, ~/.bashrcktóra może być pomocna:

function title {
    echo -ne "\033]0;"$*"\007"
}

Następnie mogę wywołać go z mojego monitu bash w następujący sposób:

> title I want a pony!

I moja zakładka otrzymuje odpowiedni tytuł.

Jason Sundram
źródło
1
Próbowałem tego, ale nadal nie działa. bash_aliases.profileif [ -f ${HOME}/.bash_aliases ]; then . ${HOME}/.bash_aliases fititle dog
Włożyłem
2
+1 - dodałem mój do / etc / profile tylko dlatego, że tam są moje aliasy ... nie zapomnij o źródłowym pliku po zakończeniu. Uwaga: działa to również w terminalu.
blak3r,
3
Bardzo pomocny. Chciałem kucyka; i mam jeden!
SoEzPz
1
Umieściłem mój w .bash_profile, zrestartowałem i zadziałało jak urok.
C Johnson
1
Ci, którzy myślą, że to nie działa, to dlatego, że wiersz polecenia natychmiast go zmienia. Spróbuj, title dog && sleep 5a zobaczysz, że to działa. Zwróć uwagę na odpowiedź z @schpet, aby rozwiązać ten problem
Michaił
45

uruchom to polecenie, aby ustawić tytuł karty lub okna:

export PROMPT_COMMAND='echo -ne "\033]0;YOUR NAME HERE\007"'

dodałem następujące do mojego, ~/.bash_profileaby zawsze wyświetlać bieżący katalog względem mojego katalogu domowego:

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

przydatne, gdy masz 100 zminimalizowanych terminali w doku

wskazówka dotycząca świata Mac

schpet
źródło
ucieczka z tego polecenia eksportu z jakiegoś powodu nie działała całkiem dobrze na moim bashu (v5.0.7), oto co dla mnie zadziałało:export PROMPT_COMMAND='echo -ne "\033]0;${PWD/$HOME/\~}\007"'
Mike Fogel
18

Przez pewien czas korzystałem z rozwiązań podobnych do powyższego, ale używam wystarczającej liczby zakładek, aby były również oznaczone kolorami, aby ułatwić wizualne odniesienie. Więc bita tabset , narzędzie do ustawiania tytuł zakładki, odznaki i kolor w oparciu o rodzaj pracy robię w każdej karcie.

przykład

Wymaga węzła , ale jest to obecnie powszechnie instalowana platforma. Żeby zainstalować:

npm install -g iterm2-tab-set
Jonathan Eunice
źródło
To jest niesamowite! Szczególnie podoba mi się automatyczne ustawienie koloru karty. Dziękuję Ci!
Ashutosh Jindal
1
Łał! To świetne narzędzie!
dmulvi
Obecnie używam tej metody zamiast tej opisanej w zaakceptowanej odpowiedzi (<kbd> Cmd </kbd> <kbd> I </kbd>,
wpisuję
but that is now a commonly installed platformHahaha.ha ... ha ...... czekaj, mówisz poważnie ?
Fałszywe imię
Tak, poważnie. Programiści i ludzie DevOps - obecnie, naturalni odbiorcy aplikacji terminalowych - mają zainstalowany node.js. Lub można go łatwo zainstalować. Ci, którzy tego nie robią / nie mogą, mogą powrócić do metod opartych na bash / zsh / itp.
Jonathan Eunice
16

Dodaj tę funkcję do ~/.bash_profilepliku i powinna działać.

function title ()
{
    TITLE=$*;
    export PROMPT_COMMAND='echo -ne "\033]0;$TITLE\007"'
}
jiangyu7408
źródło
7

Podoba mi się ten:

#setup terminal tab title
function title {
    if [ "$1" ]
    then
        unset PROMPT_COMMAND
        echo -ne "\033]0;${*}\007"
    else
        export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/~}\007"'
    fi
}
title

Umożliwi to przełączanie nazwy karty między nazwą niestandardową a domyślną dla CWD.

title -> tytuł twojej karty będzie ~/YOUR_CWD/

title hey there -> tytuł twojej karty będzie hey there

Taylorstine
źródło
Zauważ, że tak, jak jest, spowoduje to zablokowanie integracji powłoki iTerm.
Michael
5

Naprawdę podoba mi się odpowiedź Taylorstine'a , ale łamie ona integrację powłoki iTerm2, która opiera się na PROMPT_COMMANDzmiennej. Możesz zmodyfikować kod Taylora, aby to poprawić, dodając go z __bp_precmd_invoke_cmdpowrotem za PROMPT_COMMANDkażdym razem, gdy będziesz go majstrować:

# iTerm2 shell integration
test -e "${HOME}/.iterm2_shell_integration.bash" && source "${HOME}/.iterm2_shell_integration.bash"

# iTerm2 tab titles
function title {
    if [ "$1" ]
    then
        export PROMPT_COMMAND='__bp_precmd_invoke_cmd'
        echo -ne "\033]0;${*}\007"
    else
        export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/\~}\007";__bp_precmd_invoke_cmd'
    fi
}
title
Michael
źródło
3

Podoba mi się odpowiedź Michaela .

Ale co jeśli .iterm2_shell_integration.bashnie istnieje?

Oto moje zdanie:

# iTerm2 shell integration
test -e "${HOME}/.iterm2_shell_integration.bash" && source "${HOME}/.iterm2_shell_integration.bash"

# iTerm2 tab titles
function title {
  if [ "$1" ] ; then
    test -e "${HOME}/.iterm2_shell_integration.bash" \
      && export PROMPT_COMMAND='iterm2_preexec_invoke_cmd' \
      || unset PROMPT_COMMAND
    echo -ne "\033]0;${*}\007"
  else
    test -e "${HOME}/.iterm2_shell_integration.bash" \
      && export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/~}\007";iterm2_preexec_invoke_cmd' \
      || export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/~}\007"'
  fi
}
title
użytkownik1318024
źródło
1
Zauważ, że w wersji 3.1 iterm2_preexec_invoke_cmdstał się__bp_precmd_invoke_cmd
Michael
2

Jeśli pracujesz z profilami (co jest bardzo wygodne): Preferencje -> Wygląd -> Tytuły okien i kart: zaznacz „Pokaż nazwę profilu”:

wizerunek

Tak to wygląda:

miniatura połączona z głównym obrazem

aianitro
źródło
2
Preferences -> Profiles -> Terminal
  uncheck Terminal may set Tab/Window title

Komentarz Maxa Cantora zadziałał dla mnie.

B Seven
źródło
1

Myślę, że automatyczne przełączanie profili i odznaki są dokładnie zaprojektowane dla potrzeb:

Automatyczne przełączanie profili iTerm2 może wykorzystywać informacje, które zna na temat bieżącej ścieżki, nazwy hosta i nazwy użytkownika do zmiany profili. Na przykład kolor tła okna lub kodowanie znaków terminala może ulec zmianie podczas łączenia się z różnymi hostami.

Odznaki Możesz umieścić odznakę w prawym górnym rogu terminala pokazującą informacje o bieżącej sesji. Może wyświetlać twoją nazwę użytkownika, nazwę hosta, a nawet dane niestandardowe, takie jak bieżąca gałąź git.

więc wynik może się podobać:

wprowadź opis zdjęcia tutaj

lengxuehx
źródło
Podaj zasadnicze części odpowiedzi z linku (linków) referencyjnych, ponieważ odpowiedź może stać się nieważna w przypadku zmiany połączonych stron.
DavidPostill
0

Chciałbym trochę rozszerzyć odpowiedź B Sevena dla absolutnej jasności.

Ponieważ większość z nas chciałaby wiedzieć, w jaki sposób można ustawić tytuł karty, nawet jeśli nie są one w lokalnej powłoce, a nie w zdalnej powłoce (np. Over ssh).

Krok 1. Preferences -> Profiles -> Terminal uncheck Terminal may set Tab/Window title

Krok 2. Dla każdej zakładki double click on the tab -> Session Title

Cokolwiek ustawisz w tytule sesji, pozostanie takie, jakie jest.

Krishna Gupta
źródło
-2

Fuj, wszystkie te pseudonimy i funkcje. Łatwiejsze rozwiązanie (jeśli jesteś rootem), wklej to do terminala:

TARGET=/usr/bin/title
sudo tee "$TARGET" <<'EOF'
#!/usr/bin/env bash
echo -ne "\033]0;$*\007"
EOF
sudo chmod 755 "$TARGET"

Lub po prostu utwórz tytuł wywołania pliku gdzieś na swojej ścieżce lub ścieżce globalnej i wklej dwie linie między EOF.

Orwellophile
źródło
12
„Fuj z tymi wszystkimi pseudonimami”. Wpisuje odpowiedź, której nikt nie może zapamiętać ani wpisać ręcznie.
Dan
1
Nie @Dan mówiąc to jest super, tylko, że nie ma potrzeby, aby pamiętać, że ponieważ jest to po prostu tworząc skrypt o nazwie titlew /usr/bin.
Emile Bergeron,
@EmileBergeron thx, chociaż wydaje się, że ty (my) jesteś w mniejszości. Odpowiedź była tylko 1 linia, reszta jest dla leniwych ludzi.
Orwellophile,