Sao chép lựa chọn vào một bảng tạm trong tmux


22

Nếu tôi chọn văn bản bằng chuột trong tmux trong iTerm2 trên macOS, tôi sẽ nhận được văn bản đã chọn được sao chép vào bảng tạm. Tôi không phải nhấp vào bất kỳ nút phụ nào - chỉ cần chọn văn bản bạn muốn và bạn đã hoàn tất.

Tôi đã thử nghiệm tmux trong terminal.app trên macOS nhưng nó không hoạt động ở đó - Tôi phải nhấn yđể sao chép lựa chọn vào clipboard của mình.

Tôi nghĩ rằng có một ràng buộc chuột (một cái gì đó MouseOnSelectiontương tự MouseDown1Pane) nhưng tôi không thể tìm thấy bất cứ điều gì hữu ích trên web và man tmux.

Tôi tự hỏi liệu có cách nào để có hành vi tương tự trên Ubuntu 16.10 hay không - tốt nhất là trong thiết bị đầu cuối Gnome.

Dotfiles tmux của tôi có sẵn ở đây (liên kết) .

Câu trả lời:


44

Tmux 2.4+ với các ràng buộc chế độ sao chép vi và xclip :

set-option -g mouse on
set-option -s set-clipboard off
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -se c -i"

Đối với các phiên bản tmux cũ hơn, emacs sao chép chế độ ràng buộc (mặc định) hoặc nền tảng không phải X (nghĩa là không có xclip), xem phần giải thích bên dưới.


Giải thích: Đầu tiên chúng ta cần kích hoạt tùy chọn chuột để tmux sẽ bắt chuột và để chúng tôi liên kết các sự kiện chuột:

set-option -g mouse on

Gnome-terminal không hỗ trợ cài đặt bảng tạm bằng cách sử dụng các chuỗi thoát xterm, vì vậy chúng tôi nên đảm bảo set-clipboardtùy chọn bị tắt:

set-option -s set-clipboard off

Tùy chọn này có thể được hỗ trợ và kích hoạt theo mặc định trên iTerm2 (xem set-clipboardtrong hướng dẫn sử dụng tmux), điều này sẽ giải thích hành vi trên đó.

Sau đó, chúng ta có thể liên kết MouseDragEnd1Pane"khóa" chế độ sao chép , tức là khi nút chuột đầu tiên được giải phóng sau khi nhấp và kéo trong một ngăn, với lệnh tmux có lựa chọn chế độ sao chép hiện tại (được tạo bởi liên kết mặc định cho MouseDrag1Pane) và đặt nó để một lệnh shell. Lệnh tmux này có copy-pipetrước tmux 2.4 và từ đó đã đổi thành send-keys -X copy-pipe[-and-cancel]. Đối với lệnh shell, chúng ta chỉ cần một cái gì đó sẽ đặt nội dung của bảng tạm hệ thống thành bất cứ thứ gì được dẫn đến nó; xclip được sử dụng để làm điều này trong các lệnh sau. Một số thay thế tương đương cho "xclip -selection clipboard -i"bên dưới trên các nền tảng không phải là X là "wl-copy"(Wayland), "pbcopy"(macOS), "clip.exe"(Windows, WSL) và "cat /dev/clipboard"(Cygwin, MinGW).

Tmux 2.4+:

# For vi copy mode bindings
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i"

Tmux 2.2 đến 2.4:

# For vi copy mode bindings
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"
# For emacs copy mode bindings
bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "xclip -selection clipboard -i"

Trước tmux 2.2:

Sao chép sau khi hỗ trợ kéo chuột ban đầu được thêm vào Tmux 1.3 thông qua cài đặt mode-mousetùy chọn mới thành on. Tmux 2.1 đã thay đổi hỗ trợ chuột thành các ràng buộc phím chuột quen thuộc, nhưng không có DragEndcác ràng buộc, được giới thiệu trong 2.2. Do đó, trước 2.2 tôi tin rằng phương pháp duy nhất để thiết lập bảng tạm hệ thống khi kéo chuột là thông qua việc sử dụng các chuỗi thoát xterm tích hợp ( set-clipboardtùy chọn). Điều này có nghĩa là cần phải cập nhật lên ít nhất tmux 2.2 để có được hành vi kéo và sao chép cho các thiết bị đầu cuối không hỗ trợ set-clipboard, chẳng hạn như Terminal Gnome.


3
Câu trả lời chất lượng cao này là những gì cuối cùng đã làm cho tất cả nhấp vào cho tôi .. cảm ơn!
cjauvin

2
Đối với bất cứ ai cố gắng để làm điều này trên một mac vì họ đã thay đổi chức năng thiết bị đầu cuối của họ và phương pháp mặc định như đã nêu bởi OP không còn công trình (Tôi đang sử dụng Byobu trong đó có bộ đệm bản sao riêng của nó): thay thế các xclip...tuyên bố với một đơn giản pbcopykhông mánh khóe
Darrel Holt

Không có giải pháp nào trong chủ đề này làm việc cho tôi.
Yankee

1
Xin chào Josh, khi tôi nguồn-file ~ / .tmux.conf, nó bật ra:Unknown key: MouseDragEnd1Pane
Xifeng Li

@XifengLi Phiên bản tmux và HĐH nào bạn đang sử dụng? Tôi tin rằng bạn cần ít nhất tmux 2.2 cho các DragEndphím.
Josh Brobst

8

Là một phần mở rộng cho câu trả lời được chấp nhận, mọi người thường thấy rằng việc làm phiền khi nhả nút chuột sẽ thoát khỏi chế độ sao chép (đây là điều xảy ra với copy-pipe-and-cancel). Xem: https://github.com/tmux/tmux/issues/140 . Do đó, trong tmux mới hơn (tôi sử dụng 2.6), chúng ta có thể sử dụng copy-pipecùng với clear selectionđể sao chép để chọn nhưng không thoát khỏi chế độ sao chép:

bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe "xclip -selection clipboard -i" \; send -X clear-selection

2

Mở rộng cả hai câu trả lời để sao chép từ msys2 vào khay nhớ tạm của Windows (và xóa lựa chọn):

# For vi copy mode bindings
bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection
# For emacs copy mode bindings
bind -Tcopy-mode MouseDragEnd1Pane send -X copy-pipe "cat > /dev/clipboard" \; send -X clear-selection

Điểm tốt. Tôi sử dụng chế độ sao chép bản thân (kiểu emacs) và do đó đã dán cấu hình của riêng tôi sau khi thử nghiệm. Tôi đã cập nhật câu trả lời để bao gồm cả hai như trong câu trả lời được chấp nhận.
Shawn Hoover

0

Một phần mở rộng khác là về việc sử dụng Shiftkhóa.

Giữ Shifttrong khi chọn văn bản bằng chuột. Bây giờ bạn có một menu chuột phải tiêu chuẩn (tiếp tục giữ hoặc nhấn Shiftlại) và bạn có thể sử dụng Ctrl+Shift+CCtrl+Shift+Vsao chép và dán. Văn bản sao chép cũng sẽ có sẵn trong clipboard hệ thống .

Đã thử nghiệm Ubuntu 18.04.1với tmux 2.6.

Nguồn: https://forum.upcase.com/t/tmux-ctrl-shift-c-and-ctrl-shift-v-bindings/1208 .

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.