เปลี่ยนชื่อหน้าต่าง tmux เป็น prompt_command, ps1 หรือ remote ssh hostname?


25

ฉันชอบที่จะมีชื่อหน้าต่าง tmux ของฉันโดยอัตโนมัติเปลี่ยนชื่อเป็น prompt_command, ps1 หรือเพียงแค่ชื่อโฮสต์ของเครื่องที่ฉันsshไป การเปิด 9 windows ชื่อ "ssh" นั้นไร้ประโยชน์จริงๆ การดูแลระบบทำงานฉันเปิดหน้าจอใหม่และ ssh ไปรอบ ๆ เพื่อเปลี่ยนชื่อด้วยตนเอง

สิ่งหนึ่งที่ฉันสังเกตเห็นคือtmuxอัปเดตxtermชื่อหน้าต่างดังนั้นฉันรู้สึกว่ามันต้องรู้

ความช่วยเหลือใด ๆ ฉันยังยินดีที่จะกลับไปscreenหากฉันสามารถใช้คุณสมบัตินี้ได้

คำตอบ:


15

ฉันไม่ได้ตระหนักถึงวิธีการที่จะทำให้คุณดูPS1โดยตรง

แต่tmuxมีความเข้าใจในคำสั่งเดียวกันในการตั้งชื่อของหน้าต่างที่screenไม่

ดังนั้นคุณสามารถกำหนดฟังก์ชันเช่นนี้ในของคุณ~/.bashrcหรือ~/.zshrc:

settitle() {
    printf "\033k$1\033\\"
}

แล้วโทรsettitleจากที่ใดก็ได้

ตัวอย่างเช่นคุณสามารถรวมไว้ในPS1ตัวแปรของคุณเช่น

PS1='$HOST:$PWD$(settitle $HOST:$PWD)$ '

หรือผ่านPROMPT_COMMAND:

PROMPT_COMMAND='$(settitle $HOST:$PWD)'
# and don't change PS1

ตอนนี้ฉันเข้าใจว่าคุณtmuxรันบนเดสก์ท็อปของคุณและคุณต้องการให้sshคำสั่งมีชื่อโฮสต์แทนsshนั่นง่ายกว่ามาก

ให้คุณได้เพิ่มsettitleในท้องถิ่นของคุณ~/.bashrcสิ่งที่คุณต้องทำคือการเพิ่มนี้:

ssh() {
    settitle "$*"
    command ssh "$@"
    settitle "bash"
}

แทนที่ bash ด้วย zsh หรืออย่างอื่นที่เหมาะสมกว่าถ้าจำเป็น


นี่ไม่ได้ตั้งชื่อชื่อหน้าต่างเป็นชื่อโฮสต์ของกล่องระยะไกลโดยไม่ต้องมีการตั้งค่า. bashrc บนกล่องระยะไกล ขอบคุณแม้ว่าฉันได้เรียนรู้เนียนบาง
user68782

หากสิ่งที่คุณต้องการคือชื่อโฮสต์ในพื้นที่ท้องถิ่นของคุณนั่นง่ายกว่ามาก รอสักครู่ ...
Mikel

! สดใส ขอขอบคุณ. ขออภัยที่ฉันไม่สามารถอธิบายคำขอของฉันส่งผลให้มีสองคำถาม อีกครั้งขอบคุณ!
user68782

เมื่อ tmux เปลี่ยนหัวเรื่องหน้าต่างบน whim สิ่งนี้สามารถเขียนทับได้อย่างรวดเร็วมากโดยการเปลี่ยนแปลงปกติของชื่อหน้าต่างโดย tmux
UtahJarhead

ขอบคุณ! ฉันใช้PROMPT_COMMAND='settitle $HOSTNAME:$PWD'- เนื่องจากด้วยรหัสของ @ Mikel ฉันไม่ได้รับชื่อโฮสต์และ-bash: : No such file or directoryข้อผิดพลาดก่อนที่จะพร้อมรับคำสั่ง สำหรับฉันมันดูเหมือนว่า$()จะทำให้ทุบตีพยายามที่จะดำเนินการsettitle ผลตอบแทนใดๆ (ฉันกำลังทุบตีบน linux)
tuomassalo

35

tmux rename-window -t${TMUX_PANE} "Title Text"

นี่เป็นวิธีที่เหมาะสมในการตั้งชื่อ tmux ในหน้าต่าง ตัวแปร $ TMUX_PANE ถูกตั้งค่าโดย tmux และใช้เพื่อแยกความแตกต่างระหว่างบานหน้าต่างที่แตกต่างกัน


2
เนื่องจากเป็นหน้าต่างที่ใช้งานอยู่ฉันไม่คิดว่า-t${TMUX_PANE}จำเป็น (อย่างน้อยก็ไม่ใช่สำหรับฉัน)
Christopher

8
@ คริสโตเฟอร์หากคุณกำลังพูดsleep 3และสลับหน้าต่างพรอมต์จะส่งคำสั่งไปที่หน้าต่างผิดเมื่อสลีปเสร็จสมบูรณ์ (นี่คือเหตุผลที่ฉันมาที่นี่ +1)
quornian

16

สำหรับคนที่มาที่นี่โดยค้นหาวิธีเปลี่ยนชื่อของเซสชัน tmux:

Ctrl+ B,$

นี่จะเป็นการแจ้งให้คุณทราบซึ่งคุณสามารถเปลี่ยนชื่อเซสชันที่ใช้งานอยู่

หากต้องการเปลี่ยนหน้าต่างที่ใช้งานให้ใช้ komma แทน:

Ctrl+ B,,

ดู: ฉันจะเปลี่ยนชื่อเซสชันใน tmux ได้อย่างไร?


8

เมื่อรวมทั้งคำตอบของมิเคลและยูทาห์จาร์เฮดฉันใช้สิ่งต่อไปนี้.zshrcเพื่อแก้ปัญหานี้:

ssh() {
    tmux rename-window "$*"
    command ssh "$@"
    exit
}

ฉันเปิดใช้งานการเปลี่ยนชื่อหน้าต่างอัตโนมัติเป็นค่าเริ่มต้นและฉันไม่สามารถหาวิธีเปิดใช้งานได้อีกหลังจากออกจากรีโมตโฮสต์แล้ว ดังนั้นฉันเพิ่งออกจากหน้าต่างไปอย่างสิ้นเชิง - ไม่ใช่ปัญหาสำหรับเวิร์กโฟลว์ของฉัน หากคุณต้องการที่จะเปลี่ยนชื่อไปพูดว่า 'ทุบตี' คุณสามารถใช้ทดแทนสอดคล้องกับexittmux rename-window "bash"


1
ฉันใช้ tmux rename-window hostname -sหลังจากคำสั่ง ssh "@ $" โดยพื้นฐานแล้วมันจะ "รีเซ็ต" ชื่อเรื่องเป็น "เกตเวย์" ของเครื่อง
อังเดร

7

แทนexitหรือtmux rename-window "bash"คุณสามารถใช้

ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
            tmux rename-window "$*"
            command ssh "$@"
            tmux set-window-option automatic-rename "on" 1>/dev/null
    else
            command ssh "$@"
    fi
}

นี่เป็นการเปิดใช้งานฟังก์ชั่นปกติที่เปลี่ยนชื่อหน้าต่างโดยอัตโนมัติสำหรับคำสั่งถัดไป

ifบล็อกป้องกันจาก (โดยไม่ได้) การเปลี่ยนชื่อtmuxหน้าต่างปัจจุบันจากsshคำสั่งที่ใช้ในเปลือกหอยอื่น ๆ (จากtmux)


ฉันได้ไปif env | grep -q "TMUX_PANE"; thenแทนps -p...สิ่งของ แต่เป็นหลักการเดียวกัน
atomicules

1

ฉันรู้ว่าสิ่งนี้ได้รับคำตอบมานานแล้ว แต่ฉันคิดว่าฉันจะเพิ่มสิ่งที่ฉันเล่นและพบ (ตามคำตอบที่ยอมรับ) .. ฉันได้เพิ่มสิ่งนี้ลงใน / etc / bashrc ของเซิร์ฟเวอร์ทั้งหมดของฉัน (ง่ายต่อการ ทำด้วยผ้าหุ่นเชิด ฯลฯ )

settitle() {
    printf "\033k$1\033\\"
}
bash_prompt_command() {
    settitle "`hostname -s`:$PWD"
}
PROMPT_COMMAND=bash_prompt_command

และตั้งชื่อหน้าต่างโดยอัตโนมัติในหน้าจอหรือ tmux


เราใช้ DNS ภายในเพื่อhostname -sลบข้อมูลโดเมนเพิ่มเติมเพื่อให้ server1.internal.local แสดงขึ้นเป็นเพียงแค่เซิร์ฟเวอร์ 1
Brian

1

โซลูชันอื่นจะเปลี่ยนชื่อหน้าต่างที่ใช้งานเป็นชื่อก่อนหน้านี้หลังจากเซสชัน ssh:

ssh() {

local code=0
local ancien

ancien=$(tmux display-message -p '#W')

if [ $TERM = tmux -o $TERM = tmux-256color ]; then

    tmux rename-window "$*"

    command ssh "$@"

    code=$?
else
    command ssh "$@"

    code=$?
fi

tmux rename-window $ancien

return $code
}

0

สิ่งนี้ใช้ได้สำหรับในtmux 2.1และกับ zsh ภายในและบนเซิร์ฟเวอร์

ssh() {
    tmux set-option allow-rename off 1>/dev/null
    tmux rename-window "ssh/$*"
    command ssh "$@"
    tmux set-option allow-rename on 1>/dev/null
}

ฉันต้องปิดการใช้งานตัวเลือกอนุญาตการเปลี่ยนชื่อด้วยตนเองก่อนที่จะเปลี่ยนชื่อ windows - ไม่เช่นนั้นจะเปลี่ยนเป็นเส้นทางปัจจุบันบนเซิร์ฟเวอร์ส่วนใหญ่ของฉัน (โดยใช้ zsh ที่นั่นด้วย) สิ่งที่ดีคือ: ถ้าคุณเปิดใช้งานตัวเลือกอนุญาตการเปลี่ยนชื่ออีกครั้งมันจะทำงานทันที


0

เพิ่มไปยัง.profileหรือ.bashrc

# Change window name for `tmux`
ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
        #tmux rename-window "$(echo $* | cut -d . -f 1)"
        tmux rename-window "$(echo $* | cut -d @ -f 2)"
        command ssh "$@"
        tmux set-window-option automatic-rename "on" 1>/dev/null
    else
        command ssh "$@"
    fi
}

0

ฉันจะสังเกตในตัวอย่างเหล่านี้ทั้งหมดด้วย:

command ssh "$@"

คุณอาจต้องการคว้ารหัสออกและออกจากฟังก์ชันด้วยสิ่งอื่นเช่น:

ssh server false

จะส่งคืน 0

command ssh"$@"
_exitcode=$?
#other code
exit $_exitcode

จะออกจาก ssh ด้วยโค้ดส่งคืนของ ssh

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