วิธีโหลดไฟล์กำหนดค่า tmux ซึ่งกำหนดไว้หลาย ๆ เซสชันได้อย่างไร


9

ฉันใช้สองเซสชันแยกกันในtmuxและฉันมีรายการต่อไปนี้ใน/etc/tmux.conf:

set -g base-index 1

new -s logi -n cmd
neww -n logi "cat /dev/logi | ccze -m ansi -p syslog -C"
splitw -t 1 -v -p 50
selectw -t 2
selectp -t 0

new -s standard -n htop "htop"
neww -n cmd
splitw -t 2 -v -p 50
selectw -t 2 
selectp -t 1

ฉันเริ่มเซสชันstandardโดยเรียกใช้คำสั่งต่อไปนี้:

urxvtc -name 'tmux' -e bash -c 'tmux attach-session -t standard'

หากไม่มีเซสชั่นจะสร้างหนึ่งถ้ามีมันจะแนบ อย่างที่คุณเห็นฉันมีหน้าต่างสองบานหน้าต่างหนึ่งบานแบ่งออกเป็น 2 บาน เมื่อฉันโหลดไฟล์ config อีกครั้งฉันได้หน้าต่างเพิ่มอีก 2 หน้าต่างจากเซสชันอื่นและทั้งสองถูกเพิ่มลงในหน้าต่างที่มีอยู่ก่อนหน้า นอกจากนี้หน้าต่างก่อนหน้าได้รับหนึ่งบานหน้าต่างเสริม บานหน้าต่างเสริมทั้งสองนั้นชัดเจนไม่มีคำสั่งที่เรียกใช้ (htop) ในคำสั่งใด ๆ

มีวิธีการโหลดไฟล์กำหนดค่าใหม่ในลักษณะที่จะใช้กับเซสชันที่แนบมาหรือไม่ หรือฉันต้องลืมโหลดไฟล์ config อีกครั้งเมื่อฉันใช้เซสชันและเพื่อใช้การตั้งค่าใหม่ฉันควรใช้tmux kill-serverและเริ่มเซสชันใหม่อีกครั้งหรือไม่

คำตอบ:


5

สร้างเสื้อคลุม

ฉันคิดว่าความต้องการของคุณจะได้รับบริการที่ดีที่สุดจากสคริปต์ wrapper บางรูปแบบเพื่อตั้งค่าเซสชันที่กำหนดเอง สิ่งที่ชอบคำตอบของคนนี้

มันจะมีหน้าตาแบบนี้ แต่คุณควรเปลี่ยนให้ตรงกับความต้องการเฉพาะของคุณ

#!/bin/bash

# test if the session has windows
is_closed(){ 
    sess=$1
    n=$(tmux ls 2> /dev/null | grep "^$sess" | wc -l)
    [[ $n -eq 0 ]]
}

# either create it or attach to it
if is_closed logi ; then
  tmux new -d -s logi -n cmd
  tmux neww -t logi -n logi "cat /dev/logi | ccze -m ansi -p syslog -C"
  tmux splitw -t logi:1 -v -p 50
  tmux selectw -t logi:2
  tmux selectp -t logi:1
fi
if is_closed standard ; then
  tmux new -d -s standard -n htop "htop"
  tmux neww -n cmd -t standard
  tmux splitw -t standard:2 -v -p 50
  tmux selectw -t standard:2 
  tmux selectp -t standard:1
fi

หากต้องการโหลดไฟล์กำหนดค่าใหม่

หากคุณทำการแก้ไขไฟล์การกำหนดค่าในขณะที่ใช้ tmux คุณสามารถเรียกใช้นี่เป็นพรอมต์

tmux source-file /path/to/conf

หรือคุณสามารถผูกมันไว้กับกุญแจได้ .tmux.conf

bind r source-file ${HOME}/.tmux.conf \; display-message "source-file reloaded"

การกำหนดค่าโฮมไดเรกทอรี

ท้ายที่สุดคุณไม่ควรเพิ่มการปรับแต่งที่สำคัญ/etc/tmux.confเนื่องจากจะไม่เป็นประโยชน์ต่อผู้อื่นหากคุณต้องการใช้ระบบที่ใช้ร่วมกัน แต่ฉันขอแนะนำให้คุณเพิ่มการปรับแต่งใด ๆ~/.tmux.confเพราะมันเป็นของท้องถิ่นและเฉพาะเจาะจงกับความต้องการส่วนบุคคลของคุณ


ฉันพบข้อผิดพลาดในการเรียกใช้สคริปต์: [[: not found(บรรทัดที่ 7)
Mikhail Morfikov

1
@MikhailMorfikov อาจเป็นเพราะรุ่นที่แตกต่างกัน #!/bin/bashลองเปลี่ยนบรรทัดด้านบนเพื่อ
scicalculator

ใช่ว่าใช้งานได้
Mikhail Morfikov

1

คุณไม่จำเป็นต้องใช้สคริปต์ตัวตัดคำคุณสามารถทำได้ด้วยsource-fileคำสั่ง

ฉันแบ่งของฉันออกเป็น.tmux.confสองส่วนและมันก็แค่ทำสิ่งเหล่านั้น:

source-file ~/.config/tmux/options.conf
source-file ~/.config/tmux/session.conf

จากนั้นsession.confมีคำจำกัดความของบานหน้าต่าง:

new -s logi -n cmd
neww -n logi "cat /dev/logi | ccze -m ansi -p syslog -C"
splitw -t 1 -v -p 50
selectw -t 2
selectp -t 0

new -s standard -n htop "htop"
neww -n cmd
splitw -t 2 -v -p 50
selectw -t 2 
selectp -t 1

และoptions.confมีเพียงคำจำกัดความตัวเลือก:

bind R source-file ~/.config/tmux/options.conf \; display-message "Config reloaded..."
set -g base-index 1

ด้วยวิธีนี้bind Rแหล่งที่มาเท่านั้นoptions.confและทุกอย่างจะถูกโหลดใหม่ แต่จะไม่มีบานหน้าต่างใหม่ที่ถูกสร้างขึ้น
ข้อเสียเปรียบเล็ก ๆ น้อย ๆ อย่างหนึ่งก็คือถ้าคุณต้องการเปลี่ยนเค้าโครงหน้าต่างคุณต้องออกจากและเริ่มเซสชันใหม่


0

ฉันสร้างสคริปต์นี้ ไม่จำเป็นต้องใช้ tmuxinator ทับทิมหรืออื่น ๆ มันเป็นเพียงสคริปต์ทุบตีกำหนดค่าได้

ฉันกำหนดค่าไฟล์กำหนดค่า mi เช่น:

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

ฉันสามารถกำหนดค่าโครงการทั้งหมดของฉัน ส่วนที่เหลือทำโดยสคริปต์:

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