Zmień tytuł okna i karty iTerm2 w Zsh

50

Chcę opisać zakładki okna sesji terminalowych. Używam zshell w iterm2 na OSX. Czy w terminalu można dynamicznie zmieniać etykietę karty okna?

bneil
źródło

Odpowiedzi:

48

Możesz wprowadzić następujące dane, zshaby ustawić tytuł okna iTerm2:

echo -ne "\e]1;this is the title\a"

Jeśli chcesz zautomatyzować wstawianie np. Aktualnego czasu lub katalogu roboczego, edytuj zshpliki konfiguracyjne, aby ustawić tytuł w precmd()funkcji np $PWD.

echo -ne "\e]1;$PWD\a"

Możesz przeczytać o precmdfunkcji w man zshmiscsekcji SPECIAL FUNCTIONS.

wprowadź opis zdjęcia tutaj

Daniel Beck
źródło
3
kiedy wykonuję polecenie echo -ne "\ e] 1; to jest tytuł \ a" tytuł karty nie zmienia się. Czy istnieje ustawienie, które muszę zmienić w iterm2?
bneil
15
Domyśliłam się. Muszę odznaczyć wszystkie opcje tytułów okien i kart w sekcji iterm-> preferencje-> wygląd. i w .zshrc muszę odkomentować / dodać eksport DISABLE_AUTO_TITLE = "true" Dzięki @Daniel Beck
bneil
3
Musisz także ustawić Profiles > Terminal > Terminal Emulation > Terminal may set tab/window title.
vaughan
1
TO NIE DZIAŁA (przynajmniej dla mnie) W NAJNOWSZEJ WERSJI iTerm (3.3.0)
iconoclast
I nie działa dla mnie na najnowszej stabilnej wersji iTerm2(3.2.9)
jalanb
45

Co dla mnie działa:

echo -e "\033];this is the title\007"

Jeśli używasz Mac OSX i iTerm, iTerm2 ::

  • iTerm → Preferencje → Wygląd → Okno i tytuły kart → odznacz wszystko

Jeśli korzystasz z zsh, może być konieczna edycja ustawień. Twoje ustawienia są zwykle w pliku ~/.zshrc. Chcesz dodać lub edytować ustawienia, aby upewnić się, że ten wiersz istnieje:

DISABLE_AUTO_TITLE="true"
joelparkerhenderson
źródło
2
Nadal działa od 28.02.2018.
salep
38

Jedną z udogodnień korzystania z iTerm jest możliwość osobnego ustawienia tytułu okna i tytułu karty: przykład użycia tytułu karty i okna osobno

# $1 = type; 0 - both, 1 - tab, 2 - title
# rest = text
setTerminalText () {
    # echo works in bash & zsh
    local mode=$1 ; shift
    echo -ne "\033]$mode;$@\007"
}
stt_both  () { setTerminalText 0 $@; }
stt_tab   () { setTerminalText 1 $@; }
stt_title () { setTerminalText 2 $@; }

W ten sposób możesz od razu zobaczyć, z którym hostem jesteś połączony w jakim oknie, a tytuł okna dla każdej karty pokazuje użytkownika i CWD.

Orangenhain
źródło
2
Właśnie zauważyłem, że wersja Terminal.app w OS X Lion również to obsługuje.
Orangenhain
głupie pytanie: dodajesz ten kod .bashrc, prawda?
qazwsx
Wydaje się również, że (w iTerm2 Build 1.0.0.20140629), dopóki nie zmienisz tytułu okna ... śledzi tytuł karty, bez względu na wszystko. Jestem pewien, że to ustawienie. Po zmianie tytułu okna (2) nie śledzi on już tytułu karty.
Mei
Zmodyfikowałem powyższą funkcję, tak aby zawierała wiersz, DISABLE_AUTO_TITLE="true"który rozwiązał problem. W ten sposób, jeśli nie
ustawię
5

A precmdzałatwia sprawę. Jednak niektóre motywy oh-my-zsh mieszają się z tytułem okna. Ustaw PR_TITLEBARpusty ciąg, aby go naprawić.

set-window-title() {
  # /Users/clessg/projects/dotfiles -> ~/p/dotfiles
  window_title="\e]0;${${PWD/#"$HOME"/~}/projects/p}\a"
  echo -ne "$window_title"
}

PR_TITLEBAR=''
set-window-title
add-zsh-hook precmd set-window-title

Poleciłbym również zabawę z ustawieniami zakładki iTerm2 w Preferencjach -> Wygląd.

Chris Gaudreau
źródło
2

Żadna z odpowiedzi nie działała dla mnie, prawdopodobnie dla wersji iterm2 (3.3.3).

Znalazłem to: https://gist.github.com/phette23/5270658#gistcomment-3020766

Zasadniczo możesz zrobić wszystko, co powiedziano we wszystkich innych odpowiedziach, ale musisz także ustawić Preferences > Profiles > General > Title -> Name (Job)

To zadziałało dla mnie.

Nuno Gonçalves
źródło
To nie jest pod Generalzakładką, jest pod Profileszakładką
Falmarri
Dobrze. Brakowało mi tego > Profiles. Mój błąd. Zaktualizowano
Nuno Gonçalves
1

Przyjęta odpowiedź działała dla mnie od dłuższego czasu, ale jest teraz zepsuta w najnowszej wersji iTerm2. Obejściem, które znalazłem, było włączenie API Pythona i utworzenie skryptu, który ustawia nazwę karty tak:

#!/usr/bin/env python3.7
import argparse

import iterm2

def get_args():
    parser = argparse.ArgumentParser(description='Set the tab name')
    parser.add_argument('name')
    return parser.parse_args()

ARGS = get_args()

async def main(connection):
    app = await iterm2.async_get_app(connection)
    window = app.current_terminal_window
    if window is not None:
        tab = window.current_tab
        await tab.async_set_title(ARGS.name)
    else:
        # You can view this message in the script console.
        print("No current window")

iterm2.run_until_complete(main)

Zapisano jako „tab_name.py”, a następnie wywołano za pomocą:

~/Library/ApplicationSupport/iTerm2/iterm2env/versions/*/bin/python3 ~/Library/ApplicationSupport/iTerm2/Scripts/tab_name.py "new tab name"

Nie jest tak ładny ani elegancki jak zaakceptowana odpowiedź, ale działa.

Ian E.
źródło
-2

iTerm -> Preferencje -> Wygląd -> Tytuły okien i kart -> zaznacz opcję Pokaż nazwę profilu

John Sam
źródło
1
Witamy w Super User! Na tej stronie pytań i odpowiedzi staramy się udzielać dobrych odpowiedzi na pytania, które zadają ludzie. Częścią napisania dobrej odpowiedzi jest zapewnienie kontekstu dla proponowanego rozwiązania. Edytuj swoją odpowiedź i wyjaśnij, dlaczego Twoje rozwiązanie działa, a co konkretnie działa.
cascer1