Giết một phiên tmux và chọn một phiên tmux khác


11

Tôi đang cố gắng để ràng buộc Xđể làm như sau:

  • nhắc người dùng xem phiên có nên bị giết không
  • nếu yđược nhập, giết phiên
  • sau khi phiên bị hủy, chọn phiên khác (phiên trước, trước hoặc phiên tiếp theo)

Một số lệnh tương tự không hoàn toàn đúng

  1. Giết phiên và đóng thiết bị đầu cuối:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. Nhắc người dùng cho tên của phiên để giết và chọn phiên tiếp theo sau khi giết:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. Tôi đã không thể tìm thấy các ví dụ về các lệnh tương tự. Đây là một giải pháp không hoạt động:

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

Câu trả lời:


12

Tôi nghĩ rằng điều này gần với những gì bạn muốn:

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

Cách tiếp cận số 3 của bạn nằm dọc theo các dòng bên phải, nhưng vấn đề là confirm-beforekhông status-leftthay thế kiểu (ví dụ #S) trong chuỗi lệnh của nó.

Một lưu ý cho ràng buộc ở trên là vì mọi thứ được thực hiện từ đó run-shell, các lệnh được chạy bên ngoài ngữ cảnh của bất kỳ máy khách hoặc phiên cụ thể nào. Nó thực sự chỉ hoạt động bởi vì máy khách mặc định (dành cho switch-client) và phiên mặc định ( và) của mặc định #Slà những hoạt động gần đây nhất. Điều này hoạt động như bạn mong đợi miễn là bạn chỉ có một máy khách hoạt động duy nhất (ví dụ: một người dùng không gõ vào máy khách tmux khác cho đến khi các lệnh shell đã chạy xong); nó có thể thất bại đáng kể nếu (ví dụ) bạn kích hoạt liên kết trong tmux client A, nhưng đầu vào mới được tmux client B nhận được trước khi shell bắt đầu run-shellcó cơ hội chạy các lệnh của nó.

Điều kiện cuộc đua đặc biệt này có vẻ như là một động lực tốt đẹp để cung cấp thông tin máy khách / phiên / cửa sổ / khung cho run-shellcác lệnh. Có một mục TODO về nhận if-shellrun-shellhỗ trợ (tùy chọn?) status_replace()( status-leftTức là thay thế kiểu), mặc dù có thể là một lựa chọn tốt hơn format_expand(), đó là một loại siêu ưu đãi mới hơn status_replace(ưu đãi #{client_tty}, v.v.).


Điều này dường như để làm chính xác những gì tôi đang tìm kiếm. Tôi đã thử một phương pháp tương tự sau khi tìm ra tmux display-message -p "#S"mánh khóe trong một câu trả lời khác. Có vẻ như gói tất cả mọi thứ trong run-shell là chìa khóa. Cảm ơn!
Trey Hunner

Làm thế nào để bạn làm điều này mà không có confirm-before? Tôi đang gặp khó khăn để thoát khỏi quyền.
Miles

2
@Miles: Hãy thử cái này: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ run-shellmở rộng #Strực tiếp, vì vậy chúng tôi phải bỏ qua display-messagevà trích dẫn thêm của nó)
Chris Johnsen

1

Chỉ trong trường hợp nếu ai đó vấp phải câu hỏi này - tmux-sessionist cung cấp chức năng này cùng với nhiều người khác.



0

Mở rộng từ câu trả lời của Chris Johnsen (trong các bình luận) ở trên, về cách thực hiện mà không cần nhắc hoặc confirm-before:

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

Nếu chỉ còn 1 phiên (phiên hiện tại bạn đang ở) và bạn chạy lệnh, bạn sẽ nhận được thông báo "lỗi" và phiên này sẽ không bị giết. Thông thường (nếu bạn giống như tôi), bạn muốn lệnh tiếp tục hủy phiên mặc dù không có phiên nào khác nó có thể chuyển sang. Vì vậy, đây là những gì tôi nghĩ ra:

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\"'"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.