Tmux'u belirtilen pencereler açık olarak başlayacak şekilde nasıl kurarım?


Yanıtlar:


258

Gerekli programlarla tmux'u başlatan küçük bir kabuk betiği yazabilirsiniz. Dev-tmux dediğim bir kabuk komut dosyasında aşağıdaki var. Geliştirme ortamı:

#!/bin/sh
tmux new-session -d 'vim'
tmux split-window -v 'ipython'
tmux split-window -h
tmux new-window 'mutt'
tmux -2 attach-session -d

En sevdiğim geliştirme ortamımı her başlatmak istediğimde

$ dev-tmux

4
Teşekkürler! bash --rcfileBelirli bir devtools sürümü etkin bilimsel linux üzerinde güzel bir kabuk elde etmek için birlikte çalışmak için bu bazı kaçış yapmak zorunda kaldı . Birisi aynısını yapmaya çalışırsa bunu burada bırakacaktır. tmux new-window -n "git lg" "scl enable devtoolset-3 'bash --rcfile <(echo \"source \"$HOME/.bashrc\";cd ~/workspace/coolproject/;git lg\")'"
Lallen

1
Bence ikinci satır değişmeli, 'vim'den önce -s seçeneğine ihtiyacı var. "Tmux new-session -d 'vim", "tmux new-session -d -s' vim" ile değiştirilmelidir
Ahmad Yoosofan

2
@AhmadYoosofan, Pencerenin vimilk (ve yalnızca o anda) bölmesinde yürütülecek komutu temsil eder. Bunun yerine oturumu 'vim' olarak adlandırmak istiyorsanız, evet, haklısınız, -sbayrağı kullanmanız gerekiyor . Tüm sözdizimi: tmux new-session -d -s SessionName -n WindowName Command
Mitja

dikkat: zaten bir tmux oturumu başlattıysanız (başka bir yerde), komutlar diğer oturumda sona erebilir! @ waqar-lim 'in cevabının bu sorunu yok.
haja

174

Karmaşık bir bölme ızgarası oluşturmaya çalışıyordum ve bölmeleri tekrar tekrar değiştirmek ve bölmekle uğraşmak zorunda kaldım. İşte öğrendiklerim:

tmux new-session \;

Yeni bir oturumla başlamanızı sağlar. Yatay veya dikey olarak ayırmak için split-window -hveya -vdaha sonra, şöyle:

tmux new-session \; split-window -v \; split-window -h \;

Bunun gibi 3 bölme oluşturur:

------------
|          |
|----------|
|    |     |
------------

Sadece o kişileri ekleyin, bu bölmelerinde komutları çalıştırmak için send-keys 'my-command'komuta ve C-mbunu çalıştırır hangi:

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v \; \
  split-window -h \; \
  send-keys 'top' C-m \; 

Ve sonuçta ortaya çıkan oturum böyle görünmelidir.

------------
|  tail    |
|----------|
|    | top |
------------

Şimdi sol alt bölmeyi tekrar alt bölümlere ayırmaya çalıştım, bu yüzden ya kullanarak last-paneya da daha karmaşık pencerelerde geri dönerek , oluşturuldukları sırayla bölmenin sayısı select-pane -t 1nerede 1olacak şekilde değiştirildi 0.

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v \; \
  split-window -h \; \
  send-keys 'top' C-m \; \
  select-pane -t 1 \; \
  split-window -v \; \
  send-keys 'weechat' C-m \;

Bunu yapar. Temelde yolunuzu bilmek split-windowve select-paneihtiyacınız olan her şey. Bölmelerin boyutu üzerinde daha fazla kontrole sahip olmak için -p 75oluşturulmuş bölmenin yüzde boyutuyla geçmek de kullanışlıdır split-window.

tmux new-session \; \
  send-keys 'tail -f /var/log/monitor.log' C-m \; \
  split-window -v -p 75 \; \
  split-window -h -p 30 \; \
  send-keys 'top' C-m \; \
  select-pane -t 1 \; \
  split-window -v \; \
  send-keys 'weechat' C-m \;

Hangi oturumun böyle görünmesine neden olur

------------------
|      tail      |
|----------------|
|          | top |
|----------|     |
| weechat  |     |
------------------

Umarım tmuxgelecekte meraklılara yardımcı olur .


2
İnanılmaz bir kılavuz, ayrıldıktan sonra dikey panelin genişliğini nasıl yeniden boyutlandıracağımı yönlendirebilir misiniz?
MinhNV

2
@ MinhNV -h -p 30, mevcut yüksekliğin% 30'una sahip yatay bir panel oluşturur; -v -p 75% 75 genişliğe sahip dikey için aynı.
Afr

1
Amacı nedir \:? Senaryoların bu ve onsuz çalıştığını gördüm.
Kevin McDonough

2
GÜNCELLEME: \;noktalı virgül bash yerine tmux'a geçirilir ve komutların tmux'a bir çağrı ile gönderilmesine izin verilir. stackoverflow.com/questions/20913198/…
Kevin McDonough

96

Sizin gibi farklı oturumlar kaynak yapabilirsiniz .tmux.conf:

# initialize sessions
bind S source-file ~/.tmux/session1 
bind s source-file ~/.tmux/session2

Ardından oturumları istediğiniz gibi biçimlendirin:

#session1
new  -s SessionName -n WindowName Command
neww -n foo/bar foo
splitw -v -p 50 -t 0 bar
selectw -t 1 
selectp -t 0

Bu, ikincisi foo / bar olarak adlandırılacak ve foo çubuğun üzerinde çalışan dikey olarak ikiye bölünecek (% 50) 2 pencere açacaktır. Odak pencere 2'de (foo / bar), üst bölmede (foo) olacaktır.

Daha sonra tercih ettiğiniz tmux oturumunu (bu durumda, session1) ile başlatabilirsiniz. PrefixShifts


4
Bu oturum fazla dosya gerektirmeden .tmux.conf içinde başlatılamaz mı?
Eno

2
Bunlardan biri olabilir: bu şekilde kolayca daha özel oturumlar ekleyebilirsiniz - ve birkaç küçük metin dosyası neredeyse bir ek yük değil ...
jasonwryan

1
Bu oturum yuvalama olmaz mı? Ben demek Prefix Shift Stmux içinde olması gerekir ve dosya kaynak tmux sevmez ve zorlamak sürece yapmaz yeni bir oturum başlatmaya çalışır.
user35915

1
@ user35915 basitçe bir çocuk oturumu, ancak ayrı bir başlangıç olmayacak - Eğer örneğin önek-ler veya prefix-) kullanılarak ve prefix- (geçebilirsiniz bu konuda
sehe

1
Bu kabul edilen cevap olmalı. Bununla birlikte, s'ye (S değil) bağlanma, oturumları listeleme için yerleşik tmux bağlamasını geçersiz kılar.
say0

54

Tmuxinator kullanın - yapılandırılmış birden fazla oturumunuzun olmasını sağlar ve belirli bir zamanda hangisinin başlatılacağını seçebilirsiniz. Belirli pencerelerde veya bölmelerdeki komutları başlatabilir ve pencerelere başlık verebilirsiniz. İşte Django uygulamaları geliştirmek için bir örnek kullanım .

Örnek yapılandırma dosyası:

# ~/.tmuxinator/project_name.yml
# you can make as many tabs as you wish...

project_name: Tmuxinator
project_root: ~/code/rails_project
socket_name: foo # Not needed. Remove to use default socket
rvm: 1.9.2@rails_project
pre: sudo /etc/rc.d/mysqld start
tabs:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - #empty, will just run plain bash
        - top
  - shell: git pull
  - database: rails db
  - server: rails s
  - logs: tail -f logs/development.log
  - console: rails c
  - capistrano:
  - server: ssh me@myhost

Tam açıklama için yukarıdaki bağlantıdaki README'ye bakın.


2
tmuxinator temelde aradığım şeydi. Teşekkürler!
Justin Force

3
tmuxp da oldukça benzer: github.com/tony/tmuxp
Ben Creasy


16
:~$ tmux new-session "tmux source-file ~/session1"  

sezon 1

neww
split-window -v 'ipython'  
split-window -h  
new-window 'mutt'  

.bashrc içinde takma ad oluşturma

:~$ echo `alias tmux_s1='tmux new-session "tmux source-file ~/session1"'` >>~/.bashrc  
:~$ . ~/.bashrc  
:~$ tmux_s1  

~ Nedir neww? Bu komutu hiçbir yerde bulamıyorum. ~ Görünüşe göre new-window, hem uzun hem de kısa formu neden kullandığınızı anlayamıyorum.
oligofren

11

İlk önce @jasonwryan yaklaşımı vardı ama daha sonra 2 yapılandırma varsa, kafa karıştırıcı alabilirsiniz.

Bu yüzden bir takma ad işlevi oluşturdum:

tmx () {
    tmux "$2" source-file "$HOME/.tmux/$1.conf";
}

In ~/.tmux/i birçok kullanımlar için birden çok oturum var. Mesela, birbirinin geliştirici ortamına sahip farklı şirketler için çalışıyorum. Yani yukarıdaki diğer ad fonksiyonu ile ben sadece çağırabilir: tmx company1ve i ihtiyacım yapılandırma yükleyebilirsiniz.

Güncelleme:tmux Komuttan sonra "$ 2" nin amacı, ek tmux argümanlarını iletebilmenizdir.


1
Bunu @ soc1c'deki ipuçlarıyla birleştirmek çok tatlı bir kurulum yaptı ( github.com/fatso83/dotfiles/commit/35a7ed ). Teşekkürler!
oligofren

İşlev, bağlanmak (almak no server running on /tmp/tmux-1000/default) için zaten mevcut bir tmux oturumu olmadığında çalışmaz . Bu yüzden komutu düzeltmem gerekiyordu tmux new-session. Ref github.com/fatso83/dotfiles/commit/…
oligofren

1
Tmux kurulumumu systemd ile yaptım. Yani önyüklemeden sonra her zaman çalışan bir oturum vardır. wiki.archlinux.org/index.php/Tmux#Autostart_with_systemd Bahsetmediğim için üzgünüm.
danbruegge

10

Her sabah takip ettiğim yazılımı yenilemek için bir sonraki "get.XXX" işlerini çalıştırmaya çağırdığım "get.all" komut dosyamdan. Bazıları otomatik olarak kapanıyor. Diğerleri, alma işlemi bittikten sonra daha fazla etkileşime ihtiyaç duyar (emac oluşturmayı istemek gibi).

#!/bin/sh
tmux att -t get ||
tmux \
  new -s get -n capp \; \
  send-keys 'get.capp' C-m \; \
  neww -n emacs \; \
  send-keys 'get.emacs' C-m \; \
  neww -n git \; \
  send-keys 'get.git' C-m \; \
  neww -n mini \; \
  send-keys 'get.mini' C-m \; \
  neww -n port \; \
  send-keys 'get.port' C-m \; \
  neww -n rakudo \; \
  send-keys 'get.rakudo' C-m \; \
  neww -n neil \; \
  send-keys 'get.neil && get.neil2 && exit' C-m \; \
  neww -n red \; \
  send-keys 'get.red && exit' C-m \; \
  neww -n cpan \; \
  send-keys 'get.cpan && exit' C-m \; \
  selectw -t emacs

8

Ekranı sadece 2 bölmeye bölmek istiyorsanız (yatay olarak söyleyin), bu komutu çalıştırabilirsiniz (tmux veya kabuk komut dosyaları gerekmez):

tmux new-session \; split-window -h \;

Ekranınız şöyle görünecek:

[ks@localhost ~]$                      │[ks@localhost ~]$ 
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
                                       
[10] 0:ks@localhost:~*                  "localhost.localdomain" 19:51 31-янв-16

8

Ve ben böyle yapıyorum:

#!/bin/bash

function has-session {
  tmux has-session -t name_of_my_session 2>/dev/null
}

if has-session ; then
  echo "Session already exists"
else
  cd /path/to/my/project
  tmux new-session -d -s name_of_my_session 'vim'
  tmux split-window -h -p 40 start_web_server
  tmux split-window -v
  tmux attach-session -d -t name_of_my_session
fi

Projemin her biri için bir dosyam var. Ayrıca hobi projeleri için çalışmak için bazılarını gruplandırabilirsiniz.

Ayrıca ~/binklasöre taşıyabilir , ekleyebilir PATHve tmux_my_awesome_projectisim verebilirsiniz . Sonra her yerden çalıştırabileceksiniz.


4

Bu benim için çalışıyor. Verilen adlarla 5 pencere oluşturma ve homepencereye otomatik seçme .

new  -n home
neww -n emacs
neww -n puppet
neww -n haskell
neww -n ruby
selectw -t 1

3

Deneyin kardeşim , bu bir proje bootstrapper.

Etkileşimi kolay apis sağlar tmux.

Şuna benziyor:

#!/bin/sh
# @ project_name/tasks/init.sh
structure project_name
  window editor
    run 'vim'
  window terminal
    run 'echo happy coding ...'
focus editor
connect project_name

Bir projeyi başlatmak için tek yapmanız gereken aşağıdaki komutu çalıştırmaktır -

bro start <project_name>

Aşağıdaki ekran görüntüsüne bakın, api'yi nasıl brokullanmaya tmuxbaşlayacağınızı ve kullanılacağını gösterir .

https://user-images.githubusercontent.com/8296449/50532502-2cf3e400-0b6e-11e9-84af-c5f77a04e5cc.gif


2

Bunun için bir tmux eklentisi var.

Check out tmux-resurrect

Sistem yeniden başlatıldıktan sonra tmux ortamını geri yükleyin.

Tmux, bilgisayarı yeniden başlatmanız dışında harika. Çalışan tüm programları, çalışma dizinlerini, bölme düzenlerini vb. Kaybedersiniz. Orada yardımcı yönetim araçları vardır, ancak iş akışınız geliştikçe veya yeni projeler başlattıklarında ilk yapılandırma ve sürekli güncellemeler gerektirirler.

tmux-resurrect, tmux ortamınızdaki tüm küçük ayrıntıları kaydeder, böylece sistem yeniden başlatıldıktan sonra (veya istediğiniz gibi) tamamen geri yüklenebilir. Hiçbir yapılandırma gerekmez. Hiç tmux'u bırakmamış gibi hissetmelisin.

Veya tmux-continuum

Özellikleri:

  • tmux ortamının sürekli tasarrufu
  • bilgisayar / sunucu açıldığında otomatik tmux başlatma
  • tmux başlatıldığında otomatik geri yükleme

1

Bunu tmux yapılandırma dosyanızda ( ~/.tmux.conf) belirtmelisiniz , örneğin:

new mocp
neww mutt

new -d
neww
neww

(bir oturumu mocp ilk olarak başlatılan ve ikincisinde muttur ile 2 pencereyle ve diğer bir oturumu 3 boş pencereyle açar).


1

Bu senaryoyu oluşturdum . Tmuxinator, ruby ​​veya başkalarına ihtiyaç duymaz. Bu sadece bir bash betiği, yapılandırılabilir:

Config adlı bir dosya şöyle bir şey içermelidir:

combo=()
combo+=('logs' 'cd /var/log; clear; pwd')
combo+=('home' 'cd ~; clear; pwd')

ve bash kodu şöyle olmalıdır:

#!/bin/bash

if [ -r config ]; then
    echo ""
    echo "Loading custom file"
    . config
else
    . config.dist
fi

tmux start-server

window=0
windownumber=-1

for i in "${combo[@]}"; do

    if [ $((window%2)) == 0 ]; then
        name=${i}
        ((windownumber++))
    else
        command=${i}
    fi

    if [ ${combo[0]} == "${i}" ]; then
        tmux new-session -d -s StarTmux -n "${name}"
    else
        if [ $((window%2)) == 0 ]; then
            tmux new-window -tStarTmux:$windownumber -n "${name}"
        fi
    fi

    if [ $((window%2)) == 1 ]; then
        tmux send-keys -tStarTmux:$windownumber "${command}" C-m
    fi

    ((window++))
done

tmux select-window -tStarTmux:0
tmux attach-session -d -tStarTmux

Merhaba sensorario, bu bağlantı soruyu cevaplayabilirken, cevabın temel bölümlerini buraya eklemek ve referans için bağlantı sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir. Lütfen buraya bir göz atın: Bazı cevaplar neden ve nasıl silinir?
bummi

Şaşırtıcı, tmux start_servertek başına bir sunucu başlatmıyor. Bkz. Github.com/tmux/tmux/issues/182
Jack Wasey

1

tmuxp JSON veya YAML oturum yapılandırmasını ve bir python API'sini destekler. YAML sözdiziminde yeni bir oturum oluşturmak için basit bir tmuxp yapılandırma dosyası:

session_name: 2-pane-vertical
windows:
  - window_name: my test window
    panes:
      - pwd
      - pwd

1

Eklenti tmux-continuum , tmux oturumunuzu otomatik olarak kaydedecek ve tmux'un bir sonraki başlatılışında yükleyecektir, kurulumu burada özel komut dosyası çözümlerinden bazılarından daha kolay olmalıdır.

Özellikleri:

  • tmux ortamının sürekli tasarrufu
  • bilgisayar / sunucu açıldığında otomatik tmux başlatma
  • tmux başlatıldığında otomatik geri yükleme

Oturumunuzu istek üzerine kaydetmek için tmux-resurrect eklentisini kullanabilirsiniz. tmux -continuum'u çalıştırmak için tmux-resurrect de gereklidir

tmux-resurrect, tmux ortamınızdaki tüm küçük ayrıntıları kaydeder, böylece sistem yeniden başlatıldıktan sonra (veya istediğiniz gibi) tamamen geri yüklenebilir. Hiçbir yapılandırma gerekmez. Hiç tmux'u bırakmamış gibi hissetmelisin.


1

Yeni bir oturum oluşturulduğunda komutları yürütmek için tmux kancalarını kullanabilirsiniz . Özellikle, bu session-createdkanca kullanılarak elde edilir .

Örneğin, sağ altta htop çalışırken ekranı üç şekilde bölmek için ~/.tmux.confdosyanıza aşağıdaki satırı ekleyebilirsiniz :

set-hook -g session-created 'split -h ; split -v top'

Bu yöntemin avantajı, istenen sonucu elde etmek için tmux'u herhangi bir özel şekilde (yani kabuk komut dosyası veya diğer ad) çalıştırmanız gerekmemesidir. Ayrıca , kanca komutlarının yalnızca oturumu ilk oluşturduğunuzda ve sonraki eklerde çalıştırılmaması için bu diğer yanıttatmux new-session -A -s mysession açıklananla birleştirebilirsiniz .

Bu özellik 2016 yılında d15d54c2c tarafından eklendi. Eklenen ilk sürüm 2.4'tür .


0

Bu sayfadaki tüm fikirleri kullanmayı denedim ve hiçbirini beğenmedim. Terminalim açıldığında sadece tmux'u belirli bir pencere seti ile başlatan bir çözüm istedim. Ayrıca idempotent olmasını istedim, yani yeni bir terminal penceresi açmak bir öncekinden tmux oturumunu ele geçiriyor.

Yukarıdaki çözümler genellikle birden fazla tmux oturumu açma eğilimindedir ve sadece bir tane istiyorum. İlk olarak, bunu ekledim ~/.bash_profile:

tmux start-server
if [[ -z "$TMUX" ]]
then
  exec tmux attach -d -t default
fi

daha sonra aşağıdakileri ekledim ~/.tmux.conf:

new -s default -n emacs /usr/local/bin/emacs
neww -n shell /usr/local/bin/bash
neww -n shell /usr/local/bin/bash
selectw -t 1

şimdi bir terminal başlattığımda ya da tmux'u ya da her neyse başlattığımda, mevcut istenen kurulumuma (oturum adı verilen default) yeniden bağlarım ya da bu kurulumla yeni bir oturum oluşturuyorum.


şaşırtıcı bir şekilde, tmux start_serverkendi başına bir sunucu başlatmaz. Bkz. Github.com/tmux/tmux/issues/182
Jack Wasey

0

Bu komut dosyası "e" adında ve üç pencereli bir oturum başlatır

#!/bin/sh 
tmux new-session -s e   -n etc -d 'cd /etc; bash -i'
tmux new-window  -t e:1 -n home   'cd ~; bash -i'
tmux new-window  -t e:2 -n log   'cd /var/log; bash -i'

tmux select-window -t e:1
tmux -2 attach-session -t e
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.