Làm cách nào để thiết lập tmux để nó khởi động với các cửa sổ đã chỉ định được mở?


Câu trả lời:


257

Bạn có thể viết một tập lệnh shell nhỏ khởi chạy tmux với các chương trình cần thiết. Tôi có đoạn mã sau trong shell script mà tôi gọi là dev-tmux. Một môi trường dev:

#!/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

Vì vậy, bất cứ khi nào tôi muốn khởi chạy môi trường dev yêu thích của mình, tôi chỉ có thể làm

$ dev-tmux

4
Cảm ơn! Tôi đã phải thực hiện một số thoát khủng khiếp để làm cho nó hoạt động kết hợp với bash --rcfileđể có được một trình bao đẹp trên linux khoa học với một phiên bản devtools cụ thể được kích hoạt. Sẽ để lại đây nếu ai đó cố gắng làm như vậy. tmux new-window -n "git lg" "scl enable devtoolset-3 'bash --rcfile <(echo \"source \"$HOME/.bashrc\";cd ~/workspace/coolproject/;git lg\")'"
Lallen

1
Tôi nghĩ rằng dòng thứ hai phải được thay đổi, nó cần tùy chọn -s trước 'vim'. Nó có nghĩa là "tmux new-session -d 'vim'" phải được thay thế bằng "tmux new-session -d -s 'vim'"
Ahmad Yoosofan

2
@AhmadYoosofan, Chữ vimviết tắt của lệnh sẽ được thực thi trong khung đầu tiên (và tại thời điểm đó) của cửa sổ. Thay vào đó, nếu bạn muốn đặt tên phiên là 'vim' thì có, bạn đã đúng, bạn phải sử dụng -scờ. Toàn bộ cú pháp: tmux new-session -d -s SessionName -n WindowName Command
Mitja

xem ra: nếu bạn đã bắt đầu một phiên tmux (ở nơi khác), các lệnh có thể kết thúc trong phiên khác! Câu trả lời của @ waqar-lim không có vấn đề này.
haja

173

Tôi đã cố gắng tạo ra một mạng lưới phức tạp và phải đối phó với việc chuyển đổi và chia tách nhiều lần. Dưới đây là những bài học của tôi:

tmux new-session \;

Được bạn bắt đầu với một phiên mới. Để phân chia nó sử dụng ngang hoặc dọc split-window -hhoặc -vsau đó, như thế:

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

Tạo 3 tấm, như thế này:

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

Để chạy các lệnh trong các bảng đó, chỉ cần thêm chúng bằng send-keys 'my-command'lệnh và C-mthực thi lệnh đó:

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

Và phiên kết quả sẽ như thế.

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

Bây giờ tôi cố gắng một lần nữa chia nhỏ các cửa sổ phía dưới bên trái, do đó chuyển đổi hoặc trở lại sử dụng last-pane, hoặc trong các cửa sổ phức tạp hơn, với các select-pane -t 1nơi 1là số của cửa sổ để tạo ra bắt đầu với 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 \;

Có phải vậy không Cơ bản biết cách của bạn xung quanh với split-windowselect-panelà tất cả những gì bạn cần. Nó cũng thuận tiện để vượt qua với -p 75một tỷ lệ phần trăm của khung được tạo bởi split-windowđể có nhiều quyền kiểm soát hơn đối với kích thước của các ô.

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 \;

Kết quả trong một phiên trông như thế

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

Hy vọng rằng sẽ giúp tmuxnhững người đam mê trong tương lai.


2
hướng dẫn tuyệt vời, bạn có thể hướng dẫn tôi cách thay đổi kích thước chiều rộng của bảng dọc sau khi chia.
MinhNV

2
@MinhNV -h -p 30tạo một bảng điều khiển ngang với 30% chiều cao có sẵn; -v -p 75tương tự cho chiều dọc với 75% chiều rộng.
Afr

1
Mục đích của là \:gì? Tôi đã thấy các kịch bản làm việc có và không có điều này.
Kevin McDonough

2
CẬP NHẬT: \;chuyển dấu chấm phẩy cho tmux thay vì bash, cho phép các lệnh được gửi với một cuộc gọi đến tmux. stackoverflow.com/questions/20913198/ Mạnh
Kevin McDonough

96

Bạn có thể nguồn các phiên khác nhau từ .tmux.confnhư thế của bạn như vậy:

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

Và sau đó định dạng các phiên như bạn yêu cầu:

#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

Điều này sẽ mở 2 cửa sổ, cửa sổ thứ hai sẽ được đặt tên là foo / bar và sẽ được chia theo chiều dọc một nửa (50%) với foo chạy trên thanh. Tiêu điểm sẽ ở cửa sổ 2 (foo / bar), khung trên cùng (foo).

Sau đó, bạn có thể bắt đầu phiên tmux ưa thích của mình (trong trường hợp này là session1) với PrefixShifts


4
Các phiên đó có thể được bắt đầu bên trong .tmux.conf mà không yêu cầu thêm tệp không?
Eno

2
Một trong số đó có thể: theo cách này bạn có thể dễ dàng thêm các phiên tùy chỉnh hơn - và một vài tệp văn bản nhỏ hầu như không phải là chi phí ...
jasonwryan 22/03/2016

1
Đây sẽ không phải là phiên lồng nhau? Ý tôi là để chạy Prefix Shift STôi cần phải ở trong tmux và tìm nguồn cung cấp tệp của bạn để bắt đầu một phiên mới mà tmux không thích và sẽ không làm trừ khi bạn buộc phải làm như vậy.
dùng35915

1
@ user35915 đơn giản là nó sẽ không bắt đầu một phiên con, mà là một phiên riêng biệt - trên đó bạn có thể chuyển sang sử dụng ví dụ: tiền tố-s hoặc tiền tố-) và tiền tố- (
sehe

1
Đây phải là câu trả lời được chấp nhận. Tuy nhiên, ràng buộc với s (không phải S) sẽ ghi đè liên kết tmux tích hợp sẵn cho các phiên liệt kê.
đếm 0

54

Sử dụng tmuxinator - nó cho phép bạn có nhiều phiên được cấu hình và bạn có thể chọn phiên nào sẽ khởi chạy tại bất kỳ thời điểm nào. Bạn có thể khởi chạy các lệnh trong các cửa sổ hoặc bảng cụ thể và đặt tiêu đề cho các cửa sổ. Dưới đây là một ví dụ sử dụng với việc phát triển các ứng dụng Django .

Tệp cấu hình mẫu:

# ~/.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

Xem README tại liên kết trên để được giải thích đầy đủ.


2
tmuxinator về cơ bản là chính xác những gì tôi đang tìm kiếm. cảm ơn!
Justin Force

3
cũng có tmuxp khá giống nhau: github.com/tony/tmuxp
Ben Creasy


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

phiên 1

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

tạo một bí danh trong .bashrc

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

~ Cái gì neww? Tôi không thể tìm thấy lệnh đó ở bất cứ đâu. ~ Có vẻ như vậy new-window, mặc dù tôi không thể hiểu tại sao bạn sử dụng cả dạng dài và dạng ngắn.
oligofren

11

Đầu tiên tôi đã có cách tiếp cận từ @jasonwryan nhưng nếu bạn có nhiều hơn 2 cấu hình, nó có thể gây nhầm lẫn.

Vì vậy, tôi đã tạo ra một hàm bí danh:

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

Trong ~/.tmux/tôi có nhiều phiên cho nhiều mục đích sử dụng. Ví dụ tôi làm việc cho các công ty khác nhau có môi trường dev khác. Vì vậy, với chức năng bí danh ở trên, tôi có thể chỉ cần gọi: tmx company1và tải cấu hình tôi cần.

Cập nhật: Mục đích của "$ 2" sau tmuxlệnh là, bạn có thể vượt qua các đối số tmux bổ sung.


1
Kết hợp điều này với các mẹo từ @ soc1c đã tạo ra một thiết lập siêu ngọt ngào ( github.com/fatso83/dotfiles/commit353a7ed ). Cảm ơn!
oligofren

Hàm không thực sự hoạt động khi chưa có phiên tmux hiện có để kết nối (get no server running on /tmp/tmux-1000/default). Đó là lý do tại sao tôi cần phải vá lệnh tmux new-session. Tham khảo github.com/fatso83/dotfiles/commit/ từ
oligofren

1
Tôi đã thiết lập tmux của tôi với systemd. Vì vậy, luôn luôn có một phiên chạy sau khi khởi động. wiki.archlinux.org/index.php/Tmux#Autostart_with_systemd Xin lỗi vì đã không đề cập đến nó.
danbruegge

10

Từ tập lệnh "get.all" của tôi, mà tôi gọi mỗi sáng để chạy một loạt các công việc "get.XXX" tiếp theo để làm mới phần mềm mà tôi theo dõi. Một số trong số họ là tự động bỏ. Những người khác yêu cầu nhiều tương tác hơn sau khi nhận được kết thúc (như yêu cầu xây dựng emacs).

#!/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

Nếu bạn chỉ muốn phân chia màn hình trên 2 panes (nói theo chiều ngang), bạn có thể chạy lệnh này (không yêu cầu tmux hoặc shell script):

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

Màn hình của bạn sẽ trông như thế này:

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

8

Và đây là cách tôi làm:

#!/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

Tôi có một tập tin cho mỗi dự án của tôi. Ngoài ra, bạn có thể nhóm chúng để có một số cho công việc một số cho các dự án sở thích.

Ngoài ra, bạn có thể di chuyển nó vào ~/binthư mục, thêm nó vào PATHtmux_my_awesome_projectđặt tên. Sau đó, bạn sẽ có thể chạy nó từ mỗi nơi.


4

Điều này làm việc cho tôi. Tạo 5 cửa sổ với các tên đã cho và tự động chọn vào homecửa sổ.

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

3

Hãy thử bro , nó là một bootstrapper dự án.

Nó cung cấp apis dễ dàng để tương tác với tmux.

Nó trông giống như thế này:

#!/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

Để khởi chạy một dự án, tất cả những gì bạn cần làm là chạy lệnh sau -

bro start <project_name>

Kiểm tra screencast dưới đây, nó cho thấy làm thế nào để bắt đầu brovà sử dụng tmuxapi của nó .

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


2

Có một plugin tmux cho việc này.

Kiểm tra tmux-hồi sinh

Khôi phục môi trường tmux sau khi khởi động lại hệ thống.

Tmux là tuyệt vời, ngoại trừ khi bạn phải khởi động lại máy tính. Bạn mất tất cả các chương trình đang chạy, thư mục làm việc, bố trí khung, v.v. Có những công cụ quản lý hữu ích ngoài kia, nhưng chúng yêu cầu cấu hình ban đầu và cập nhật liên tục khi quy trình làm việc của bạn phát triển hoặc bạn bắt đầu các dự án mới.

tmux-resurrect lưu tất cả các chi tiết nhỏ từ môi trường tmux của bạn để nó có thể được khôi phục hoàn toàn sau khi khởi động lại hệ thống (hoặc khi bạn cảm thấy thích nó). Không cần cấu hình. Bạn sẽ cảm thấy như bạn không bao giờ bỏ tmux.

Hoặc tmux-continuum

Đặc trưng:

  • tiết kiệm liên tục môi trường tmux
  • tự động khởi động tmux khi máy tính / máy chủ được bật
  • tự động khôi phục khi tmux được khởi động

1

Bạn nên chỉ định nó trong tệp cấu hình tmux ( ~/.tmux.conf) của bạn, ví dụ:

new mocp
neww mutt

new -d
neww
neww

(mở một phiên với 2 cửa sổ với mocp được khởi chạy trong lần đầu tiên và mutt trong lần thứ hai và một phiên khác với 3 cửa sổ trống).


1

Tôi đã tạo tập lệnh này . Nó không cần tmuxinator, ruby ​​hoặc những người khác. Nó chỉ là một tập lệnh bash, có thể cấu hình:

Một tập tin có tên config nên chứa một cái gì đó như thế này:

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

và mã bash phải là:

#!/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

Xin chào cảm biến, trong khi liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. Xin hãy xem tại đây: Tại sao và làm thế nào một số câu trả lời bị xóa?
bummi

Thật đáng ngạc nhiên, tmux start_serverkhông tự mình khởi động một máy chủ. Xem github.com/tmux/tmux/issues/182
Jack Wasey

1

tmuxp hỗ trợ cấu hình phiên JSON hoặc YAML và API python. Một tệp cấu hình tmuxp đơn giản để tạo một phiên mới theo cú pháp YAML là:

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

1

Plugin tmux-continuum sẽ tự động lưu phiên tmux của bạn và tải nó vào lần tiếp theo tmux bắt đầu, nên dễ cài đặt hơn một số giải pháp tập lệnh tùy chỉnh ở đây.

Đặc trưng:

  • tiết kiệm liên tục môi trường tmux
  • tự động khởi động tmux khi máy tính / máy chủ được bật
  • tự động khôi phục khi tmux được khởi động

Để lưu phiên của bạn theo yêu cầu, bạn có thể sử dụng plugin tmux-resurrect . tmux-resurrect cũng được yêu cầu để chạy tmux-continuum

tmux-resurrect lưu tất cả các chi tiết nhỏ từ môi trường tmux của bạn để nó có thể được khôi phục hoàn toàn sau khi khởi động lại hệ thống (hoặc khi bạn cảm thấy thích nó). Không cần cấu hình. Bạn sẽ cảm thấy như bạn không bao giờ bỏ tmux.


1

Bạn có thể sử dụng các tmux hook để thực thi các lệnh khi một phiên mới được tạo. Cụ thể, điều này đạt được bằng cách sử dụng session-createdmóc.

Ví dụ: để phân chia màn hình ba cách với htop chạy ở phía dưới bên phải, bạn có thể thêm dòng sau vào ~/.tmux.conftệp của mình :

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

Ưu điểm của phương pháp này là bạn không phải chạy tmux theo bất kỳ cách đặc biệt nào (ví dụ: shell script hoặc bí danh) để có được kết quả mong muốn. Bạn cũng có thể kết hợp điều này với tmux new-session -A -s mysessionmô tả trong câu trả lời khác này để các lệnh hook chỉ được chạy khi bạn lần đầu tiên tạo phiên chứ không phải trên các tệp đính kèm tiếp theo.

Tính năng này đã được thêm vào bởi d15d54c2c vào năm 2016. Bản phát hành đầu tiên bao gồm nó là 2.4.


0

Tôi chỉ thử sử dụng tất cả các ý tưởng trên trang này và tôi không thích bất kỳ ý tưởng nào trong số đó. Tôi chỉ muốn một giải pháp bắt đầu tmux với một bộ cửa sổ cụ thể khi thiết bị đầu cuối của tôi mở. Tôi cũng muốn nó là idempotent, tức là mở một cửa sổ terminal mới sẽ tiếp quản phiên tmux từ cái trước đó.

Các giải pháp trên thường có xu hướng mở nhiều phiên tmux và tôi chỉ muốn một phiên. Đầu tiên, tôi đã thêm nó vào ~/.bash_profile:

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

sau đó tôi đã thêm vào như sau ~/.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

bây giờ mỗi khi tôi bắt đầu một thiết bị đầu cuối hoặc bắt đầu tmux hoặc bất cứ điều gì, tôi sẽ gắn lại thiết lập mong muốn hiện tại của mình (phiên có tên default) hoặc tạo một phiên mới với thiết lập đó.


thật đáng kinh ngạc, tmux start_serverkhông tự mình khởi động một máy chủ. Xem github.com/tmux/tmux/issues/182
Jack Wasey

0

Kịch bản này bắt đầu một phiên với tên "e" và ba cửa sổ

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.