Làm cách nào để gửi lệnh khi mở phiên tmux bên trong phiên tmux khác?


136

Một tình huống điển hình có thể là:

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

Tôi mở một phiên tmux, sau đó ssh vào một máy chủ và đính kèm với một phiên tmux hiện có. Tại thời điểm này tôi có một phiên tmux bên trong một phiên khác. Làm cách nào để gửi lệnh đến phiên tmux bên trong?

Lưu ý: Cả hai phiên tmux đều có các ràng buộc chính giống nhau.


4
không phải là một câu hỏi lập trình. Vui lòng thử superuser.com . Chúc may mắn.
shellter

1
Tôi rất vui khi yêu cầu câu hỏi được chuyển đi, tuy nhiên đối với bối cảnh tôi sử dụng vim bên trong tmux để viết mã và tất nhiên thường phải ssh vào các máy chủ khác, nơi xảy ra sự cố này.
Kris

Câu trả lời:


207

Các send-prefixlệnh có thể được sử dụng để gửi bạn tiền tố tổ hợp phím để (quá trình chạy trong) cửa sổ hoạt động. Theo mặc định, tiền tố là CbCb bị ràng buộc send-prefix(do đó, việc nhấn hai lần sẽ gửi một Cb đến khung hoạt động). Đây chỉ là những gì chúng ta cần để truy cập các ràng buộc của thể hiện tmux bên trong .

Cb đầu tiên được bắt bởi cá thể tmux bên ngoài của Wikipedia làm khóa tiền tố của nó. Cái thứ hai được bắt bởi cá thể tmux bên ngoài của Viking và kích hoạt liên kết Cb của nó ( send-prefix). Điều này sẽ gửi một Cb đến khung hoạt động của thể hiện bên ngoài. Quá trình đang chạy trong khung này là (cuối cùng, thông qua một thể hiện ssh ), đối tượng tmux bên trong của Wikipedia . Nó bắt Cb làm khóa tiền tố. Bây giờ tổ hợp phím tiếp theo của bạn sẽ được chuyển qua thể hiện tmux bên ngoài và được bắt bởi bên trong để kích hoạt liên kết.

Để kích hoạt liên kết c ( new-window) trong phiên bản cấp hai của tmux , bạn sẽ nhập Cb Cb c . Đối với phiên bản tmux cấp ba, bạn sẽ nhập Cb Cb Cb Cb cb .

Việc nhân đôi cho mỗi cấp độ có thể gây khó chịu nếu bạn thường xuyên phải đối phó với nhiều lớp tmux . Nếu bạn có thể sử dụng một số khóa khác, bạn có thể tạo một ràng buộc không có tiền tố để làm cho mọi thứ (có thể) dễ dàng hơn để nhập:

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

Tạo cửa sổ mới trong tmux cấp hai : C- \ c
Tạo cửa sổ mới trong tmux cấp ba : C- ^ c (hoặc C- \ C- \ c )


Nếu bạn có số lượng lệnh tmux giới hạn mà bạn muốn (dễ dàng) gửi đến các phiên bản tmux cấp thấp hơn , thay vào đó bạn có thể sử dụng send-keysđể tạo một số ràng buộc cụ thể (có thể chỉ trong trường hợp tmux cấp cao nhất của bạn ):

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

Tạo cửa sổ mới trong tmux cấp hai : Cb Cc
Tạo cửa sổ mới trong tmux cấp ba : Cb C


Ngoài ra, tôi đã phải nhận xét về last-windowràng buộc hiện tại của mình như được gọi khi thực hiện C-a C-a, như vậy : #bind-key C-a last-window. Lưu ý tiền tố của tôi là a, không phải mặc định b.
Kris

1
bind-key -n C-\ send-prefixkhông hoạt động. Tmux của tôi không nhận ra \. Khi tôi sử dụng một lá thư, nó hoạt động.
darksky

@Darksky: Bạn đang sử dụng phiên bản nào của tmux ? Nó hoạt động với tôi với 1.7, 1.6 và 1.5. Bạn chắc chắn sẽ cần thêm một mức trích dẫn bổ sung nếu bạn đang thực hiện liên kết từ một lệnh shell (tức là tmux bind-key -n 'C-\' send-prefix); nếu bạn gặp sự cố khiến nó hoạt động từ ~/.tmux.conf(hoặc một :dòng lệnh Tiền tố ), thì bạn có thể thử trích dẫn tương tự (nghĩa làbind-key -n 'C-\' send-prefix ).
Chris Johnsen

51

Để truy cập vào bên trong, giữ điều khiển và nhấn B hai lần.


7

BIÊN TẬP:

Tôi KHÔNG khuyên bạn nên sử dụng C-qlàm khóa liên kết, vì đây là lệnh khóa điều khiển mặc định cho

bỏ đóng băng màn hình và tiếp tục hiển thị màn hình

Một tình huống xảy ra ở đây và @Paschalis cung cấp giải pháp:

nếu nó xảy ra hai lần không may mắn (một phiên tmux từ xa với Cq là tiền tố): Nhập Cltr-q, sau đó :, và nhập vào tmux:send-keys C-q

Dưới đây là câu trả lời:


Để làm cho nó đơn giản, hãy thêm dòng dưới đây vào ~/.tmux.conf

bind-key -n C-q send-prefix

Sau đó, bạn có thể trực tiếp sử dụng C-qlàm khóa liên kết cho tmux từ xa của mình.


nếu ai đó đã thay đổi khóa liên kết mặc định trong tmux bên ngoài, thì phải sử dụng cùng một khóa liên kết mặc định trong tmux bên trong, để đoạn mã trên hoạt động!
Paschalis

tôi đang sửa đổi tiền tố của tmux cục bộ của mình (thành Ctrl +] trong trường hợp của tôi) để tất cả các tmux-es "bên trong" trên máy chủ có ràng buộc mặc định cho tiền tố
hành động
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.