ฉันจะยกเลิกการวางข้อความเป็นกลุ่มได้อย่างไร


10

TL; DR; เวอร์ชั่น - ฉันจะยกเลิกข้อความที่วางจากบัฟเฟอร์การคัดลอกระบบปฏิบัติการของฉันได้อย่างไรโดยไม่ต้องยกเลิกข้อความอื่น ๆ ที่พิมพ์ลงไปตั้งแต่ฉันเข้าสู่โหมดแทรก?

คำอธิบายอีกต่อไป:

  1. ใส่บางอย่างในบัฟเฟอร์การคัดลอก OS ของคุณ (เช่นเน้นข้อความและทำCommand-cบน Mac)
  2. เข้าสู่โหมดแทรกในกลุ่ม ( i)
  3. พิมพ์บางสิ่ง (เช่นasdf)
  4. โดยไม่ต้องออกจากโหมดแทรกให้วางจากบัฟเฟอร์การคัดลอกของคุณลงในกลุ่ม ( Command-vบน Mac)
  5. ตี escape
  6. พยายามเลิกทำการแปะ ( u)

มันเลิกทำทุกอย่างตั้งแต่ครั้งสุดท้ายที่คุณเข้าสู่โหมดแทรก ในคำอื่น ๆ มันจะลบออกasdfรวมทั้งข้อความทั้งหมดที่ฉันวาง

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

คำตอบ:


4

วิธีหนึ่งคือปล่อยออกมาอย่างชัดเจนและกลับเข้าสู่โหมดแทรกก่อนวาง หากคุณขยายคำสั่ง paste คุณสามารถตั้งค่าการเลิกทำจุดก่อนวางโดยอัตโนมัติ:

" Any text fragment pasted in insert mode should be undone separately, without
" destroying what was typed before.
inoremap <C-R> <C-G>u<C-R>

ด้านบนมีไว้สำหรับi_CTRL-Rคำสั่งในตัว ฉันไม่ทราบวิธีCommand-vการนำไปใช้ใน MacVim แต่<C-G>uการเติม:imapคำสั่งควรบรรลุผลเช่นเดียวกัน


1
ทำงานเหมือนมีเสน่ห์ขอบคุณ! ฉันควรจะติดกับวิธีการเป็นกลุ่มมาตรฐานสำหรับการวาง anyways
Javid Jamae

เพียงแค่เพิ่มสิ่งนี้: :h i_CTRL-G_u(กล่าวคือ "แยกลำดับการเลิกทำเริ่มการเปลี่ยนแปลงใหม่" ในโหมดแทรก)
toraritte

2

ใน MacVim คุณต้องEdit > Pasteยกเลิกการแมปรายการเมนูเพื่อแทนที่ทางลัดจากนั้นคุณสามารถทำการตั้งค่า Cmd-V ใหม่ ( D-vใน MacVim parlance) ไปยังคำสั่งที่เหมาะสมในแต่ละโหมด ฉันเพิ่มสิ่งนี้ลงไป~/.gvimrcและตอนนี้ทุกอย่างทำงานได้อย่างยอดเยี่ยม

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

<C-g>uเป็นสิ่งที่จำเป็นเฉพาะในโหมดแทรกเพื่อแก้ไขประวัติการเลิกทำนั้น noremapและcnoremapเป็นเพียงการเรียกคืนพฤติกรรมวางค่าเริ่มต้นในโหมดปกติและคำสั่ง

ขอบคุณ Ingo Karkat ที่ชี้ให้ฉันไปในทิศทางที่ถูกต้องที่นี่


1

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

ฉันใช้เวลาส่วนใหญ่พยายามแก้ไขปัญหานี้และฉันก็หาเหตุผลในกรณีของฉัน:

อย่าจับคู่คีย์วางกับปุ่มวางที่มีอยู่ในเทอร์มินัล

เช่นCtrl+Shift+Vจะวางใน terminal Konsole ของฉัน แต่ถ้าฉันจะกำหนดคีย์นี้<C-S-v>ใน~/.vimrcการ "ยกเลิกเพียงวางเดียวแทนที่จะน้ำพริกหลาย" จะไม่ทำงาน

ในกรณีของฉันฉันต้องใช้<C-v>แทน<C-S-v>:

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

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

ฉันได้พิสูจน์ข้อสรุปนี้แล้ว 100% โดยตั้งค่าการวางเทอร์มินัลของฉันเป็นCtrl+Vและตอนนี้<C-v>หยุดทำงาน แต่<C-S-v>ทำงาน

โปรดทราบว่าเสียงเรียกเข้าดังกล่าวนั้นอ่อนไหวและแปลกเกินไป ฉันคิดว่าฉันต้องใช้iแล้ว 2 ปุ่มขวาด้วยตนเองเพื่อให้ทำงานในตำแหน่งเคอร์เซอร์ที่ถูกต้องนั่นหมายความว่าฉันต้องใส่iและ 2 ปุ่มขวาใน~/.vimrcเกินไป กรณีของคุณอาจแตกต่างกัน แต่จุดเดียวกันให้แน่ใจว่าคีย์ + คำสั่งใน ~ / .vimrc 100% ตรงกับสิ่งที่คุณพิมพ์ด้วยตนเอง

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