คัดลอก / วางการเลือกข้อความระหว่าง tmux และคลิปบอร์ด


15

ฉันกำลังเรียกใช้ tmux รุ่นล่าสุด (จากที่เก็บ git) และ xclip (0.12) และฉันต้องการใช้การผูกคีย์บอร์ดของ Emacs เหมือนเพื่อเลื่อนไปมากับข้อความcopy-modeคัดลอก ( M-w) ตัวเลือกไปยังคลิปบอร์ดและ วาง ( C-y) จาก / ไปยังบัฟเฟอร์การคัดลอกไปยังคลิปบอร์ด

จนถึงตอนนี้ฉันสามารถวางข้อความด้วยC-yและย้ายไปรอบ ๆcopy-modeด้วยการผูกคีย์บอร์ด Emacs เหมือน แต่ฉันยังคงไม่สามารถคัดลอกข้อความจาก tmux buffer (เช่นในcopy-mode)

ฉันพบกระทู้นี้สำหรับการคัดลอกบัฟเฟอร์ทั้งหมดไปยังคลิปบอร์ด (และ viceversa) แต่ดูเหมือนจะไม่ทำงานสำหรับฉัน

นอกจากนี้ในtmux-usersรายชื่ออีเมลผมก็บอกว่ารุ่นล่าสุดของ tmux (เฉพาะใน repo คอมไพล์) copy-pipeจัดให้มีคำสั่งที่เรียกว่า หน้าคนพูดเกี่ยวกับคำสั่งนี้ต่อไปนี้:

หนึ่งคำสั่งในการยอมรับอาร์กิวเมนต์คัดลอกไพพ์ซึ่งคัดลอกส่วนที่เลือกและไพพ์ไปยังคำสั่ง ตัวอย่างเช่นต่อไปนี้จะผูก 'C-q' เพื่อคัดลอกส่วนที่เลือกลงใน / tmp เช่นเดียวกับการวางบัฟเฟอร์:

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"

ดูเหมือนว่าcopy-pipeมีวัตถุประสงค์เพื่อใช้ในส่วนที่จะไพพ์การเลือกไปยังคำสั่งอื่น ดูเหมือนว่าจะมีการพิมพ์ผิดในคำอธิบายนี้และในคำสั่ง (คือtemacs-copyอะไร)

ไม่ว่าจะด้วยวิธีใดสิ่งที่ฉันต้องการทำคือ:

คัดลอก:

  1. เข้าสู่โหมดคัดลอก
  2. ย้ายไปที่ข้อความที่ฉันต้องการที่จะคัดลอกโดยใช้คำสั่งนำทาง Emacs (เช่นC-f, C-b, M-f, M-b, C-a, C-eฯลฯ เพื่อเลื่อนเคอร์เซอร์) ไม่มีคำนำหน้าสำหรับสิ่งเหล่านี้
  3. คัดลอกข้อความที่เลือกไปยังคลิปบอร์ดด้วย: M-w( ไม่มีส่วนนำหน้า )

การวาง:

  1. ฉันต้องการพิมพ์C-y( โดยไม่ต้องป้อนcopy-mode) เพื่อวางข้อความในเทอร์มินัล ( ไม่มีส่วนนำหน้า )

ฉันได้ลองทำสิ่งต่อไปนี้เพื่อคัดลอกโดยไม่มีโชค:

bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard" 

อย่างไรก็ตามการวางทำได้ดี:

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

สิ่งที่แปลกคือฉันรู้ว่าxclip -i -selection clipboardส่วนของคำสั่งคัดลอกด้านบนทำงานได้ดีเนื่องจากฉันสามารถคัดลอกสิ่งต่าง ๆ ไปยังคลิปบอร์ดในบรรทัดคำสั่งได้เช่น:

echo "Hello world. How are you?" | xclip -i -selection clipboard

ทั้งหมดนี้ฉันจะคัดลอกส่วนที่เลือกจากโหมดคัดลอกไปยังคลิปบอร์ดได้อย่างไร

คำตอบ:


19

ใช้สิ่งต่อไปนี้ tmux.confด้วยcopy-pipeใน tmux เวอร์ชันใหม่ (1.8+):

set -g mouse on
# To copy:
bind-key -n -t emacs-copy M-w copy-pipe "xclip -i -sel p -f | xclip -i -sel c "

# To paste:
bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
  1. prefix+[ เข้าสู่โหมดคัดลอก
  2. เลือกเนื้อหาด้วยเม้าส์ (กดค้างไว้)
  3. M-w เพื่อคัดลอกส่วนนั้นไปยังคลิปบอร์ดของระบบ
  4. C-yวางลงใน tmux C-vเพื่อวางในแอปพลิเคชันทั่วไปอื่น ๆ เช่นเว็บเบราว์เซอร์

คำตอบนี้สมควรได้รับการโหวตมากขึ้นมันเป็นสิ่งที่ดีที่สุดสำหรับการติดตั้งบน Linux
Louis Kottmann

ใน tmux 2.0 มันrun-shellแทนrun
roign

@LouisKottmann: ทำไมเพียงแค่ใช้ Linux?
schaiba

ฉันไม่สามารถแสดงความคิดเห็นในระบบอื่น ๆ ได้ แต่ฉันเชื่อว่า mac ใช้ bpaste แทน xclip ปกติ
Louis Kottmann

ใน tmux 2.8 bind -Tcopy-mode M-w send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c "ผมต้องเปลี่ยนพวกเขาเป็น bind-key -n C-y run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer" ตามคำมั่นสัญญาที่เสนอโดยstarfry
azzamsa

6

โปรดทราบว่าด้วย Tmux 2.4 (ตั้งแต่การกระทำนี้ ), ไวยากรณ์ผูกพันมีการเปลี่ยนแปลง ฉันแปลความคิดเห็น Github นี้เพื่อสรุปการเปลี่ยนแปลงสั้น ๆ :

  1. แทนที่-tด้วย-T
  2. แทนที่vi-<name>ด้วย<name>-mode-vi
  3. นำหน้าคำสั่งด้วย send-keys -X

ฉันมี:

bind-key -n -t vi-copy Enter copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -t vi-copy MouseDragEnd1Pane copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

ซึ่งฉันต้องการเปลี่ยนเป็น:

bind-key -n -T copy-mode-vi Enter send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

จากการเปลี่ยนแปลง :

ตารางคีย์มีการเปลี่ยนแปลงที่สำคัญ ตารางคีย์โหมดจะไม่แยกจากตารางคีย์หลักอีกต่อไป ตารางคีย์โหมดทั้งหมดถูกลบออกพร้อมกับแฟล็ก -t เป็น bind-key และ unbind-key

ตาราง emacs-edit, vi-edit, emacs-select และ vi-choose ถูกแทนที่ด้วยการโยงคีย์คงที่ในพร้อมต์คำสั่งและเลือกโหมด ตัวเลือกโหมดปุ่มและปุ่มสถานะจะยังคงอยู่

ตาราง emacs-copy และ vi-copy ถูกแทนที่โดยตาราง copy-mode และ copy-mode-vi คำสั่งถูกส่งโดยใช้แฟล็ก -X และ -N เพื่อส่งคีย์ ดังนั้นต่อไปนี้:

bind -temacs-copy C-Up scroll-up
bind -temacs-copy -R5 WheelUpPane scroll-up

กลายเป็น:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

การเปลี่ยนแปลงเหล่านี้อนุญาตให้ตัวแยกวิเคราะห์คำสั่งเต็มรูปแบบ (รวมถึงลำดับคำสั่ง) และชุดคำสั่งที่จะใช้ - ตัวอย่างเช่นพร้อมท์คำสั่งปกติพร้อมการแก้ไขและประวัติตอนนี้ใช้สำหรับการค้นหากระโดดและอื่น ๆ แทนแบบกำหนดเอง Cr ผูกพันเริ่มต้นคือตอนนี้:

bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward-incremental '%%'"

นอกจากนี้ยังมีคำสั่งใหม่บางรายการที่ใช้กับ send -X เช่น copy-pipe-and-cancel


2

-temacs-copyไม่ได้พิมพ์ผิด เส้นประนำหมายความว่านี่เป็นตัวเลือกสำหรับbind-keysคำสั่ง (พร้อมด้วยอาร์กิวเมนต์สำหรับตัวเลือก) มันเทียบเท่ากับ-t emacs-copyถ้าคุณชอบที่ดีกว่า

โหมดการคัดลอกใช้การเชื่อมและชุดคำสั่ง1 ที่แตกต่างจาก“ โหมดปกติ” copy-pipeคำสั่งจะใช้ได้เฉพาะในสลับโหมด“” ตารางผูก เมื่อmode-keysใดemacsโหมดคัดลอกจะใช้emacs-copyตารางดังนั้นคุณต้องผูก Mw ไว้copy-pipeในตารางนั้น

bind-key -temacs-copy M-w copy-pipe "xclip -i -selection clipboard"

ระวังการทำคำนำหน้า "ไม่มีคำนำหน้า" มากเกินไป พวกเขาจะทำให้มันยากที่จะพิมพ์คีย์ที่ถูกผูกไว้กับโปรแกรมที่ทำงานภายในtmux (เช่นเมื่อคุณต้องการพิมพ์ Cy ไปยังอินสแตนซ์โหมด tty ของEmacs ที่ทำงานในtmux ) คุณสามารถผูก (prefix) คีย์ได้บ้างsend-keys C-yแต่อาจทำให้ยุ่งยากในการพิมพ์หากคุณต้องการมันบ่อยพอ


1มีคำสั่งการเคลื่อนไหวและการแก้ไขเท่านั้น ด้วยข้อยกเว้นของcopy-pipeคำสั่งเหล่านี้จะไม่ขัดแย้งใด ๆ (นี่คือสิ่งที่หน้าคนหมายถึงมันบอกว่า "หนึ่งคำสั่งในการยอมรับการโต้แย้ง"; "ใน" อาจเป็นพิมพ์ผิดหรือแก้ไขข้อผิดพลาด)


2

ในขณะที่คำตอบอื่น ๆ อาจช่วยได้นี่คือวิธีที่ฉันทำเหมือนกัน:

  • Shift + เลือกข้อความด้วยเคอร์เซอร์
  • Ctrl + Shift + C เพื่อคัดลอกข้อความไปยังคลิปบอร์ด

นี่เป็นคำตอบที่ยุติธรรม แต่ปัญหาเริ่มต้นเมื่อคุณมีบานหน้าต่างสองบานขึ้นไปเรียงในแนวนอน
cjauvin

ฉันขอแจ้งให้เราทราบหากคุณพบสิ่งที่มีประโยชน์สำหรับสิ่งนั้น
Rishabh Agrahari

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