ganti nama jendela tmux dengan prompt_command, ps1 atau nama host ssh jarak jauh?

25

Saya ingin dapat memiliki judul jendela tmux saya secara otomatis diganti namanya menjadi prompt_command, ps1 atau hanya nama host dari mesin yang saya gunakan ssh. memiliki 9 jendela yang terbuka berlabel "ssh" benar-benar tidak berguna. Melakukan sysadmin bekerja, saya membuka layar baru dan ssh sekitar untuk banyak mengubah nama secara manual.

Satu hal yang saya perhatikan adalah tmuxmemperbarui xtermjudul jendela jadi saya merasa harus tahu.

Ada bantuan? Saya bahkan rela kembali ke sana screenjika saya bisa mendapatkan fitur ini.

pengguna68782
sumber

Jawaban:

15

Saya tidak mengetahui cara apa pun untuk membuatnya memandang Anda PS1secara langsung.

Namun, tmuxpahami perintah yang sama untuk mengatur nama jendela seperti screenhalnya.

Jadi, Anda dapat mendefinisikan fungsi seperti ini di ~/.bashrcatau ~/.zshrc:

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

lalu telepon settitledari mana saja.

Misalnya, Anda bisa memasukkannya ke dalam PS1variabel Anda , mis

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

atau melalui PROMPT_COMMAND:

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

Sekarang saya mengerti Anda telah tmuxberjalan di desktop Anda, dan Anda ingin sshperintah memiliki nama host daripada ssh, itu jauh lebih mudah.

Mengingat Anda telah menambahkan settitleke lokal Anda ~/.bashrc, semua yang ingin Anda lakukan adalah menambahkan ini juga:

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

Ganti bash dengan zsh, atau sesuatu yang lebih tepat jika perlu.

Mikel
sumber
Ini benar-benar tidak menamai judul jendela dengan nama host dari kotak jauh tanpa memiliki .bashrc setup pada kotak jauh. Terima kasih, meskipun aku sudah belajar sedikit.
user68782
Jika yang Anda inginkan adalah nama host di sisi lokal Anda, itu jauh lebih mudah. Tunggu sebentar ...
Mikel
cemerlang! Terima kasih. Maaf ketidakmampuan saya untuk menjelaskan permintaan saya menghasilkan dua pertanyaan. sekali lagi terima kasih!
user68782
Sebagai tmux mengubah judul jendela pada kemauan, ini dapat dengan cepat ditimpa oleh perubahan normal pada judul jendela oleh tmux.
UtahJarhead
Terima kasih! Saya menggunakan PROMPT_COMMAND='settitle $HOSTNAME:$PWD'- karena dengan kode @ Mikel saya tidak mendapatkan nama host dan -bash: : No such file or directorykesalahan sebelum setiap prompt perintah. Tampaknya bagi saya bahwa $()bash akan mencoba untuk mengeksekusi settitle pengembalian apa pun . (Saya menjalankan bash di linux.)
tuomassalo
35

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

Ini adalah cara yang tepat untuk mengatur judul tmux di jendela. Variabel $ TMUX_PANE diatur oleh tmux dan digunakan untuk membedakan antara panel yang berbeda.

Utah Jarhead
sumber
2
Karena ini adalah jendela yang aktif, saya pikir itu -t${TMUX_PANE}tidak perlu (setidaknya bukan untuk saya).
Christopher
8
@Christopher Jika Anda menjalankan, mengatakan, sleep 3dan beralih windows, prompt akan mengeluarkan perintah ke jendela yang salah ketika tidur selesai. (Inilah alasan saya datang ke sini, +1).
quornian
16

Hanya untuk orang-orang yang datang ke sini dengan mencari cara mengubah judul sesi tmux:

Ctrl+ B,$

Ini akan memberi Anda prompt, di mana Anda dapat mengganti nama sesi aktif.

Untuk mengubah jendela aktif, gunakan komma sebagai gantinya:

Ctrl+ B,,

lihat: Bagaimana cara mengganti nama sesi di tmux?

rubo77
sumber
8

Menggabungkan jawaban Mikel dan UtahJarhead, saya menggunakan yang berikut ini .zshrcuntuk menyelesaikan masalah ini:

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

Saya memiliki penggantian nama jendela otomatis yang diaktifkan secara default, dan saya tidak dapat menemukan cara untuk mengaktifkannya kembali setelah keluar dari host jarak jauh. Jadi, saya hanya keluar dari jendela sepenuhnya - bukan masalah untuk alur kerja saya. Jika Anda lebih suka untuk mengubah nama menjadi, katakanlah, 'bash', Anda dapat mengganti exitbaris dengan tmux rename-window "bash".

Christopher
sumber
1
Saya menggunakan tmux rename-window hostname -ssetelah perintah ssh "@ $", pada dasarnya "me-reset" judul ke mesin "gateway" saya.
andrei
7

Alih-alih exitatau tmux rename-window "bash"Anda dapat menggunakan

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
}

Ini mengaktifkan kembali fungsi normal yang mengubah nama secara otomatis jendela untuk perintah selanjutnya.

The ifblok mencegah dari (tanpa itu) mengubah nama tmuxjendela saat ini dari sshperintah yang digunakan di atas kulit lainnya (dari tmux).

tarczewski
sumber
Saya telah pergi untuk if env | grep -q "TMUX_PANE"; thenbukan ps -p...barang, tetapi prinsip yang sama.
atomicules
1

Saya tahu ini telah dijawab sejak lama, tetapi saya pikir saya akan menambahkan apa yang saya mainkan dan temukan (berdasarkan jawaban yang diterima) .. Saya telah menambahkan ini ke / etc / bashrc dari semua server saya (mudah untuk lakukan dengan kain, boneka, dll)

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

Dan itu menetapkan nama jendela secara otomatis di layar atau tmux.

Brian
sumber
kami menggunakan dns internal, jadi hostname -smenghapus hal-hal domain tambahan, sehingga server1.internal.local muncul hanya sebagai server1
Brian
1

Solusi lain adalah mengubah nama jendela aktif menjadi nama sebelumnya, setelah sesi 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
}
ceroboh
sumber
0

Ini berfungsi di tmux 2.1dan dengan zsh secara lokal dan di server:

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
}

Saya harus menonaktifkan opsi allow-rename secara manual sebelum mengubah nama windows - jika tidak diubah ke jalur saat ini di sebagian besar server saya (juga menggunakan zsh di sana). Hal yang baik adalah: jika Anda mengaktifkan kembali opsi allow-rename, ia akan segera bekerja.

FSchndr
sumber
0

Tambahkan ini ke .profileatau.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
}
pengguna536642
sumber
0

Saya akan mencatat dalam semua contoh ini dengan:

command ssh "$@"

Anda mungkin ingin mengambil kode keluar, dan keluar dari fungsinya, jika tidak hal-hal seperti:

ssh server false

Akan kembali 0.

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

Akan keluar ssh dengan kode pengembalian ssh.

josefwells
sumber