ฉันจะคัดลอกข้อความไปยังคลิปบอร์ดของระบบจาก Vim ได้อย่างไร?


282

มีวิธีการคัดลอกบล็อกข้อความไปยังคลิปบอร์ดของระบบเพื่อให้ฉันสามารถวางในโปรแกรมอื่นได้หรือไม่


12
สิ่งนี้ถูกถามและตอบใน SO แล้ว คุณอาจพบข้อมูลเพิ่มเติมและแตกต่างที่นั่น
bsmith89

1
ฉันใช้ปลั๊กอินนี้ใน macvim christoomey / vim-system-copyและรักมันจริงๆ จริงๆมันทำงานได้ดีกับการเคลื่อนไหว,cpip cpi{
Filype

2
สิ่งที่คุณต้องการจริงๆคือEasyClip มันจะทำอย่างนั้นและอื่น ๆ อีกมากมาย ...
Scott Wade

คำตอบ:


321

สำหรับระบบที่ใช้X11 (เช่นLinuxและระบบอื่น ๆ ที่คล้ายกับUNIX ) มีสองบอร์ดคลิปซึ่งแยกจากกัน:

  • หลัก - นี่คือการคัดลอกเลือกและสามารถวางด้วยปุ่มกลางของเมาส์
  • คลิปบอร์ด - สิ่งนี้ถูกคัดลอกด้วย (โดยปกติ) ^Cและวางด้วย^V(เหมือน MS Windows)

ระบบ OS XและWindowsมีคลิปบอร์ดเดียวเท่านั้น

สำหรับระบบ X11 ยังมีจำนวนเครื่องมือที่ซิงโครไนซ์คลิปบอร์ดเหล่านี้ให้คุณ ดังนั้นหากพวกเขาดูเหมือนจะเหมือนกันคุณอาจมีหนึ่งในนั้นทำงาน

Vim มีการลงทะเบียนพิเศษสองรายการที่สอดคล้องกับคลิปบอร์ดเหล่านี้:

  • *ใช้หลัก ช่วยในการจำ: S tar เป็นSเลือกตั้ง (สำหรับการคัดลอกจอsเลือกตั้ง)
  • +ใช้ CLIPBOARD; ช่วยในการจำ: CTRL PLUS C (สำหรับปุ่มลัดทั่วไป)

บน Windows & OS X ไม่มีความแตกต่างระหว่าง+และ*เนื่องจากระบบเหล่านี้มีคลิปบอร์ดเดียวเท่านั้นและทั้งสองรีจิสเตอร์อ้างถึงสิ่งเดียวกัน (มันไม่สำคัญว่าคุณจะใช้งานอะไร)

คุณสามารถใช้การลงทะเบียนเหล่านี้เป็นการลงทะเบียนใด ๆ ตัวอย่างเช่นการใช้คลิปบอร์ดหลัก*ด้วยคำสั่งyและp:

  • "*yy
  • "*p

คุณอาจจะใช้สิ่งนี้เป็นปุ่มลัดที่สะดวกกว่า:

noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

หากคุณต้องการอินเทอร์เฟซ "อัตโนมัติ" กับคลิปบอร์ดของระบบแทนการอ้างอิงด้วยตนเองตลอดเวลาคุณสามารถตั้งค่าclipboardตัวแปร:

  • ตั้งค่าเป็นunnamedใช้*(เลือกบน)
  • ตั้งค่าunnamedplusให้ใช้+(CLIPBOARD, ^C)

ตอนนี้เพียงแค่ใช้yyจะไปที่คลิปบอร์ดของระบบแทนการลงทะเบียนที่ไม่มีชื่อของ Vim และpจะวางคลิปบอร์ดของระบบ

นอกจากนี้คุณยังสามารถกำหนดให้กับผู้ลงทะเบียนเหล่านี้ได้เช่นเดียวกับการลงทะเบียนด้วยlet:

  • :let @+=42
  • :let @*=42

การclipboardตั้งค่ามีตัวเลือกเพิ่มเติม (เช่นไม่รวมตัวกรอง) แต่สิ่งเหล่านี้เป็นพื้นฐาน ดู:help 'clipboard'เรื่องเต็ม ;-)

gVim

ถ้าคุณใช้ gVim :set guioptions+=aคุณจะได้รับการคัดลอกเมื่อเลือกพฤติกรรมเมื่อใช้
นี่คือการเปิดใช้งานโดยค่าเริ่มต้นในระบบ X11 (คัดลอกไปที่หลัก) แต่ไม่ได้อยู่ใน MS Windows & OSX (เนื่องจากการเลือกข้อความใด ๆ จะแทนที่คลิปบอร์ดของคุณ)

ไม่มี+clipboard?

Vim ต้องการ+clipboardแฟล็กคุณลักษณะเพื่อให้สิ่งนี้ทำงานได้; คุณสามารถตรวจสอบว่าเป็นกลุ่มของคุณมีนี้โดยใช้:echo has('clipboard')จากภายในกลุ่ม (ถ้าออกเป็น0ก็ไม่ได้ปัจจุบันถ้ามัน1ก็เป็น) หรือการตรวจสอบการส่งออกของ สำหรับvim --version+clipboard

ลีนุกซ์ส่วนใหญ่จัดส่งมาพร้อมกับ Vim แบบ "น้อยที่สุด" โดยค่าเริ่มต้น, ซึ่งไม่มี+clipboard, แต่โดยทั่วไปคุณสามารถติดตั้งได้:

  • Debian และ Ubuntu: การติดตั้งหรือvim-gtkvim-gnome
  • Fedora: ติดตั้งvim-X11และเรียกใช้vimxแทนvim( ข้อมูลเพิ่มเติม )
  • Arch Linux: ติดตั้งgvim(สิ่งนี้จะเปิดใช้+clipboardงานตามปกติvimเช่นกัน)

นอกจากนี้คุณยังสามารถใช้xclip, xcopyหรือxselเพื่อคัดลอกข้อความไปยังคลิปบอร์ด; ดูคำถามต่อไปนี้สำหรับการแก้ปัญหา:

SSH

คุณยังสามารถใช้คลิปบอร์ดบนเครื่องระยะไกลหากคุณเปิดใช้งานการส่งต่อ X11 ผ่าน SSH สิ่งนี้มีประโยชน์อย่างยิ่งกับเคล็ดลับข้างต้นเนื่องจากคุณสามารถใช้ xclipเพื่อเข้าถึงคลิปบอร์ดของเดสก์ท็อป เสียงเรียกเข้าบนเครื่องที่คุณกำลังจะยังต้องการ+clipboardคุณสมบัติอยู่

สิ่งนี้ต้องการการForwardX11Trustedตั้งค่าและควรทำกับเซิร์ฟเวอร์ที่เชื่อถือได้เท่านั้นเนื่องจากจะช่วยให้เซิร์ฟเวอร์สามารถควบคุมเซสชัน X11 ของคุณได้เกือบสมบูรณ์:

$ ssh -XY myhost

หากต้องการตั้งค่าเหล่านี้แบบถาวร (ดังนั้นคุณไม่จำเป็นต้องเพิ่ม-XYทุกครั้ง) คุณสามารถทำสิ่งนี้ใน~/.ssh/config:

# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
    ForwardX11 yes
    ForwardX11Trusted yes

Neovim

Neovim ปรับปรุงการสนับสนุนคลิปบอร์ด อินเตอร์เฟซในตัวจะถูกลบออกไปและแทนที่ด้วยระบบที่เรียกสาธารณูปโภคภายนอกเช่นxclip, xselหรือ /pbcopypbpaste

มันควรรับสาธารณูปโภคเหล่านี้โดยอัตโนมัติและใช้พวกเขา บน OS X pbcopy และpbpasteควรจะมีให้ใช้งานตามค่าเริ่มต้นบน Linux คุณอาจต้องการติดตั้งxclipเนื่องจากเป็นที่แพร่หลายมากที่สุด (จริงๆแล้วมีสอง รุ่นxselด้วยแฟล็กที่เข้ากันไม่ได้นี่เป็นเรื่องที่โง่จริงๆ)

ดูที่:help clipboardNeovim ด้วย


6
ssh -Y หมายถึง -X ดังนั้น -X สามารถละเว้นได้
hildred

สำหรับคีย์บอร์ดนานาชาติบางอย่างที่คุณอาจต้องกดที่จะได้รับ"<Space> "ดังนั้นในกรณีเหล่านั้นคุณจะต้องกด"<Space>+yหรือ"<Space>*yคัดลอก
อาร์เธอร์ F

1
ผลข้างเคียงที่น่าสนใจมากของการเรียนรู้เรื่องนี้ (ไม่กี่ปีที่ผ่านมา) สำหรับฉันคือการตระหนักว่า"สามารถเลือกชื่อที่ลงทะเบียนมากมาย ไม่ได้วิเศษมันเป็นเพียงแค่ลงทะเบียน"+ +ดังนั้นสำหรับตัวอย่างเช่นถ้าคุณต้องการเพื่อคัดลอกสามสิ่งในเวลาเดียวกันและวางแต่ละของพวกเขาหนึ่งโดยหนึ่งคุณสามารถ"1y, "2yและ"3yและต่อมา"1p, และ"2p "3pนี่เป็นสิ่งที่ทรงพลังจริงๆและไม่มีอยู่ในตัวแก้ไขอื่น ๆ เกือบทั้งหมด การใช้งานที่น่าสนใจอีกอย่างคือดูที่แมโครที่เก็บไว้ ตัวอย่างเช่นถ้าคุณบันทึกด้วยqqแต่คุณรู้ว่าคุณต้องการที่จะแก้ไขได้คุณสามารถ: ในสายชั่วคราวแก้ไขได้และ"qp "qd
Shahbaz

1
เพียงแค่ทราบ: OS X มีสองคลิปบอร์ดแยกกัน หนึ่งเข้าถึงได้โดยใช้ Cmd-C และ Cmd-V และอื่น ๆ โดยใช้ emacs keybindings Ctrl-K และ Ctrl-Y
BallpointBen

3
@shahbaz - น่าจะดีกว่าที่จะใช้การลงทะเบียนตัวอักษรเพื่อจุดประสงค์ดังกล่าวเนื่องจากตัวเลขที่ได้รับการเปลี่ยนแปลงเมื่อใดก็ตามที่ข้อความถูกลบ
evilsoup

18

คำตอบอื่น ๆ ครอบคลุมถึงวิธีการคัดลอกข้อความจากบัฟเฟอร์ของคุณไปยังคลิปบอร์ดของระบบ การดำเนินการทั่วไปอื่นคือการคัดลอกข้อความจากการลงทะเบียนอื่นไปยังคลิปบอร์ด ตัวอย่างเช่นหากคุณดึงข้อความไปแล้ว"(การลงทะเบียนเริ่มต้น) คุณอาจต้องการโหลดการลงทะเบียนนั้นลงในคลิปบอร์ด

คุณสามารถทำได้ด้วย:let:

  • let @+=@" - คัดลอกค่าเริ่มต้นลงในคลิปบอร์ด
  • let @*=@" - คัดลอกค่าเริ่มต้นลงในการเลือกหลัก X11 ("คลิปบอร์ดเมาส์")
  • let @+=@a- คัดลอกจากลงทะเบียนaไปยังคลิปบอร์ด
  • เป็นต้น

โปรดทราบว่างานนี้สำหรับการลงทะเบียนโดยทั่วไป: let @a=@bสำเนาลงทะเบียนเพื่อลงทะเบียนba


17

จากhttp://vim.wikia.com/wiki/Accessing_the_system_clipboard

set clipboard=unnamedplus

สิ่งนี้จะเปลี่ยนค่าเริ่มต้น Vim register เป็น+register ซึ่งเชื่อมโยงกับคลิปบอร์ดของระบบ จาก:h clipboard-unnamedplus:

                                        clipboard-unnamedplus
unnamedplus     A variant of the "unnamed" flag which uses the
                clipboard register '+' (quoteplus) instead of
                register '*' for all yank, delete, change and put
                operations which would normally go to the unnamed
                register.  When "unnamed" is also included to the
                option, yank operations (but not delete, change or
                put) will additionally copy the text into register
                '*'.
                Only available with the +X11 feature.
                Availability can be checked with: 
                        if has('unnamedplus')

ทำไมสิ่งนี้ไม่ทำงานสำหรับฉันเมื่อดึงและวางระหว่างอินสแตนซ์กลุ่ม (ในแต่ละเทอร์มินัลเทอร์มิเนเตอร์แยกต่างหาก)
thinwybk

หากคุณอยู่บน Linux และ Vim ได้รับการคอมไพล์ด้วยคุณลักษณะ + X11 และคุณมีคลิปบอร์ด = unnamedplus set คุณควรสามารถดึงบรรทัดหนึ่งในตัวอย่างของ vim แล้ววางลงในอีกตัวอย่างของ vim คุณควรจะสามารถวางลงในแอปพลิเคชันอื่นด้วย CTRL + V หรือ SHIFT + INSERT คุณสามารถใช้:versionภายใน Vim เพื่อดูว่ามี + X11 ปรากฏในรายการคุณลักษณะที่รวมอยู่หรือไม่ นอกจากนี้คุณยังสามารถตรวจสอบว่าคุณสมบัติ 'unnamedplus' สามารถใช้ได้กับ :if has('unnamedplus')⏎ echo 'yes'⏎ endif หากคุณไม่ได้อยู่บน Linux คุณควรใช้ชื่อที่ไม่ได้ใช้แทน unnamedplus
Quincy Bowers

10

บนบิลด์ที่สนับสนุนการลงทะเบียนชื่อ*คือคลิปบอร์ดของระบบ ในการคัดลอกข้อความจาก Vim ไปยังคลิปบอร์ดของระบบคุณสามารถเลือกข้อความโดยใช้โหมดภาพจากนั้นกด"*yเพื่อคัดลอกไปยังคลิปบอร์ดของระบบ

ในทางกลับกันใช้"*pเพื่อวางข้อความจากคลิปบอร์ดของระบบลงในกลุ่ม


5

ฉันแนะนำให้คุณใช้ Gvim และเพิ่มลงในของคุณ.vimrc:

source $VIMRUNTIME/mswin.vim
behave mswin

ซึ่งจะช่วยให้การสนับสนุนสำหรับCtrlC, CtrlX, CtrlVเช่น Notepad ใน Windows

โปรดทราบว่านี้ยังจะเพิ่มบางทางลัดอื่น ๆ ของ Windows ทั่วไปเช่นCtrlSสำหรับ:w, CtrlAสำหรับการเลือกทั้งหมด ฯลฯ


0

หากเสียงเรียกเข้าของคุณไม่รองรับ+clipboardคุณสามารถใช้ปลั๊กอินfakeclipสำหรับ Linux, Mac, Windows, tmux, หน้าจอ, ...


0

คำตอบอื่น ๆ ได้ครอบคลุมสิ่งสำคัญทั้งหมดเกี่ยวกับการลงทะเบียน ฉันต้องการเพิ่มอีกหนึ่งสิ่งที่ฉันใช้

มีวิธีใน Vim ที่จะคัดลอกข้อความที่เลือกโดยตรงไปยังคลิปบอร์ด ใส่สิ่งนี้ลงในไฟล์vimrcของคุณ:

set guioptions+=a

และด้วยสิ่งนี้เมื่อใดก็ตามที่คุณเลือกข้อความที่จะถูกคัดลอกไปยังคลิปบอร์ดของคุณ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้:help guioptions

BTW นี่สำหรับ gVim เท่านั้น


2
guioptions+=aยังกล่าวถึงในคำตอบของ Carpetsmoker
muru

@muru ใช่ขอโทษ ฉันไม่เคยเห็นแบบนั้นมาก่อน ฉันเพิ่งเห็นมัน
Durga Swaroop

0

คุณยังสามารถใช้คำสั่งโกลบอลเพื่อวางรูปแบบเฉพาะบางอย่างบนคลิปบอร์ด มันจะมีประโยชน์ในสถานการณ์ที่คุณมีข้อมูลกระจัดกระจายในไฟล์และการเผชิญปัญหาด้วยตนเองมีแนวโน้มที่จะเกิดข้อผิดพลาดและเหนื่อยล้า

ขั้นแรกทำความสะอาดการลงทะเบียนที่จะได้รับข้อมูล

:let @a=""

จากนั้นคัดลอกทุกบรรทัดที่มีรูปแบบลงไป

:g/pattern/yank A

ในที่สุดการถ่ายโอนข้อมูล (คัดลอก) ข้อมูลไปยังคลิปบอร์ดของระบบ

:let @+=@a

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

OBS: มันจำเป็นต้องมีการ จำกัด การลงทะเบียนก่อนที่จะใช้มันและการใช้เวอร์ชั่น UPPERCASE ของการลงทะเบียนช่วยให้เราสามารถผนวกเนื้อหาไม่เช่นนั้นจะไม่สามารถใช้งานได้


0

หากคุณไม่สามารถหาวิธี+clipboardทำงานได้ซึ่งฉันไม่สามารถทำได้ด้วยเหตุผลบางอย่างคุณสามารถทำได้

สมมติว่าคุณต้องการคัดลอกเฉพาะส่วนของไฟล์ฉันจะทำshift+ vเพื่อเข้าสู่โหมดแสดงภาพและเน้นเฉพาะบรรทัดที่ฉันต้องการคัดลอก จากนั้นฉันก็ทำสิ่งนี้

# Linux Wayland
:'<,'>w !wl-copy

# Linux Xorg
:'<,'>w !xclip -selection clipboard

คำอธิบาย

  • '<,'> - หมายถึงคุณใช้โหมดภาพเพื่อเลือกช่วง (คุณไม่ได้พิมพ์)
  • w !{cmd}- เขียนช่วงไปยัง stdin ของcmdดูเพิ่มเติมที่:help w_c
  • wl-copyและxclipเป็นโปรแกรมที่คุณสามารถไพพ์ข้อความและจะเพิ่มลงในคลิปบอร์ดระบบของคุณ

นอกจากนี้เมื่อสิ่งนี้อยู่ในประวัติของคุณคุณไม่จำเป็นต้องพิมพ์สิ่งทั้งหมดอีกครั้ง เพียงเลือกโหมดภาพให้พิมพ์wจากนั้นกดขึ้นและคำสั่งควรเติมข้อความอัตโนมัติ นอกจากนี้คุณไม่ต้องใช้โหมดภาพ คุณสามารถตั้งค่าช่วงใดก็ได้ที่คุณต้องการ

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