Làm cách nào để sao chép từ / vào tmux 'clipboard' bằng ống vỏ?


17

Khi làm việc trong môi trường hệ vỏ, tôi thường xuyên gặp phải nhu cầu sao chép 'đầu ra ống trung gian' xung quanh (ví dụ: từ / đến các trình soạn thảo đang chạy, sang các trình bao khác, các máy khác, v.v.).

Khi ở trong môi trường cửa sổ, một phương pháp dễ dàng (và chung chung) để giải quyết vấn đề này thường thông qua bảng tạm hệ thống, ví dụ:

  • X11: ... | xsel -i/xsel -o | ...
  • HĐH X: ... | pbcopy/pbpaste | ...

Làm cách nào tôi có thể có hành vi thuận tiện tương tự bằng cách sử dụng tiện ích sao chép / dán tmux?

Câu trả lời:


20

tl; dr

  • ... | tmux loadb -
  • tmux saveb - | ...

Giải thích & Bối cảnh

Trong tmux, tất cả hoạt động sao chép / dán đi qua ngăn xếp bộ đệm trong đó đỉnh (chỉ số 0) là văn bản được sao chép gần đây nhất và sẽ được sử dụng để dán khi không có chỉ số bộ đệm được cung cấp rõ ràng -b. Bạn có thể kiểm tra bộ đệm hiện tại bằng tmux list-buffershoặc phím tắt mặc định tmux-prefix+ #.

Có hai cách để dẫn vào bộ đệm tmux mới ở đầu ngăn xếp, set-bufferlấy đối số chuỗi và load-bufferlấy đối số tệp. Để chuyển vào bộ đệm, bạn thường muốn sử dụng load-buffervới stdin, vd.:

print -l **/* | tmux loadb -

Tuy nhiên, việc dán lại vào trình chỉnh sửa và điều này khá rõ ràng ( tmux-prefix+ ]hoặc bất cứ điều gì bạn đã ràng buộc paste-buffer), tuy nhiên, việc truy cập dán từ bên trong vỏ không phải là vì việc gọi paste-buffersẽ ghi dán vào stdin, kết thúc trong chỉnh sửa của thiết bị đầu cuối của bạn bộ đệm và bất kỳ dòng mới nào trong dán sẽ khiến shell thực thi bất cứ thứ gì đã được dán cho đến nay (có khả năng là một cách tuyệt vời để làm hỏng ngày của bạn).

Có một vài cách để tiếp cận điều này:

  1. tmux pasteb -s ' ': -sthay thế tất cả các kết thúc dòng (dấu phân cách) bằng bất kỳ dấu phân cách nào bạn cung cấp. Tuy nhiên, bạn vẫn nhận được hành vi paste-buffercó nghĩa là dán kết thúc trong bộ đệm chỉnh sửa thiết bị đầu cuối của bạn, có thể là những gì bạn muốn, nhưng thường thì không.
  2. tmux showb | ...: show-bufferin bộ đệm thành thiết bị xuất chuẩn và gần như là những gì được yêu cầu, nhưng như Chris Johnsen đã đề cập trong các nhận xét , show-bufferthực hiện mã hóa bát phân của các ký tự ASCII không in được và các ký tự không phải ASCII. Đây không may vi phạm thường xuyên đủ để được gây phiền nhiễu, thậm chí với những điều đơn giản như null chấm dứt chuỗi hoặc có dấu ký tự Latin (ví dụ. (Trong zsh) print -N á | tmux loadb - ; tmux showbin \303\241\000).
  3. tmux saveb - | ...: save-bufferkhông chỉ đơn giản là đảo ngược load-buffervà ghi các byte thô chưa được sửa đổi thành stdin, đó là điều mong muốn trong hầu hết các trường hợp. Sau đó, bạn có thể tiếp tục lắp ráp một đường ống khác, và vd. thông qua | xargs -n1 -I{} ...để xử lý dòng khôn ngoan, vv ..

1
tmux show-buffersẽ thực hiện mã hóa bát phân các ký tự điều khiển C0 và các byte không ASCII (ví dụ: các ký tự Latinh có dấu, v.v.). Bạn có thể sử dụng tmux save-buffer -nếu bạn muốn các byte thô (đây thường là những gì bạn muốn).
Chris Johnsen

@ChrisJohnsen Rất cám ơn vì đã nắm bắt được điều đó, tôi đã cập nhật câu trả lời tương ứng.
suy nghĩ
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.