คัดลอกส่วนที่เลือกไปยังคลิปบอร์ดใน tmux


22

หากฉันเลือกข้อความด้วยเมาส์ใน tmux ใน iTerm2 บน macOS ฉันจะได้รับข้อความที่คัดลอกไปยังคลิปบอร์ดของฉัน ฉันไม่ต้องคลิกปุ่มพิเศษใด ๆ เพียงแค่เลือกข้อความที่คุณต้องการและคุณก็ทำเสร็จแล้ว

ฉันทดสอบ tmux ใน terminal.app บน macOS แต่มันใช้งานไม่ได้ฉันต้องกดปุ่มyเพื่อคัดลอกส่วนที่เลือกไปยังคลิปบอร์ดของฉัน

ผมคิดว่ามีความเป็นเมาส์ที่มีผลผูกพัน (สิ่งที่ชอบMouseOnSelectionคล้ายกับMouseDown1Pane) man tmuxแต่ฉันไม่สามารถหาอะไรที่เป็นประโยชน์บนเว็บและ

ฉันสงสัยว่ามีวิธีที่จะมีพฤติกรรมที่คล้ายกันใน Ubuntu 16.10 - โดยเฉพาะอย่างยิ่งใน terminal Gnome

dotfiles tmux ของฉันที่มีอยู่ที่นี่ (ลิงค์)

คำตอบ:


44

Tmux 2.4+ พร้อมการผูกโหมดการคัดลอก vi และ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"

สำหรับเวอร์ชัน tmux ที่เก่ากว่าการเชื่อมโหมดการคัดลอก emacs (ค่าดีฟอลต์) หรือแพลตฟอร์มที่ไม่ใช่ X (เช่นไม่มี xclip) ให้ดูคำอธิบายด้านล่าง


คำอธิบาย: ก่อนอื่นเราต้องเปิดใช้งานตัวเลือกเมาส์ดังนั้น tmux จะจับเมาส์และให้เราผูกเหตุการณ์เมาส์:

set-option -g mouse on

Gnome-terminal ไม่รองรับการตั้งค่าคลิปบอร์ดโดยใช้ลำดับ xterm escape ดังนั้นเราควรตรวจสอบให้แน่ใจว่าset-clipboardตัวเลือกปิดอยู่:

set-option -s set-clipboard off

ตัวเลือกนี้อาจได้รับการสนับสนุนและเปิดใช้งานโดยค่าเริ่มต้นใน iTerm2 (ดูset-clipboardในคู่มือ tmux) ซึ่งจะอธิบายพฤติกรรมที่มี

จากนั้นเราสามารถผูกโหมดการคัดลอกMouseDragEnd1Pane"กุญแจ" เช่นเมื่อปุ่มเมาส์แรกถูกปล่อยหลังจากคลิกและลากในบานหน้าต่างไปยังคำสั่ง tmux ซึ่งจะเลือกการคัดลอกโหมดปัจจุบัน (ทำโดยการผูกเริ่มต้นMouseDrag1Pane) และไพพ์กับคำสั่งเชลล์ คำสั่งนี้เป็น tmux copy-pipeก่อน tmux 2.4 และได้มีการเปลี่ยนแปลงsend-keys -X copy-pipe[-and-cancel]ไป สำหรับคำสั่งเชลล์เราเพียงต้องการสิ่งที่จะตั้งค่าเนื้อหาของคลิปบอร์ดของระบบเป็นสิ่งที่ถูกประปาไป xclip ใช้เพื่อทำสิ่งนี้ในคำสั่งต่อไปนี้ การทดแทนที่เทียบเท่าสำหรับ"xclip -selection clipboard -i"ด้านล่างบนแพลตฟอร์มที่ไม่ใช่ X คือ"wl-copy"(Wayland), "pbcopy"(macOS), "clip.exe"(Windows, WSL) และ"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 ถึง 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"

ก่อน tmux 2.2:

คัดลอกสนับสนุนหลังการลากเมาส์ถูกบันทึกครั้งแรกใน Tmux 1.3 ผ่านการตั้งค่าใหม่ตัวเลือกในการmode-mouse onTmux 2.1 เปลี่ยนการสนับสนุนเมาส์เป็นการผูกคีย์เมาส์ที่คุ้นเคย แต่ไม่มีDragEndการโยงซึ่งแนะนำใน 2.2 ดังนั้นก่อน 2.2 ฉันเชื่อว่าวิธีเดียวในการตั้งค่าคลิปบอร์ดระบบในการลากเมาส์คือการใช้ xterm escape sequences ในset-clipboardตัว( ตัวเลือก) ซึ่งหมายความว่าจำเป็นต้องอัปเดตเป็นอย่างน้อย tmux 2.2 เพื่อรับพฤติกรรมการลากและคัดลอกสำหรับเทอร์มินัลที่ไม่สนับสนุนset-clipboardเช่นเทอร์มินัล GNOME


3
คำตอบที่มีคุณภาพสูงนี้คือสิ่งที่ในที่สุดก็ทำให้คลิกทั้งหมดสำหรับฉัน .. ขอบคุณ!
cjauvin

2
สำหรับทุกคนที่พยายามที่จะทำเช่นนี้ใน mac เพราะพวกเขาได้เปลี่ยนฟังก์ชันการทำงานที่ขั้วของพวกเขาและวิธีการเริ่มต้นดังกล่าวโดย OP ไม่มีผลงานอีกต่อไป (ฉันใช้ Byobu ซึ่งมีบัฟเฟอร์สำเนาของตัวเอง): แทนxclip...คำสั่งกับที่เรียบง่ายpbcopyไม่ เคล็ดลับ.
Darrel Holt

ไม่มีวิธีแก้ปัญหาใดในกระทู้นี้สำหรับฉัน
Yankee

1
สวัสดี Josh เมื่อฉันซอร์สไฟล์ ~ / .tmux.conf มันกลับกลายเป็น:Unknown key: MouseDragEnd1Pane
Xifeng Li

@XifengLi คุณใช้ tmux เวอร์ชั่นใดและระบบปฏิบัติการใด? ฉันเชื่อว่าคุณต้องการอย่างน้อย tmux 2.2 สำหรับDragEndกุญแจ
Josh Brobst

8

ในฐานะที่เป็นส่วนขยายของคำตอบที่ได้รับการยอมรับผู้คนมักพบว่าการรบกวนเมื่อปล่อยปุ่มเมาส์ออกจากโหมดคัดลอก (นี่คือสิ่งที่เกิดขึ้นกับcopy-pipe-and-cancel) ดู: https://github.com/tmux/tmux/issues/140 ดังนั้นใน tmux ที่ใหม่กว่า (ฉันใช้ 2.6) เราสามารถใช้copy-pipeร่วมกับclear selectionเพื่อคัดลอกไปยังการเลือก แต่ไม่ออกจากโหมดคัดลอก:

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

2

ขยายคำตอบทั้งสองเพื่อคัดลอกจาก msys2 ไปยังคลิปบอร์ดของ Windows (และล้างการเลือก):

# 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

จุดดี. ฉันใช้โหมดถ่ายสำเนาตัวเอง (สไตล์ emacs) และวางการตั้งค่าของฉันเองหลังจากการทดสอบ ฉันได้อัปเดตคำตอบเพื่อรวมทั้งคำตอบที่ยอมรับแล้ว
Shawn Hoover

0

ส่วนขยายอื่นเกี่ยวกับการใช้Shiftคีย์

กดค้างไว้Shiftขณะเลือกข้อความด้วยเมาส์ ตอนนี้คุณจะได้รับเมนูคลิกขวามาตรฐาน (กดค้างไว้หรือกดShiftอีกครั้ง) และคุณสามารถใช้Ctrl+Shift+CและCtrl+Shift+Vเพื่อคัดลอกและวาง ข้อความที่คัดลอกจะยังมีอยู่ในคลิปบอร์ดระบบ

การทดสอบบนด้วยUbuntu 18.04.1tmux 2.6

ที่มา: https://forum.upcase.com/t/tmux-ctrl-shift-c-and-ctrl-shift-v-bindings/1208

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.