it-swarm-vi.com

Bắt tmux để sao chép bộ đệm vào clipboard

Tôi đang cố gắng tìm ra một cách hay để sao chép những gì tôi có trong bộ đệm tmux vào clipboard của mình. Tôi đã thử một vài thứ khác nhau như

bind-key p select-pane -t 2 \; split-window 'xsel -i -b' \; paste-buffer

điều này khiến tôi khá gần gũi, tất cả những gì tôi phải làm là nhấn control-d sau khi tôi thực hiện tiền tố-p.

Tôi đã cố gắng sửa nó bằng cách làm

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE\; tmux paste-buffer\; echo HERE'

Nhưng điều đó không hiệu quả. Trong thực tế nếu tôi ghép cái này xuống chỉ

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE'

nó không làm gì cả nên tôi giả sử rằng cửa sổ chia không giống như << trong lệnh Shell.

Có ý kiến ​​gì không?

Chỉnh sửa: Bạn có thể bỏ qua select-pane -t 2 nếu bạn muốn, nó không thực sự quan trọng. Tôi chỉ sử dụng một bố cục cụ thể và khung 2 là cái tôi thích tách khi tôi làm một cái gì đó khác để đi vào các ràng buộc của tôi liên quan đến việc chia tách theo mặc định.

121
Digital Powers

Ở đây các tài liệu cần dòng mới. Ví dụ: trong tập lệnh Shell, bạn có thể viết

cat <<EOF >somefile; echo  done
file contents
EOF

Tôi không nghĩ rằng tmux cho phép bạn đặt các dòng mới ở đó và thậm chí nếu có, đây sẽ không phải là một cách tiếp cận tốt. Điều gì xảy ra nếu bản thân dữ liệu chứa HERE một mình trên một dòng (ví dụ: vì bạn đang sao chép .tmux.conf)?

Tôi đề nghị viết nội dung bộ đệm vào một tập tin tạm thời. Chưa được kiểm tra:

bind-key p save-buffer ~/.tmux-buffer \; run-Shell "xsel -i -b <~/.tmux-buffer && rm ~/.tmux-buffer"

Có một điều kiện cuộc đua nếu bạn sử dụng lệnh này trong hai trường hợp tmux riêng biệt. Tôi không biết làm thế nào để giải quyết điều này.

Điều này sẽ làm việc:

# move x clipboard into tmux paste buffer
bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer"
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i"
94
Grauwolf

Một giải pháp đơn giản hơn cho Mac OS-X

Điều này dựa trên câu trả lời của Alex và sử dụng những thứ không tồn tại vào thời điểm đó.

Nếu bạn đang sử dụng homebrew (và nếu bạn không, tại sao bạn không?) Thì bạn có thể làm điều này:

brew install reattach-to-user-namespace

Sau đó, trong ~/.tmux.conf:

set-option -g default-command "reattach-to-user-namespace -l zsh" # or bash...
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

Để sao chép bộ đệm từ tmux (bạn đã sao chép một cái gì đó bằng cách sử dụng tmux) vào bảng past Mac, hãy sử dụng <tmux-key> Control-c. Bây giờ nó sẽ có sẵn cho Command-v Hoặc pbpaste

Để dán thứ gì đó từ bảng Mac, hãy sử dụng <tmux-key> Control-v.

41
docwhat

Các copy-pipe lệnh đã được thêm vào kể từ phiên bản 1.8. Nó sao chép một lựa chọn vào bộ đệm tmux và đưa nó vào một lệnh. Bây giờ không cần ràng buộc tiền tố. Đây là một ví dụ:

bind -t vi-copy y copy-pipe "xclip"

# For OS X users:
bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

Bây giờ khi bạn có một số văn bản được chọn trong copy-modey sẽ sao chép văn bản đó vào bộ đệm tmux cũng như bảng tạm của hệ điều hành. Tuy nhiên, nó không hữu ích nếu bạn muốn lấy văn bản từ bảng ghi tạm đến bộ đệm tmux.

40
Tyler Holien

Bạn có thể muốn thử plugin tmux-yank . Nó cho phép sao chép thẳng vào bảng tạm hệ thống (OS X và Linux) và một số tính năng khác như kéo dài dòng Shell hiện tại.

16
user80379

Đây là một nỗ lực tại một câu trả lời toàn diện.

Đầu tiên một chút lịch sử

Khi câu hỏi này lần đầu tiên được hỏi (tháng 6 năm 2011), sao chép văn bản từ Tmux vào bảng tạm phải là một quá trình gồm hai bước, trước tiên hãy sao chép văn bản đã chọn vào bộ đệm của Tmux, sau đó sao chép văn bản từ bộ đệm của Tmux vào bảng tạm hệ thống.

Trong 1.8 (tháng 3 năm 2013), copy-pipe lệnh đã được thêm vào cho phép bạn sao chép văn bản đã chọn thẳng vào bảng tạm hệ thống (hoặc đích khác).

Sau đó vào tháng 2.4 (tháng 4 năm 2017), các bảng chính đã được thay đổi đáng kể khiến nhiều câu trả lời trên trang này bị lỗi thời.

Trả lời câu hỏi ban đầu

Linux :

bind-key C-y run-Shell "tmux save-buffer - | xclip -i -r > /dev/null" \; display-message "Copied tmux buffer to selection"
bind-key C-Y run-Shell "tmux save-buffer - | xclip -i -r -selection clipboard > /dev/null" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Mac :

Nếu bạn đang sử dụng homebrew thì bạn nên cài đặt reattach-to-user-namespace bằng cách chạy lệnh sau trong một thiết bị đầu cuối:

brew install reattach-to-user-namespace

Sau đó, trong ~/.tmux.conf của bạn:

bind-key C-y run-Shell "tmux save-buffer - | reattach-to-user-namespace pbcopy" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "reattach-to-user-namespace pbpaste | tmux load-buffer - ; tmux paste-buffer"

Phương pháp ngắn hơn (sao chép và dán một lựa chọn trực tiếp từ và vào bảng tạm cho tmux> 2.4)

Lưu ý: có hai phiên bản dành cho Linux vì Linux có bảng tạm chính và phụ (còn được gọi là lựa chọn).

Linux :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip -r" \; display-message "Copied to selection"
bind-key -T copy-mode-vi Y send-keys -X copy-pipe "xclip -r -selection clipboard" \; display-message "Copied to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - && tmux paste-buffer"

Mac :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy" \; display-message "Copied to clipboard"

Tùy chỉnh các lệnh này

  • Nếu bạn không muốn lệnh cho bạn biết những gì nó đã làm trong dòng trạng thái thì chỉ cần xóa display-message (cũng như \; mà đến trước nó).

  • Nếu bạn đang sử dụng chế độ sao chép kiểu Emacs thay vì vi thì hãy thay thế bất kỳ trường hợp nào của copy-mode-vi chỉ với copy-mode

  • Nếu bạn đang chạy Linux và bạn muốn sử dụng xsel thay vì xclip thay thế xclip -r với xsel -i -pxclip -o với xsel -o -p

  • Các -r trong xclip -r là tùy chọn, nó sẽ xóa dòng mới nhất. Nó rất hữu ích để sao chép các lệnh, sau đó khi bạn dán chúng, chúng sẽ không được thực thi ngay lập tức.

  • Nếu bạn đang tạo đường hầm qua SSH thì bạn nên tham khảo https://unix.stackexchange.com/a3534581/14252

Tài liệu tham khảo:

10
Jason Axelson

Sau khi thử giải pháp khác nhau, đây là thiết lập cuối cùng của tôi:

# move x clipboard into tmux paste buffer
bind C-p run "xclip -o | tmux load-buffer -
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i -selection clipboard"

sử dụng bộ đệm lưu thay vì bộ đệm hiển thị sẽ cung cấp dữ liệu thực mà không có dữ liệu như hiển thị với ngắt dòng khi bạn đang phân tách.

Tôi cũng sử dụng điều này để bắt đầu lựa chọn/sao chép trong chế độ sao chép tmux:

bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection

Tôi đoán có thể hợp nhất lựa chọn sao chép với phím 'y' VÀ di chuyển nó vào bảng tạm x.

9
Ownatik

Tôi không thích có thêm phím bấm, vì vậy tôi muốn một cái gì đó tham vọng hơn. Nhập chế độ sao chép bằng [ tô sáng văn bản bên phải, rồi nhấn] để sao chép văn bản vào bảng tạm.

Ngoài ra, tmux thích bao gồm các dòng mới trong các biểu thức bao bọc (và kỳ lạ là những dòng mới đó nằm ở sai nơi! Chúng không phải là nơi biểu thức được bao bọc trên màn hình). Vì vậy, tôi muốn C-] sao chép biểu thức loại bỏ các dòng mới.

Trên tmux 1.6 tôi đã thử điều này:

bind [ copy-mode
bind -t vi-copy ] run "tmux send-keys Enter; tmux show-buffer | xclip -i -selection clipboard;"
bind -t vi-copy C-] run "tmux send-keys Enter; tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard;"

nhưng điều đó không hiệu quả vì tmux dường như không vui khi liên kết những thứ phức tạp vào bảng vi-copy. Vì vậy, tôi đã kết thúc việc này thay vào đó:

bind [ copy-mode \;                                                        \
    bind -n ] run                                                          \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | xclip -i -selection clipboard;                     \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]" \;                                                  \
    bind -n C-] run                                                        \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard; \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]"

Điều này dẫn đến những điều kỳ lạ (] hoặc C-] sẽ hành động buồn cười vào lần tới khi bạn sử dụng chúng, nhưng chỉ một lần) nếu bạn thoát khỏi chế độ sao chép theo cách khác bên cạnh] hoặc C-]. Điều này có thể được sửa chữa với một số ràng buộc hơn tôi tưởng tượng, nhưng đây là điều tôi muốn hầu hết thời gian.

7
Leif

Một giải pháp cho Mac OS X. Thực hiện theo 2 bước sau:

  1. Sử dụng cách giải quyết của Chris Johnsen: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard

  2. Thêm mã này vào cấu hình tmux của bạn (~/.tmux.conf)

# paste clipboard into tmux buffer
bind v run-Shell "reattach-to-user-namespace -l zsh -c 'tmux set-buffer \\"$(pbpaste)\\"; tmux paste-buffer'"
# put tmux buffer into x clipboard
bind y run-Shell "reattach-to-user-namespace -l zsh -c 'tmux show-buffer | pbcopy'"
4
Alex Gaudio

Đây là câu trả lời khá dài của tôi nên khắc phục hai vấn đề lớn khi sử dụng xclip để sao chép bộ đệm từ phiên tmux (ssh) từ xa:

1. Xclip vô trách nhiệm

Đối với tôi @ Grauwolf's câu trả lời với xclip không hoạt động (biểu hiện khung tmux hoàn toàn vô trách nhiệm). Tôi đã tìm hiểu tại sao trong trang Tmux của wiki Arch :

xclip cũng có thể được sử dụng cho mục đích đó, không giống như xsel, nó hoạt động tốt hơn trong việc in dòng bit thô không phù hợp với ngôn ngữ hiện tại. Tuy nhiên, việc sử dụng xsel thay vì xclip sẽ gọn gàng hơn, bởi vì xclip không đóng STDOUT sau khi nó đã đọc từ bộ đệm của tmux. Như vậy, tmux không biết rằng tác vụ sao chép đã hoàn thành và tiếp tục chờ kết thúc của xclip, do đó khiến tmux không phản hồi. Một cách giải quyết là chuyển hướng STDOUT của xclip sang/dev/null

Vì vậy, các ràng buộc nên là:

bind-key C-y run "tmux save-buffer - | xclip -i -sel clip > /dev/null"

Bây giờ, điều này sẽ hoạt động nếu phiên tmux của bạn là cục bộ.

2. xclip không thể kết nối với X

Nếu bạn đang sử dụng tmux trên ssh -X , có nhiều khả năng điều này sẽ không hoạt động trực tiếp.

Đó là vì biến Shell $DISPLAY Cần được đặt đúng.

Giải pháp hoàn chỉnh

Vì vậy, đối với tôi, giải pháp làm việc hoàn chỉnh là đặt các dòng sau vào ~/.tmux.conf:

set-option -g update-environment "DISPLAY"
bind-key C-y run "export DISPLAY=`tmux show-env | sed -n 's/^DISPLAY=//p'`; tmux save-buffer - | xclip -i -selection clipboard >/dev/null"
# Or more concise:
bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's/^DISPLAY=//p'` >/dev/null

Để dán từ chính:

bind-key C-p run "xclip -d `tmux show-env | sed -n s/^DISPLAY=//p` -o | tmux load-buffer - && tmux paste-buffer"

Tôi không hoàn toàn hiểu tại sao $DISPLAY Không được đặt chính xác trong khi tìm nguồn cung ứng .tmux.conf, Vì vậy đây là lý do tại sao tôi phải trích xuất nó bằng tmux show-envsed .

Nếu bạn có tmux> = 1.8, bạn có thể điều chỉnh lệnh này với copy-pipe:

bind-key -t vi-copy y copy-pipe 'xclip -in -selection clipboard -d `tmux show-env | sed -n s/^DISPLAY=//p` >/dev/null'
4
PlasmaBinturong

Một biến thể sửa đổi một chút của câu trả lời được chấp nhận, mà tôi đã nấu lên.

Tôi cũng thích sử dụng bảng tạm hệ thống (Ctrl-C, Ctrl-V) ngoài bảng tạm mặc định primary của xclip (cái bạn nhận được khi chọn chuột và nhấp chuột giữa). Để chọn bảng tạm hệ thống, bạn cần vượt qua -selection clipboard đối số thành xclip.

Ngoài ra, trong khi sao chép bộ đệm vào bảng tạm, tôi thích khả năng chọn bộ đệm nào tôi muốn sao chép. Nó được thực hiện bằng cách sử dụng choose-buffer và sau đó chuyển bộ đệm cho đối số save-buffer bằng cách sử dụng -b %%.

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b %% - | xclip -i -selection clipboard\""
# Paste from clipboard
bind C-v run "xclip -o -selection clipboard | tmux load-buffer - ; tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b %% - | xclip -i \""
# Paste from primary
bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

CẬP NHẬT : Bằng cách nào đó với tmux 1.8 và hai bản cài đặt openSUSE 12.2 của tôi, tôi thấy bị treo khi tmux run-Shell được gọi với xclip đọc từ stdin qua một đường ống. Thay vào đó, tôi quyết định thử xsel và điều đó có vẻ hiệu quả. Đây là các ràng buộc khóa tương đương bằng xsel. Tôi cũng đã sử dụng && để xâu chuỗi các lệnh trong dán để mạnh mẽ hơn.

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i -b\""
# Paste from clipboard
bind C-v run "xsel -o -b | tmux load-buffer - && tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i\""
# Paste from primary
bind C-p run "xsel -o | tmux load-buffer - && tmux paste-buffer"
4
Tuxdude

Có một giải pháp trên Arch Wiki bằng cách sử dụng xclip:

# move tmux copy buffer into x clipboard
bind-key C-y save-buffer /tmp/tmux-buffer \; run-Shell "cat /tmp/tmux-buffer | xclip"

https://wiki.archlinux.org/index.php/Tmux

4
jasonwryan

Nhiều câu trả lời trong số này không hoạt động cho Ubuntu 14.04 của tôi trên zsh. Không chắc Shell của tôi có liên quan gì không, nhưng đây là phiên bản hoạt động của tôi khi sử dụng chiến lược này để sao chép và chiến lược này để dán.

    bind-key -t vi-copy 'v' begin-selection
    bind-key -t vi-copy 'y' copy-pipe "xclip -sel clip -i"
    bind-key ] run-Shell "xclip -sel clip -o | tmux load-buffer - ; tmux paste-buffer" 

Một số lưu ý:

  • đối với ống sao chép, tôi cần chỉ định bảng tạm của mình bằng -sel clip -i. Dòng đó kết hợp bộ đệm yank với tmux và gửi nó đến xclip.
  • để thực sự dán nó, tôi cần phải xác định lại clipboard nào với -sel clip -o

Điều này hoạt động rất tốt bây giờ cho thiết lập vim/zsh/tmux của tôi.

3
brianclements

Tôi đang cố gắng tìm ra một cách hay để sao chép những gì tôi có trong bộ đệm tmux vào clipboard của mình. Tôi đã thử một vài thứ khác nhau như

Đối với các ràng buộc kiểu emacs có một vài lựa chọn khác nhau. (Kiểu Vi có giống nhau không?) Liên kết điển hình để thực hiện "chọn sao chép" trong emacs là M-w, vì vậy sẽ rất thuận tiện khi có cùng ràng buộc trong tmux.

1 - Sẽ là lý tưởng, nhưng không hoạt động (do giới hạn tmux?)

unbind-key -t emacs-copy M-w
bind-key -t emacs-copy M-w copy-selection\; \
  run-Shell "tmux save-buffer - | xsel --input --clipboard"

2 - Thỏa hiệp phù hợp với tôi: Chấp nhận sử dụng một liên kết phím khác cho emacs-copy trong tmux. Sử dụng ví dụ C-M-w. (Ràng buộc này sẽ được xác định là "toàn cầu" - không chỉ trong chế độ sao chép - mà chỉ hữu ích trong chế độ sao chép)

bind-key -n C-M-w send-keys M-w\; \
 run-Shell "tmux save-buffer - | xsel --input --clipboard" 
3
Hugo Heden

Và phiên bản cải tiến của câu trả lời @Leif có thể là:

tmux bind-key '[' run "tmux copy-mode;
tmux bind-key -n ']' run \"tmux send-keys Enter; tmux save-buffer - | xclip -i -selection clipboard;
tmux unbind-key -n ']'\";
tmux bind-key -n q run \"tmux unbind -n ']'; tmux send-keys q\";
tmux bind-key -n C-c run \"tmux unbind -n ']'; tmux send-keys C-c\""

Cách này không có hậu quả nếu bạn thoát khỏi chế độ sao chép theo cách khác], đoạn mã trên được gói trong tundle/tmux-yank một plugin tmux để sao chép văn bản tmux vào bảng tạm hệ thống, nó nhắm mục tiêu tmux> = 1.6 trên OS X và Linux.

1
Javier López

Trên OS-X với tmux phiên bản 2.2 trở lên, các thao tác sau sẽ hoạt động:

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"
1
Kyle Kloepper

Tôi sử dụng copyq trình quản lý clipboard nhiều dòng. (Nó hoạt động với Windows, OSX, Linux.)

  • Thêm các dòng sau vào ~/.tmux.conf:

    set-window-option -g mode-keys vi
    bind C-y run 'out=`tmux save-buffer - ` && copyq add "$out"'
    
  • cygwin nhu cầu copyq.exe vị trí trong ~/.bashrc:

    export PATH="$PATH:/cygdrive/c/Program Files (x86)/CopyQ"
    
1
Oleg Svechkarenko