Liên kết một khóa tmux với nhiều lệnh


37

Tôi khởi chạy nhiều cửa sổ tmux để theo dõi một số thông số máy chủ. Với Ctrl-S tôi có thể mở một cửa sổ mới bằng lệnh màn hình khác.

Bây giờ tôi muốn liên kết Ctrl-Q để mở một cửa sổ đa năng khác với nhiều màn hình. Làm thế nào để tôi liên kết một khóa với nhiều lệnh? Tôi đã cố gắng xâu chuỗi chúng với; và \; - không có gì giúp được. Xin vui lòng, tư vấn những gì tôi nên sử dụng thay vì ... dưới đây.

Có thể khi tôi mở một cửa sổ mới để tạm dừng các lệnh nền bị chồng chéo bởi nó?

    tmux new-session "monitor1" \;\
            split-window -v "monitor2" \;\
            select-pane -U \;\
            split-window -v -h -p 60 "monitor3" \;\
            bind-key -n C-s new-window "monitor4" \;\
            bind-key -n C-q "..."

Câu trả lời:


37

Todd Freed là đúng, cách "chính xác" để làm điều này là sử dụng \;. Sắp xếp Nhưng có một chút khó khăn.

Bạn thấy đấy, bạn tham gia một chuỗi các lệnh tmux với nhau bằng cách cho tmux kết hợp ;. Do đó, trong một tệp có nguồn gốc từ tmux, bạn có thể nói

new-session "monitor1" ; split-window -v "monitor2"

nếu, vì một số lý do, bạn muốn tất cả trên một dòng. Bây giờ, bạn cũng có thể đưa ra câu lệnh ghép một dòng cho tmuxlệnh từ shell nhưng lệnh ;phải được thoát để shell giải thích nó như là một đối số khác tmux. Do đó, tương đương với ở trên từ vỏ là

$ tmux new-session "monitor1" \; split-window -v "monitor2"

Tương tự, bind-keylệnh tmux lấy một loạt các đối số là lệnh tmux và các đối số để chạy khi nhấn phím. Nếu bạn muốn liên kết C-qvới trình tự trên từ bên trong một tệp có nguồn gốc từ tmux, bạn sẽ nói

bind-key -n C-q new-session "monitor1" \; split-window -v "monitor2"

Ở đây, chúng ta đã thoát ; khỏi tmux , do đó tmux không hiểu nó là phần cuối của bind-keylệnh, mà là một đối số khác để bind-keybảo nó tạo thành một lệnh ghép là giá trị ràng buộc của C-qkhóa.

Vậy điều gì xảy ra khi chúng ta muốn làm cho tmux làm điều đó từ vỏ? Cả một lối thoát.

$ tmux bind-key -n C-q new-session "monitor1" \\\; split-window -v "monitor2"

Đầu tiên, chúng ta phải thoát khỏi \ sự ;từng từ vỏ , gây ra vỏ để vượt qua hai nhân vật \;như một đối số tmux. Điều này sau đó thoát ;khỏi tmux, khiến nó gán toàn bộ câu lệnh ghép là ràng buộc của C-q.


Bây giờ, tất cả những gì đã nói, nếu bạn sử dụng một thiết lập tmux phức tạp như thế này nhiều lần, tôi khuyên bạn nên tạo một tệp tmux để giữ nó trong:

# In split-windows.tmux:
new-session "monitor1"
split-window -v "monitor2"
bind-key -n C-s new-window "monitor4"
# ...etc...

Và sau đó:

$ tmux source split-windows.tmux  # (or even make an alias for this)

Sẽ dễ dàng hơn nhiều để duy trì theo cách đó.


3
Để làm cho các khóa liên kết với nhiều lệnh từ dòng lệnh bớt kinh khủng hơn, bạn cũng có thể thoát chuỗi \;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap

12

Vì vậy, câu trả lời thực sự là: bạn xâu chuỗi các lệnh với dấu gạch chéo ngược theo sau là dấu chấm phẩy.

bind-key C send-keys foo \; send-keys bar

Bạn sẽ đặt nó trong tmux.conf của bạn hoặc chạy từ dấu nhắc tmux ":"


điều này thật tuyệt vời và hiệu quả khi sử dụng phiên tmux lồng nhau và điều hướng qua các cửa sổ tmux lồng nhau.
Paul

1
Điều này không hoạt động từ dòng lệnh shell. Tức là `tmux bind-key C send-key foo \; thanh gửi phím "có tác dụng liên kết" foo "với" C "nhưng in" thanh "ngay lập tức
Lqueryvg

Vâng, bạn sẽ chạy nó từ trong tmux. Cập nhật để làm rõ.
Todd Freed

Tốt đẹp! Điều này hoàn toàn hoạt động ... muchas gracias!
Công viên Brad

Lưu ý: a; bên trong dấu ngoặc đơn không cần thoát
elig

2

Bạn có thể làm điều này với một cách giải quyết nhỏ. Tương tự như câu trả lời gợi ý một đoạn script chạy (xử lý tốt trường hợp của bạn), nó thường có thể được thực hiện bằng cách sử dụng "run-shell" và gọi chính tmux là lệnh shell.

bind-key z run-shell "tmux send-keys "xyz" ; tmux clear-history; clear" 

sẽ gửi các khóa 'xyz', lệnh tmux 'xóa lịch sử' và sau đó gọi hàm dựng sẵn 'rõ ràng'.

Toàn bộ chuỗi chỉ là một chuỗi lệnh nhiều shell.


1

Bạn có thể thêm một cái gì đó như thế này vào các ràng buộc chính vào .tmux.conftệp của bạn :

bind q send-keys "/home/jackhab/bin/tmux-new-session.sh" \; send-keys "Enter"

Và trong tmux-new-session.shbạn có thể có:

#! /usr/bin/env bash
tmux new-session "monitor1"
tmux split-window -v "monitor2"
tmux select-pane -U
tmux split-window -v -h -p 60 "monitor3"
...
exit

1

Tất cả mọi thứ hiển thị ở đây sẽ không hoạt động, bởi vì điều này

bind q send-keys "command1" \; send-keys "command2"

sẽ thực thi lệnh2 ngay lập tức và q sẽ chỉ bị ràng buộc với các phím gửi "lệnh1"

Đây là giải pháp:

bind R source-file "$HOME/.tmux/reload.tmux"

Trong tệp ~ / .tmux / reload.tmux đặt nhiều lệnh như:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."

1
Đợi đã, sử dụng những gì Peeja đã nói (\\\;) :-)
lzap
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.