2012-09-10 7 views
7

Nếu tôi đang làm việc trên màn hình rộng, tôi muốn sử dụng chủ yếu hai ngăn và chuyển đổi giữa chúng với C-a Ca.Làm cách nào để liên kết khóa để chuyển sang cửa sổ cuối cùng hoặc nếu không có ô, cửa sổ cuối cùng?

Nếu tôi đang làm việc trên màn hình vuông, tôi sẽ sử dụng hai cửa sổ. Tôi muốn có thể chuyển đổi giữa chúng với C-a C-a cũng như không thay đổi tmux.conf của tôi.

Trả lời

10

Nếu bạn luôn muốn Cà để

  • chuyển đổi giữa các tấm khi cửa sổ tích cực có nhiều hơn một cửa sổ, và
  • chuyển đổi giữa các cửa sổ khi cửa sổ hoạt động chỉ có một cửa sổ,

thì bạn có thể sử dụng số if-shell để đếm số lượng ô trong cửa sổ đang hoạt động để quyết định giữa last-panelast-window:

bind-key C-a if-shell 'test $(tmux list-panes | wc -l) -gt 1' 'last-pane' 'last-window' 

Nó vẫn sẽ là "tùy thuộc vào bạn" để sắp xếp lại các ô của bạn khi chuyển đổi giữa các cấu hình “rộng” và “hình vuông” (ví dụ: qua break-panejoin-pane).


Trong tmux 1,8 if-shellrun-shell làm mở rộng định dạng, vì vậy bạn có thể chỉ đơn giản là lệnh shell một chút:

bind-key C-a if-shell 'test #{window_panes} -gt 1' 'last-pane' 'last-window' 
+0

Tôi tự hỏi nếu có một cách ít cồng kềnh hơn để kiểm tra xem cửa sổ hiện tại có nhiều hơn một cửa sổ hay không. Nó thực sự nên là một trong những biến tmux, như '# {pane_count}', sau đó chúng ta có thể sử dụng '# {? ,,}' xây dựng của nó thay vì bỏ ra một trình bao, và một tmux khác để làm IPC, trong một đường ống, và đến 'wc -l'. Thật không may tôi không thể tìm thấy một danh sách đầy đủ của tất cả các biến tmux. Tôi biết ít nhất một tài liệu không có giấy tờ là '# {pane_current_command}' đã có ích. ** CẬP NHẬT ** Tôi tìm thấy nó, đó là '# {window_panes}' là "Số cửa sổ trong cửa sổ". hoàn hảo –

+0

crap, những điều kiện có điều kiện chỉ có thể làm việc cho xây dựng chuỗi trạng thái, không phải để xác định lệnh shell nào để chạy. Chắc chắn có thể tránh được đường ống đến 'wc -l'. –

+0

@StevenLu: * tmux * 1.8 hỗ trợ mở rộng định dạng trong 'if-shell' (và' run-shell'), vì vậy bạn có thể làm điều này trong 1.8: 'bind Ca if-shell 'test # {window_panes} -gt 1' cửa sổ cuối cùng của cửa sổ cuối cùng. –

1

Tôi muốn đề nghị như sau (điều chỉnh 80 để phân biệt giữa hai chiều rộng thiết bị đầu cuối của bạn)

if-shell '[ "$COLUMNS" -gt 80 ]' 'bind-key C-a "select-window -t :.+"' 'bind-key C-a "next-window"' 

nhưng tôi hoặc rối tung lên cú pháp, hoặc COLUMNS không được thiết lập trong liên quan tmux môi trường, như biểu thức shell ở trên luôn luôn đánh giá sai cho tôi.

+2

'nếu-shell' và 'chạy shell' đều chạy trong bối cảnh của (chia rẽ từ) máy chủ (không phải bất kỳ phiên hoặc máy khách cụ thể nào), vì vậy chúng sẽ không có COLUMNS (thậm chí không phải là một thứ tự trên std {in, out, err}). Bạn có thể nhận được chiều rộng của máy khách hoạt động gần đây nhất với một cái gì đó như thế này: 'tmux list-clients -F '# {client_activity} # {client_width}' | sắp xếp -rn | đầu -1 | cut -d '' -f' –

+0

IIRC, '$ COLUMNS' là một biến bash, không phải là biến môi trường; vì vậy bạn cần phải chắc chắn rằng vỏ bao quanh được bash trong khi bạn đang chạy thử nghiệm. Và, ngay cả khi nó được, nó sẽ không nhất thiết phải được gắn vào cùng một pty mà người dùng đang xem xét (hoặc bất kỳ pty nào cả) trong khi nhấn phím ràng buộc. – jpaugh