Matikan sesi tmux dan pilih sesi tmux lainnya

11

Saya mencoba mengikat Xuntuk melakukan hal berikut:

  • memberi tahu pengguna apakah sesi tersebut harus dimatikan
  • jika ydimasukkan, bunuh sesi
  • setelah sesi terbunuh, pilih sesi lain (sesi terakhir, sebelumnya, atau berikutnya)

Beberapa perintah serupa yang tidak beres

  1. Matikan sesi dan tutup terminal:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. Minta pengguna untuk mematikan sesi dan memilih sesi berikutnya setelah selesai:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. Saya belum dapat menemukan contoh perintah serupa. Inilah solusi yang tidak berhasil:

    bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \
    switch-client -n \; kill-session -t \"$SESSION\""
    
Trey Hunner
sumber

Jawaban:

12

Saya pikir ini dekat dengan yang Anda inginkan:

bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"

Pendekatan # 3 Anda adalah di sepanjang garis yang benar, tetapi masalahnya adalah bahwa confirm-beforetidak melakukan status-leftsubstitusi-gaya (misalnya #S) dalam string perintahnya.

Peringatan untuk pengikatan di atas adalah bahwa karena semuanya dilakukan run-shell, perintah dijalankan di luar konteks klien atau sesi tertentu. Ini benar-benar hanya berfungsi karena klien "default" (untuk switch-client) dan "default" (untuk #S) adalah yang paling aktif. Ini berfungsi seperti yang Anda harapkan selama Anda hanya memiliki satu klien aktif (mis. Satu pengguna yang tidak mengetik ke klien tmux lain sampai setelah perintah shell selesai berjalan); itu bisa gagal secara dramatis jika (misalnya) Anda memicu pengikatan di klien tmux A, tetapi input baru diterima oleh klien tmux B sebelum shell dimulai oleh run-shelltelah memiliki kesempatan untuk menjalankan perintahnya.

Kondisi balapan khusus ini sepertinya merupakan motivasi yang bagus untuk memberikan informasi kepada klien / sesi / jendela / pane kepada run-shellperintah. Ada entri TODO tentang mendapatkan if-shelldan run-shellmendukung (opsional?) status_replace()(Yaitu status-leftsubstitusi gaya), meskipun mungkin pilihan yang lebih baik adalah format_expand(), yang merupakan jenis perangkat super baru status_replace(penawaran #{client_tty}, dll.).

Chris Johnsen
sumber
Ini tampaknya melakukan persis apa yang saya cari. Saya telah mencoba metode yang sama setelah menemukan tmux display-message -p "#S"trik di jawaban lain. Sepertinya membungkus semuanya dalam run-shell adalah kuncinya. Terima kasih!
Trey Hunner
Bagaimana Anda melakukan ini tanpa confirm-before? Saya mengalami kesulitan untuk melarikan diri dengan benar.
Miles
2
@Miles: Coba yang satu ini: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ run-shellmengembang #Ssecara langsung, jadi kita bisa menghilangkan display-messagedan ekstra mengutip)
Chris Johnsen
1

Untuk berjaga-jaga jika seseorang menemukan pertanyaan ini - tmux-sessionist menyediakan fungsionalitas ini bersama dengan banyak lainnya.

anni
sumber
0

Ada pertanyaan lain yang menanyakan pertanyaan serupa tetapi sedikit berbeda.

Jika Anda ingin choose-sessionperilaku standar dengan fitur tambahan yang membunuh sesi asli jika tidak ada klien lain yang tetap terikat padanya maka pertanyaan itu mungkin juga menarik.

starfry
sumber
0

Memperluas dari jawaban Chris Johnsen (di komentar) di atas, tentang bagaimana melakukannya tanpa cepat atau confirm-before:

bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'

Jika hanya ada 1 sesi yang tersisa (sesi saat ini Anda berada sekarang) dan Anda menjalankan perintah, Anda akan menerima pesan "kesalahan", dan sesi tidak terbunuh. Biasanya (jika Anda seperti saya), Anda ingin perintah untuk tetap membunuh sesi meskipun tidak ada sesi lain yang bisa beralih ke. Jadi inilah yang saya pikirkan:

bind-key X if-shell '[ $(tmux list-sessions | wc -l) -ne 1 ]' \
                    "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'" \
                    "run-shell 'tmux kill-session -t \"#S\"'"
M Imam Pratama
sumber