Bagaimana cara mengirim perintah saat membuka sesi tmux di dalam sesi tmux lain?

139

Situasi tipikal mungkin:

$ tmux
  [0] $ ssh example.com
      $ tmux attach
        [0] $ 

Saya membuka sesi tmux, lalu ssh masuk ke server dan melampirkan ke sesi tmux yang ada. Pada titik ini saya memiliki satu sesi tmux di dalam yang lain. Bagaimana cara mengirim perintah ke sesi tmux bagian dalam?

Catatan: Kedua sesi tmux memiliki key binding yang sama.

Keris
sumber
4
bukan pertanyaan pemrograman. Silakan coba superuser.com . Semoga berhasil.
shellter
1
Saya senang meminta pertanyaan untuk dipindahkan, namun untuk konteks saya menggunakan vim di dalam tmux untuk membuat kode dan tentu saja sering harus ssh ke server lain di mana masalah ini terjadi.
Kris

Jawaban:

210

The send-prefixperintah dapat digunakan untuk mengirim awalan keystroke ke (proses berjalan di) panel aktif Anda. Secara default, awalannya adalah Cb dan Cb terikat ke send-prefix(sehingga memukulnya dua kali mengirim satu Cb ke panel aktif). Inilah yang kita butuhkan untuk mengakses binding dari instance tmux bagian dalam .

Cb pertama ditangkap oleh instance tmux "luar" sebagai kunci awalannya. Yang kedua ditangkap oleh instance tmux "luar" dan memicu pengikatan Cb -nya ( send-prefix). Ini mengirimkan Cb ke panel aktif instans luar. Proses yang berjalan di panel ini adalah (pada akhirnya, melalui instance ssh ) instance tmux "dalam" . Ini menangkap Cb sebagai kunci awalannya. Sekarang penekanan tombol Anda berikutnya akan diteruskan melalui contoh tmux luar dan ditangkap oleh yang dalam untuk memicu pengikatan.

Untuk memicu pengikatan c ( new-window) dalam instance tingkat kedua dari tmux , Anda harus mengetik Cb Cb c . Untuk instance tingkat ketiga dari tmux Anda harus mengetik Cb Cb Cb Cb c .

Penggandaan untuk setiap level ini dapat mengganggu jika Anda biasanya berurusan dengan banyak lapisan tmux . Jika Anda dapat menyisihkan beberapa kunci lain, Anda dapat membuat pengikatan non-prefiks untuk membuat segalanya (mungkin) lebih mudah untuk diketik:

bind-key -n C-\ send-prefix
bind-key -n C-^ send-prefix \; send-prefix

Buat jendela baru di tmux tingkat kedua : C- \ c
Buat jendela baru di tmux tingkat ketiga : C- ^ c (atau C- \ C- \ c )


Jika Anda memiliki sejumlah perintah tmux yang ingin Anda (dengan mudah) kirim ke instans tmux tingkat rendah , Anda dapat menggunakan send-keysuntuk membuat beberapa binding tertentu (mungkin hanya di instance tmux tingkat atas Anda ):

bind-key C-c  send-keys C-b c
bind-key C    send-keys C-b C-b c

Buat jendela baru di tmux tingkat kedua : Cb Cc
Buat jendela baru di tmux tingkat ketiga : Cb C

Chris Johnsen
sumber
Selain itu saya harus komentar keluar saya yang sudah ada last-windowyang mengikat seperti yang disebut ketika melakukan C-a C-a, seperti: #bind-key C-a last-window. Perhatikan awalan saya a, bukan default b.
Kris
1
bind-key -n C-\ send-prefixtidak bekerja. Tmux saya tidak mengenali \. Saat saya menggunakan surat, itu berhasil.
darksky
@ Darksky: Versi tmux apa yang Anda gunakan? Ini bekerja untuk saya dengan 1.7, 1.6, dan 1.5. Anda pasti perlu menambahkan tingkat kutipan tambahan jika Anda membuat pengikatan dari perintah shell (yaitu tmux bind-key -n 'C-\' send-prefix); jika Anda mengalami masalah dalam menjalankannya ~/.tmux.conf(atau :baris perintah Awalan ), maka Anda dapat mencoba mengutip yang serupa (yaitu bind-key -n 'C-\' send-prefix).
Chris Johnsen
51

Untuk mengakses bagian dalam, tahan kontrol dan tekan B dua kali.

thouliha
sumber
7

EDIT:

Saya TIDAK merekomendasikan penggunaan C-qsebagai tombol pengikat, karena ini adalah perintah tombol kontrol default untuk

tidak membekukan layar dan membiarkan tampilan layar berlanjut

Situasi terjadi di sini , dan @Paschalis memberikan solusi:

jika kebetulan dua kali tidak beruntung (sesi tmux jarak jauh dengan Cq sebagai awalan): Ketik Cltr-q, lalu :, dan masukkan di tmux:send-keys C-q

Di bawah ini adalah jawabannya:


Untuk membuatnya sederhana, tambahkan baris di bawah ini pada file ~/.tmux.conf

bind-key -n C-q send-prefix

Kemudian Anda dapat langsung menggunakan C-qsebagai kunci pengikat untuk tmux jarak jauh Anda.

qun
sumber
jika seseorang telah mengubah kunci pengikat default di bagian luar tmux, maka harus menggunakan kunci pengikat default yang sama di bagian dalam tmux, agar potongan di atas berfungsi!
Paschalis
saya memodifikasi awalan tmux lokal saya (ke Ctrl +] dalam kasus saya) sehingga semua tmux "dalam" di server memiliki pengikatan default untuk awalan
tindakan