Làm thế nào để gửi một lệnh cho tất cả các bảng trong tmux?


189

Tôi thích gọi :clear-history trên panes với một cuộn lớn. Tuy nhiên, tôi muốn kịch bản một cách để gửi lệnh này đến tất cả các bảng trong các cửa sổ khác nhau.

Tôi biết làm thế nào để gửi một lệnh cho tất cả các cửa sổ, lịch sự của câu hỏi này , nhưng làm thế nào để tôi gửi một lệnh cho tất cả các cửa sổ của cửa sổ nào?

send-keyssynchronize-panes từ trang web tmux đến với tâm trí, nhưng tôi không chắc làm thế nào để kết hôn với nhau. Nhưng có lẽ có một cách đơn giản hơn để làm điều này.

Quan sát thêm:

Suy nghĩ về điều này một chút, tmux list-panes -adường như liệt kê tất cả các bảng trong phiên hiện tại. Khá hữu ích để bắt đầu với. Nơi nào tôi đi từ đây?


Đối với những người đến với câu hỏi này với hy vọng tìm ra giải pháp áp dụng cho từng khung, trong mỗi cửa sổ, trong mỗi phiên: scripter.co/command-to-every-pane-window-session-in-tmux
chb

Câu trả lời:


351

Bạn đã thử làm theo trong cửa sổ tmux với nhiều khung

Ctrl-B :

setw synchronize-panes on

clear history

52
Chỉ vì mục đích hoàn chỉnh, hãy tắt nếu bạn làmCtrl-b :setw synchronize-panes off
Mitch

19
và bạn có thể liên kết các phím tắt cho việc này ~/.tmux.confbằng cách thêm: bind -n C-x setw synchronize-panes on bind -n M-x setw synchronize-panes off
guneysus

4
có thể thiết lập cùng một shorcut cho toggling?
Arnold Roa

20
@ArnoldRoa có, tùy chọn sẽ chuyển đổi nếu bạn rời khỏi on/off. Vì vậybind -n C-x setw synchronize-panes
cảm giác

1
Nếu tôi thêm bind -n C-x setw synchronize-panesnhững gì cắt ngắn tôi nên nhấn để gọi? Có phải là tiền tố + C & x. Tôi đã thử rất nhiều lựa chọn
Bill Goldberg

28

Đến bữa tiệc muộn một chút nhưng tôi không muốn thiết lập và hủy đặt các bộ đồng bộ hóa chỉ để gửi một lệnh nên tôi đã tạo một hàm bao quanh tmux và thêm một chức năng tùy chỉnh được gọi send-keys-all-panes.

_tmux_send_keys_all_panes_ () {
  for _pane in $(tmux list-panes -F '#P'); do
    tmux send-keys -t ${_pane} "$@"
  done
}

Tôi cũng tạo một trình bao bọc xung quanh lệnh tmux để đơn giản hóa việc gọi hàm này (để thuận tiện). Các trình bao bọc và mã ở trên là tất cả ở đây .

Điều này cho phép tôi chạy tmux send-keys-all-panes <command>hoặc tmux skap <commandgửi <command>đến tất cả các bảng.

Lưu ý rằng tmux được đặt bí danh cho hàm bao bọc của tôi tmux_pp.


Đây là bash, nhưng người ta có thể làm tương tự từ dấu nhắc lệnh tmux, ý tôi là bằng cách thực hiệnprefix + :
Rho Phi

Tôi không biết làm thế nào hoặc nếu điều đó có thể. Kịch bản trường hợp sử dụng của bạn mà bạn cần gửi lệnh qua là <prefix>:gì?
kshenoy

Tôi sẽ khuyên bạn nên gọi bash snippet ( : run "yourscript.sh yourargs..."); nếu lệnh của bạn có đầu ra, khung hoạt động hoặc được chỉ định của bạn sẽ hiển thị kết quả cho đến khi bạn nhấn q, nhưng trong trường hợp này thì không nên. Tất nhiên bạn có thể bí danh / liên kết này theo ý thích của bạn. Bên cạnh đó, các quy trình bên trong có thể diễn giải các tổ hợp phím của bạn hoặc các hiệu ứng của chúng khác nhau, do đó, một danh sách trắng hoặc danh sách đen #{pane_current_cmd}có thể là cần thiết. Tôi có ctrl + k bị ràng buộc để gửi ctrl + l và xóa lịch sử; cái này hoạt động tốt với đạn pháo, nhưng làm tắc nghẽn bộ đệm của Vim. Tôi sẽ cần sàng lọc trước khi tôi có thể phát ctrl + k của mình.
John P

Đây có thể là một vấn đề XY nhiều hơn; dấu nhắc lệnh Tmux rất hữu ích, nhưng có vẻ như bạn đang sử dụng nó vì bạn không mở một dấu nhắc lệnh khác. Bạn có thể thiết lập một ràng buộc khóa - nếu không có tiền tố, nếu bạn muốn - chuyển đổi và tập trung một khung phụ với vỏ bạn chọn, thay vì gửi <prefix>:trước mỗi lệnh, mất đầu ra sau khi rời lệnh và tất cả các cạm bẫy đó đi kèm với thực thi thông qua Tmux. Ví dụ, <prefix>:run "man cat"không dẫn đến việc người đàn ông xuất hiện trong pidof manhoặc thậm chí ps auxf | grep man, cũng như 'ít hơn', máy nhắn tin hiện tại của tôi cho người đàn ông.
John P

Liên kết đã chết
Mateusz Piotrowski

10

Cập nhật tháng 6 năm 2019

Minh họa nhanh về cách định cấu hình ràng buộc của riêng bạn để đồng bộ hóa các bảng .

Đã thêm phần sau vào của tôi tmux.conf(các ý kiến ​​chắc chắn áp dụng cho cấu hình tổng thể của tôi):

# synchronize all panes in a window
# don't use control S, too easily confused
# with navigation key sequences in tmux (show sessions)
unbind C-S
bind C-Y set-window-option synchronize-panes

Bây giờ, tôi có thể chuyển đổi khả năng đồng bộ hóa các lệnh trên nhiều bảng với <C-a><C-y>.

(Có, tôi đã ánh xạ lại khóa liên kết vào Ctrl a).


4

Không có câu trả lời nào ở trên làm việc cho tôi (tmux v2.3), nhưng điều này đã làm, từ dòng lệnh bash:

for _pane in $(tmux list-panes -a -F '#{pane_id}'); do \
  tmux clear-history -t ${_pane}  ; done

Một tập lệnh tổng quát hơn, đối với các lệnh tmux ngoài 'lịch sử rõ ràng' sẽ chỉ thay thế phần tử đó bằng một tham số, ví dụ: $ 1. Hãy cẩn thận nếu bạn có ý định viết một tập lệnh để xử lý một loạt các lệnh tmux, vì "-t $ {_ pane}" sẽ cần phải được áp dụng cho mỗi tập lệnh.

Lưu ý rằng -atham số tmux list-panesđược yêu cầu để bao gồm tất cả các ô trong tất cả các cửa sổ trong tất cả các phiên. Không có điều đó, chỉ các tấm trong cửa sổ tmux hiện tại của bạn sẽ bị ảnh hưởng. Nếu bạn có nhiều hơn một phiên tmux mở và chỉ muốn áp dụng lệnh cho các bảng trong phiên hiện tại, hãy thay thế -abằng -s(Tất cả trong trang man của tmux).

Tôi không có điểm mod để nhận xét trực tiếp về từng câu trả lời ở trên, vì vậy đây là lý do tại sao họ không làm việc cho tôi:

Vấn đề mà tôi gặp phải với câu trả lời của @ shailesh-garg là việc đồng bộ hóa chỉ ảnh hưởng đến các lệnh được ban hành trong các bảng, chứ không phải các lệnh tmux được phát hành sử dụng Ctrl-B :bên ngoài các bảng.

Ba vấn đề mà tôi gặp phải với câu trả lời của @kshenoy là:

  1. nó gửi tổ hợp phím đến trong một ngăn, không phải cho hoạt động tmux của ngăn đó, vì vậy, nếu một bash shell chạy trong khung và một sử dụng tập lệnh để gửi "lịch sử rõ ràng", thì đó sẽ là tổ hợp phím sẽ xuất hiện trong dòng lệnh bash. Một cách giải quyết sẽ là gửi "tmux Clear-history" hoặc trước "tmux" tới "$ @", nhưng tôi đã không chỉnh sửa câu trả lời vì những vấn đề khác của tôi với câu trả lời;
  2. Tôi không thể tìm ra cách gửi một nhân vật dòng mới mà không phá vỡ dòng đó theo nghĩa đen;
  3. Ngay cả khi tôi đã làm điều đó, việc gửi "lịch sử rõ ràng tmux" không có hiệu lực.

3

phiên bản tmux của tôi là 1.9a và điều này hiệu quả với tôi, một phím là đủ cho cả bật và tắt

bind-key X set-window-option synchronize-panes\; display-message "synchronize-panes is now #{?pane_synchronized,on,off}"

2
tmux send-keys -t <session id> <command> C-m  

Thay thế "id phiên" và "lệnh" tương ứng.


muốn nói điều gì đó về ngôn ngữ ngoài hành tinh này
Muhammad Omer Aslam

Gì? Tiếng Anh không khó. Nhưng nếu bạn có điều gì muốn nói, thì hãy nói ra.
RJ

4
:Danh bạn cần thêm một số mô tả vào câu trả lời của mình vì nó có văn bản rất tối thiểu và vì lý do đó, Stackoverflow phát hiện ra nó là một thư rác hoặc bài đăng chất lượng thấp, chỉ cần thêm một số chi tiết vào nó để nó không xuất hiện dưới nó.
Muhammad Omer Aslam

6
Thật buồn cười, câu trả lời được chấp nhận cũng không có mô tả và chỉ có mã, nhưng bất cứ điều gì.
RJ

0

Đây là chức năng tiện ích của tôi để làm điều đó, chỉ thực hiện lệnh khi không có gì chạy trong khung.

#!/bin/bash

_send_bash_command_to_session() {
    if [[ $# -eq 0 || "$1" = "--help" ]] ; then
        echo 'Usage: _send_bash_command_to_session $session_name what ever command you want: '
        return
    fi
    input_session="$1"
    input_command="${@:2}"
    for _pane in $(tmux list-panes -s -t ${input_session} -F '#{window_index}.#{pane_index}'); do
        # only apply the command in bash or zsh panes.
        _current_command=$(tmux display-message -p -t ${input_session}:${_pane} '#{pane_current_command}')
        if [ ${_current_command} = zsh ] || [ ${_current_command} = bash ] ; then
            tmux send-keys -t ${_pane} "${input_command}" Enter
        fi
    done
}

tmux_set_venv() {
    _current_session=$(tmux display-message -p '#{session_name}')
    _send_bash_command_to_session ${_current_session} workon $1
}

Ví dụ nhắm mục tiêu một phiên được gọi là dev, cho phép một python virtualenv trong tất cả các pan nằm trong bashhoặc zsh, tránh thực thi lệnh trong pan với vim hoặc bất kỳ thực thi nào khác:

_send_bash_command_to_session dev workon myvirtualenv

hoặc dễ nhớ hơn: để làm điều đó trong phiên hiện tại:

tmux_set_venv myvirtualenv

Tìm tập tin cấu hình của tôi với chức năng này.

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.