Jak sprawić, by tmux otworzył zestaw paneli bez ręcznego wprowadzania ich?

30

Chcę więc utworzyć tmuxsesję specyficzną dla projektu, która wyskakuje automatycznie niektóre polecenia w niektórych oknach. Po samouczku online i stronie podręcznikatmux wymyślam plik konfiguracyjny:

new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

Rezultat jest ... niczym. tmuxuruchamia się z pojedynczym oknem i pojedynczym oknem w tym oknie bez wykonywania poleceń.

Jak mam zrobić plik konfiguracyjny, który faktycznie pozwala mi utworzyć zestaw okien i paneli z wcześniej wykonanymi poleceniami?

WŁAŚNIE MOJA poprawna OPINIA
źródło

Odpowiedzi:

36

Twój plik konfiguracyjny działa, ale jest kilka komplikacji.

Krótkotrwałe polecenia

Po pierwsze, uruchamiane polecenia (instancje ls ) kończą się bardzo szybko. Okna i panele dla poleceń są tworzone, ale znikają po wyjściu każdego polecenia.

Jeśli Twoim celem jest użycie takich poleceń „jednego strzału” w ostatecznej konfiguracji, prawdopodobnie powinieneś użyć opcji okna remain-on-exit(i ewentualnie opcji sesji, set-remain-on-exitaby zapewnić domyślną wartość dla wszystkich okien utworzonych w sesji). Kiedy remain-on-exitjest ustawione dla okna, nie zniknie ono po wyjściu polecenia. Prawdopodobnie będziesz chciał zmapować respawn-windowklucz (uwaga: odrodzirespawn-window oryginalne polecenie; respawn-panejest również dostępny w tmux 1.5 do odrodzenia pojedynczych paneli).

bind-key R respawn-window

# set global r-o-e so that initial window of initial session gets it
set -g set-remain-on-exit on

# create a session and its windows/panes
new -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# restore global r-o-e
set -g set-remain-on-exit off

# let session r-o-e inherit from global value for future windows
set -u set-remain-on-exit

Lub, jeśli nie przeszkadza ci, że okno początkowe ma numer 1 zamiast 0, możemy uniknąć zmiany wartości globalnej:

bind-key R respawn-window

# create a session with a throw-away window
new true

# for future windows, stay open after the command exits
set set-remain-on-exit on

# create the windows we really want
neww -n estruct ls
neww -n estruct2 ls
splitw -v -p 50 -t 0 ls

# for future windows, revert r-o-e to global value
set -u set-remain-on-exit

Jeśli używasz tylko lsjako uproszczonego polecenia zastępczego i faktycznie zamierzasz odrodzić jakieś interaktywne polecenie w swoich oknach / oknach, prawdopodobnie powinieneś po prostu spawnować polecenie, które zamierzałeś w końcu uruchomić. Jeśli przeznaczone komenda trwa zbyt długo uruchomieniem go używać podczas tmux testów, a następnie zastąpić powłokę lub inne proste polecenia (np interaktywne top, sqlite3etc.).

new-session Jest poleceniem domyślnym

Po drugie, uruchomienie tmux bez argumentu polecenia (np. tmux) Jest równoznaczne z użyciem new-sessionpolecenia (tzn. tmuxJest takie samo jak tmux new-session). Twój .tmux.conftworzy sesję dla swoich okien / szyb ( newjest aliasem new-session) i kolejna sesja jest tworzony dla niejawnego new-sessionpolecenia określonego przez rozpoczęciem tmux bez argumentu polecenia. Jeśli używasz domyślnego paska stanu, [1]po lewej stronie paska stanu zobaczysz symbol „dodatkowej” sesji (początkowa sesja utworzona w polu .tmux.confto 0).

Jeśli chcesz uniknąć tworzenia dodatkowej sesji, użyj tmux attachzamiast zwykłego tmux. Polecenia z twojego komputera .tmux.confuruchomią się, tworząc sesję 0, a następnie klient przyłączy się do tej sesji zamiast tworzyć nową.

Chris Johnsen
źródło
2
OK, może jestem tutaj gruby jak kanapka z wielorybem, ale teraz mam plik konfiguracyjny, który ma tylko splitww sobie - nic więcej - i nadal nie otrzymuję podzielonego ekranu, ponieważ to mówi nie można ustanowić bieżącej sesji. Jeśli dodam newwcześniej, otrzymam ... jedno okno, jedno okienko. Nie wydaje mi się, żeby moje życie dostało dwie szyby na starcie.
PO PROSTU MOJA poprawna OPINIA,
1
Plik konfiguracyjny z new, a następnie splitwdziała dla mnie, gdy uruchamiam tmux przez tmux attach. Jedną rzeczą do zapamiętania jest to, że .tmux.conf(lub plik określony z -fopcją) jest używany tylko wtedy, gdy nie działa już serwer. Sprawdź, czy serwer działa przez tmux ls. Jeśli chcesz uruchomić polecenia z pliku, gdy serwer już działa, zrób to w następujący sposób: tmux source-file /path/to/conf-file-that-creates-a-session-and-windows \; attach(jeśli uruchomisz to, gdy nie ma serwera, najpierw uruchomi się .tmux.conf(lub -fplik), a potem source-fileplik).
Chris Johnsen
Plik konfiguracyjny jest określany przez -f - więc idę tmux new -f myconfig. Zawartość tego pliku konfiguracyjnego zawiera tylko new następujące znaki splitw. Zabijam wszystkie procesy tmux, zanim wypróbuję wiersz poleceń tmux -f myconfig. Nie dostaję dwóch szyb. Naprawdę nie rozumiem, co robić poza tym punktem (oprócz po prostu rezygnacji z Tmux).
WŁAŚNIE MOJA poprawna OPINIA,
4
@ Just: Niezależnie od tego, czy używasz, -fczy nie, tmuxbez argumentu polecenia jest taki sam jak tmux new-session(który dla nowych serwerów utworzy nową sesję nad wszystkim, co robi plik konfiguracyjny). Twoje wstępnie podzielone okno jest tworzone w sesji 0, ale niejawne new-sessionpolecenie tworzy (i dołącza) dodatkową sesję (sesja 1; poszukaj [1]w linii statusu). Użyj, tmux -f myconfig attachaby uniknąć tworzenia nowej sesji, która ukrywa Twoje okno przed podziałem.
Chris Johnsen
1
OK, myślę, że nauka czytania w końcu się za mnie opłaci. :) Dzięki za wysiłek i odpowiedź. Teraz wszystko działa dobrze. Żałuję, że nie ma tu reputacji „wywrotki”, abym mógł dać ci coś więcej niż tylko zaakceptowaną odpowiedź.
PO PROSTU MOJA poprawna OPINIA,
9

Nie jestem pewien, czy rozumiem, co rozumiesz przez „ręczne wprowadzanie”, ale właśnie tak to robię. Napisałem skrypt „autostart”, który uruchamia mój menedżer okien. Zawiera:

tmux start-server                                                                                                                                                                                                                                                                                                                                                            
for i in ~/sessions_tmux/*.session; do "$i"; done

gdzie każdy plik .session wygląda mniej więcej tak:

#!/bin/bash

SESSION_NAME="flaskr_tutorial"
if [[ ! -z "$TMUX" ]] || [[ ! -z "$TMUX_PANE" ]]; then
    echo "Already inside a tmux session, do not know what to do"
    exit 1
fi
tmux -q has-session -t "$SESSION_NAME"
if [ $? ]; then
    exit 0
fi
NEWCWD=~/projects/flaskr/
( cd "${NEWCWD}"; tmux new-session -d -s "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'vim flaskr.py' Enter
( cd "${NEWCWD}"; tmux split -h -t "$SESSION_NAME" )
tmux send-keys -t "$SESSION_NAME" 'sudo tail -F -n 100 /var/log/messages | ccze' Enter

Czekaj, jest więcej! Mam coraz większą liczbę plików .session, które ładuję za pomocą konsoli:

konsole --background-mode --profile Shell --tabs-from-file ~/sessions_tmux/work_console.tabs

gdzie work_console.tabs wygląda mniej więcej tak:

.
.
.
title: projectx;;    command: tmux attach -t projectx
title: flaskr;;      command: tmux attach -t flaskr_tutorial
.
.
.

Następnie naciskam F12, aby uruchomić konsolę.

John Schmitt
źródło
konsola wydaje się być zepsuta, więc przełączyłem się na Terminal , który działa dobrze. Mam bardziej szczegółowy post na liście mailingowej użytkowników tmux.
John Schmitt
1
Tylko mały komentarz, możesz zastąpić „! -z 'z' -n 'w twoich testach;)
lilorox
6

załóżmy, że chcesz uruchomić 3 zadania monitorowania serwera (tutaj ping localhost), nie ma potrzeby bałagania się przy plikach konfiguracyjnych i zapisanych sesjach. Wszystko to można zrobić z wiersza polecenia.

tmux new-session 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    split-window 'ping  127.0.0.1' \; \
    select-layout even-vertical
Jasen
źródło
Dzięki za prostotę - dokładnie taki przykład, którego szukałem!
dsz
5

Uważam, że teamocil jest bardzo przydatny do automatyzacji okien / sesji Tmux.

Jest napisany w Ruby, więc musisz go zainstalować.

Oto przykładowa konfiguracja:

session:
  name: 'my project'
  windows:
    -name: vim
     root: '~/code/my_project'
     splits:
       - cmd: vim
       - cmd: guard

Możesz mieć układ okien i podziałów.

Kris
źródło
4

Inną alternatywą podobną do teamcoil jest tmuxinator , aktywnie się rozwija i działa całkiem dobrze. Jest także polecany (i jakby recenzowany) na niesamowitym tmux: Productive Free-Mouse Development from The Pragmatic Bookhelf .

Pablo Olmos de Aguilera C.
źródło
Uważam, że jest odrobinę czystszy niż teamocil (ale bardzo podobny) i używam go teraz. Jestem całkiem zadowolony z tego, jak to działa!
Aktau,
4

**

  • Lepiej zapisz sesję!

** Przekonałem się, że dla leniwego administratora, takiego jak ja, wolę zapisać sesję tmux, niż spędzać godziny próbując zbudować ją idealnie. Administruję ponad 30 serwerami, a moje sesje tmux są dynamiczne, a konfiguracja cały czas się zmienia. To był ból szyi, aż do niedawna odkryłem, że ta wtyczka jest w porządku . Spróbuj. Obecnie repozytoria Ubuntu mają tmux 1.8, ta wtyczka potrzebuje 1.9, więc musisz zaktualizować ręcznie

sudo apt-get install python-software-properties software-properties-common
sudo add-apt-repository ppa:pi-rho/dev
sudo apt-get update
sudo apt-get install  tmux=2.0-1~ppa1~t

Następnie możesz go zainstalować

git clone https://github.com/tmux-plugins/tmux-resurrect ~/clone/path

Następnie dodaj tę linię do dolnej części ~ / .tmux.conf (jeśli ~ / .tmux.conf nie jest dostępny, utwórz pusty plik)

run-shell ~/clone/path/resurrect.tmux

Dodam również ten wiersz na końcu ~ / .tmux.conf, aby wtyczka zapisała sesje dla wszystkich programów, które uruchamiam

set -g @resurrect-processes ':all:'

Następnie przeładuj środowisko tmux.

tmux source-file ~/.tmux.conf

To jest to! Gotowe. Teraz uruchom tmux jak zwykle, zmień rozmiar swoich paneli, twórz nowe panele, twórz nowe sesje ... itd. Kiedy jesteś zadowolony z konfiguracji, którą osiągnąłeś (w kilku oknach i kilku sesjach), po prostu kliknij ctrl + b, a następnie ctrl + s, aby zapisać sesję. Aby przetestować wyniki, po prostu zabij wszystkie tmux

killall tmux

Następnie uruchom ponownie tmux

tmux

Następnie z poziomu tmux kliknij ctrl + b, a następnie ctrl + r (w celu przywrócenia) Magicznie wszystkie okna, panele i sesje są przywracane z tą samą geometrią i układem. Mam nadzieję, że to pomoże.

użytkownik1757247
źródło