ฉันจะให้ tmux เปิดชุดของบานหน้าต่างโดยไม่ต้องป้อนด้วยตนเองได้อย่างไร


30

ดังนั้นฉันต้องการสร้างtmuxเซสชันเฉพาะโครงการที่ปรากฏคำสั่งบางอย่างในบานหน้าต่างที่แน่นอนโดยอัตโนมัติ ต่อไปนี้กวดวิชาออนไลน์และtmuxหน้าคนนี่คือสิ่งที่ฉันเกิดขึ้นสำหรับไฟล์การกำหนดค่า:

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

ผลที่ได้คือ ... ไม่มีอะไร tmuxเริ่มต้นด้วยหน้าต่างเดียวและบานหน้าต่างเดียวในหน้าต่างนั้นโดยไม่ต้องใช้คำสั่ง

ฉันจะดำเนินการเกี่ยวกับการสร้างไฟล์กำหนดค่าที่ช่วยให้ฉันสร้างชุดหน้าต่างและบานหน้าต่างด้วยคำสั่งบางอย่างที่ดำเนินการล่วงหน้าได้อย่างไร

คำตอบ:


36

ไฟล์กำหนดค่าของคุณใช้งานได้ แต่มีความยุ่งยากเล็กน้อย

คำสั่งอายุสั้น

ขั้นแรกคำสั่งที่คุณกำลังเริ่มต้น (อินสแตนซ์ของls ) จะเสร็จสิ้นการทำงานอย่างรวดเร็ว หน้าต่างและบานหน้าต่างสำหรับคำสั่งถูกสร้างขึ้น แต่จะหายไปทันทีที่แต่ละคำสั่งออก

หากเป้าหมายของคุณคือการใช้คำสั่ง“ หนึ่งช็อต” ดังกล่าวในการกำหนดค่าในที่สุดคุณควรใช้ตัวเลือกหน้าต่างremain-on-exit(และอาจเป็นตัวเลือกเซสชันset-remain-on-exitเพื่อให้ค่าเริ่มต้นสำหรับหน้าต่างทั้งหมดที่สร้างขึ้นในเซสชัน) เมื่อremain-on-exitตั้งค่าสำหรับหน้าต่างคำสั่งนั้นจะไม่หายไปเมื่อออกจากคำสั่ง คุณอาจต้องการแมปrespawn-windowไปยังคีย์ (หมายเหตุ: respawn-windowจะเกิดใหม่คำสั่งเดิมrespawn-paneพร้อมใช้งานในtmux 1.5 เพื่อ respawn แต่ละบานหน้าต่าง)

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

หรือหากคุณไม่คำนึงถึงหน้าต่างเริ่มต้นของคุณเป็นหมายเลข 1 แทนที่จะเป็นหมายเลข 0 เราสามารถหลีกเลี่ยงการเปลี่ยนแปลงค่าโกลบอลได้:

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

หากคุณใช้เพียงlsคำสั่งตัวยึดตำแหน่งแบบง่าย ๆ และคุณตั้งใจจะวางคำสั่งแบบโต้ตอบบางประเภทใน windows / บานหน้าต่างของคุณคุณควรจะวางคำสั่งที่คุณตั้งใจจะเรียกใช้ในที่สุด ถ้าคำสั่งที่คุณตั้งใจจะใช้เวลานานเกินไปที่จะเริ่มต้นที่จะใช้มันในช่วงtmuxทดสอบแล้วแทนเปลือกหรือง่ายอื่น ๆ คำสั่งแบบโต้ตอบ (เช่นtop, sqlite3ฯลฯ )

new-session เป็นคำสั่งเริ่มต้น

ประการที่สองการเรียกใช้tmuxโดยไม่มีอาร์กิวเมนต์คำสั่ง (เช่นtmux) เทียบเท่ากับการใช้new-sessionคำสั่ง (เช่นtmuxเดียวกับtmux new-session) คุณ.tmux.confสร้างเซสชั่นสำหรับหน้าต่าง / บานหน้าต่าง ( newเป็นนามแฝงสำหรับnew-session) และอีกช่วงหนึ่งจะถูกสร้างขึ้นสำหรับนัยnew-sessionคำสั่งที่ระบุโดยเริ่มต้นtmuxโดยไม่โต้แย้งคำสั่ง หากคุณใช้แถบสถานะเริ่มต้นคุณจะเห็น[1]ทางด้านซ้ายของแถบสถานะเมื่อคุณอยู่ในเซสชัน“ พิเศษ” (เซสชันเริ่มต้นที่สร้างใน.tmux.confหมายเลข 0)

หากคุณต้องการที่จะหลีกเลี่ยงการสร้างเซสชั่นพิเศษแล้วใช้แทนธรรมดาtmux attach tmuxคำสั่งจากคุณ.tmux.confจะทำงานสร้างเซสชัน 0 จากนั้นลูกค้าของคุณจะแนบไปกับเซสชันนั้นแทนที่จะสร้างใหม่


2
ตกลงฉันอาจจะหนาเหมือนแซนด์วิชวาฬ แต่ตอนนี้ฉันมีไฟล์กำหนดค่าที่มีsplitwอยู่ในนั้น - ไม่มีอะไร - และฉันยังไม่ได้รับหน้าจอแยกเพราะมันบอกว่ามัน ไม่สามารถสร้างเซสชันปัจจุบัน ถ้าฉันเพิ่มnewก่อนหน้าฉันจะได้รับ ... หนึ่งหน้าต่างหนึ่งบานหน้าต่าง ฉันไม่สามารถดูได้เพราะชีวิตของฉันจะได้รับสองบานเมื่อเริ่มต้น
เพียงความคิดเห็นที่ถูกต้องของฉัน

1
ไฟล์การกำหนดค่าด้วยnewแล้วsplitwทำงานสำหรับฉันเมื่อฉันเริ่มต้นtmuxtmux attachผ่าน สิ่งหนึ่งที่ต้องจำคือมีการใช้.tmux.conf(หรือไฟล์ที่ระบุพร้อม-fตัวเลือก) เฉพาะเมื่อไม่มีเซิร์ฟเวอร์ที่ทำงานอยู่ tmux lsตรวจสอบว่าเซิร์ฟเวอร์ที่กำลังเรียกใช้ผ่านทาง หากคุณต้องการเรียกใช้คำสั่งจากไฟล์เมื่อเซิร์ฟเวอร์กำลังทำงานอยู่ให้ทำดังนี้: tmux source-file /path/to/conf-file-that-creates-a-session-and-windows \; attach(หากคุณเรียกใช้เมื่อไม่มีเซิร์ฟเวอร์ของคุณ.tmux.conf(หรือ-fไฟล์) จะทำงานก่อนจากนั้นsource-fileไฟล์ของคุณ)
Chris Johnsen

แฟ้มปรับแต่งจะถูกระบุด้วย -f - tmux new -f myconfigดังนั้นฉันจะ เนื้อหาของไฟล์ config ที่ประกอบด้วยเพียง ตามมาด้วยnew splitwฉันกำลังฆ่ากระบวนการ tmux ใด ๆ tmux -f myconfigและทั้งหมดก่อนที่ผมจะลองบรรทัดคำสั่ง ฉันไม่ได้รับสองบานหน้าต่าง ฉันสูญเสียที่นี่จริง ๆ กับสิ่งที่ต้องทำผ่านจุดนี้ (นอกเหนือจากเพียงแค่ยอมแพ้บน tmux)
เพียงความคิดเห็นที่ถูกต้องของฉัน

4
@ เพียงแค่: ไม่ว่าคุณจะใช้-fหรือไม่tmuxไม่มีอาร์กิวเมนต์คำสั่งเหมือนกับtmux new-session(ซึ่งสำหรับเซิร์ฟเวอร์ใหม่จะสร้างเซสชันใหม่ที่ด้านบนของไฟล์ config ของคุณ) หน้าต่างที่แบ่งล่วงหน้าของคุณถูกสร้างขึ้นในเซสชัน 0 แต่new-sessionคำสั่งโดยนัยกำลังสร้าง (และแนบ) เซสชันเพิ่มเติม (เซสชัน 1; ค้นหา[1]ในบรรทัดสถานะของคุณ) ใช้tmux -f myconfig attachเพื่อหลีกเลี่ยงการสร้างเซสชันใหม่ที่ซ่อนหน้าต่างการแบ่งไว้ล่วงหน้าของคุณ
Chris Johnsen

1
ตกลงฉันเดาว่าการเรียนรู้ที่จะอ่านจะช่วยฉันได้ในที่สุด :) ขอบคุณสำหรับความพยายามและคำตอบ ทุกอย่างทำงานได้ดีในขณะนี้ ฉันหวังว่าจะมีชื่อเสียง "ขวดจิ้ม" ที่นี่ดังนั้นฉันสามารถให้คุณมากกว่าคำตอบที่ยอมรับ
เพียงความคิดเห็นที่ถูกต้องของฉัน

9

ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณหมายถึงโดย "ป้อนด้วยตนเอง" แต่นี่คือวิธีที่ฉันทำ ฉันเขียนสคริปต์ "เริ่มอัตโนมัติ" ที่ตัวจัดการหน้าต่างของฉันเปิดขึ้น มันมี:

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

โดยที่ไฟล์. session แต่ละไฟล์มีลักษณะดังนี้

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

เดี๋ยวก่อนมีอีกแล้ว! ฉันมีไฟล์. ssession จำนวนมากขึ้นเรื่อย ๆ ที่ฉันโหลดด้วย konsole:

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

ที่ work_console.tabs มีลักษณะเช่นนี้:

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

จากนั้นฉันกด F12 เพื่อเปิด konsole


konsole ดูเหมือนจะหักดังนั้นฉันจึงเปลี่ยนไปใช้Terminalซึ่งทำงานได้ดี ฉันมีโพสต์รายละเอียดเพิ่มเติมเกี่ยวกับรายชื่อผู้รับจดหมาย tmux
John Schmitt

1
เพียงแค่ความคิดเห็นเล็ก ๆ คุณสามารถแทนที่ '! -z' กับ' -n ในการทดสอบของคุณ;)
lilorox

6

สมมติว่าคุณต้องการเรียกใช้งานการตรวจสอบเซิร์ฟเวอร์ 3 งาน (ที่นี่คือ ping localhost) ไม่จำเป็นต้องยุ่งกับไฟล์การกำหนดค่าและเซสชันที่บันทึกไว้ สามารถทำได้จากบรรทัดคำสั่ง

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

ขอบคุณสำหรับความเรียบง่าย - ตัวอย่างที่ฉันต้องการ!
dsz

5

ฉันพบว่าteamocilมีประโยชน์มากสำหรับการใช้ tmux windows / timesโดยอัตโนมัติ

มันเขียนใน Ruby ดังนั้นคุณต้องติดตั้งที่

นี่คือการกำหนดค่าตัวอย่าง:

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

คุณสามารถจัดเรียงหน้าต่างและแยกได้


4

อีกทางเลือกหนึ่งที่คล้ายกับ teamcoil คือtmuxinatorเป็นการพัฒนาที่ใช้งานได้ดี ก็ยังแนะนำ (และชนิดของการสอบทานแล้ว) ในที่น่าตื่นตาตื่นใจtmux: การพัฒนาผลผลิตเมาส์ฟรีจากศาสตร์ Bookshelf


พบว่ามันค่อนข้างสะอาดกว่า teamocil (แต่ก็คล้ายกันมาก) และตอนนี้กำลังใช้งานอยู่ ฉันมีความสุขมากกับการทำงาน!
Aktau

4

**

  • ดีกว่าบันทึกเซสชันของคุณ!

** ฉันพบว่าสำหรับผู้ดูแลระบบที่ขี้เกียจอย่างฉันฉันอยากจะบันทึกเซสชันของ tmux แทนที่จะใช้เวลาหลายชั่วโมงในการสร้างมันอย่างสมบูรณ์ ฉันกำลังจัดการเซิร์ฟเวอร์มากกว่า 30 เครื่องและเซสชัน tmux ของฉันเป็นแบบไดนามิกด้วยการกำหนดค่าที่เปลี่ยนแปลงตลอดเวลา มันเป็นความเจ็บปวดที่คอจนกระทั่งฉันเพิ่งค้นพบtmux- คืนชีพ ปลั๊กอินนี้ดีมาก ให้มันลอง. ขณะนี้ที่เก็บ Ubuntu มี tmux 1.8, ปลั๊กอินนี้ต้องการ 1.9, ดังนั้นคุณจะต้องอัพเกรดด้วยตนเอง

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

หลังจากนั้นคุณสามารถติดตั้งได้

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

จากนั้น dd บรรทัดนี้ไปที่ด้านล่างของ ~ / .tmux.conf (หาก ~ / .tmux.conf ไม่พร้อมใช้งานให้สร้างไฟล์ว่าง)

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

ฉันยังเพิ่มบรรทัดนี้ที่ส่วนท้ายของ ~ / .tmux.conf เพื่อให้ปลั๊กอินบันทึกเซสชันสำหรับโปรแกรมทั้งหมดที่ฉันเรียกใช้

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

จากนั้นรีโหลดสภาวะแวดล้อม tmux

tmux source-file ~/.tmux.conf

แค่นั้นแหละ! คุณทำเสร็จแล้ว ตอนนี้ให้เรียกใช้ tmux ตามปกติปรับขนาดบานหน้าต่างของคุณสร้างบานหน้าต่างใหม่สร้างเซสชันใหม่ ... ฯลฯ เมื่อคุณพอใจกับการกำหนดค่าที่คุณได้รับ (ในหลายหน้าต่างและหลายเซสชัน) เพียงคลิก ctrl + b จากนั้น ctrl + s เพื่อบันทึกเซสชัน เพื่อทดสอบผลลัพธ์เพียงฆ่า tmux ทั้งหมด

killall tmux

จากนั้นรัน tmux อีกครั้ง

tmux

จากนั้นจากภายใน tmux คลิก ctrl + b จากนั้น ctrl + r (สำหรับการกู้คืน) อย่างน่าอัศจรรย์หน้าต่างบานหน้าต่างและเซสชันทั้งหมดของคุณจะได้รับการกู้คืนด้วยรูปทรงและการจัดเรียงเดียวกัน หวังว่าสิ่งนี้จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.