ในกลุ่มมีวิธีการลบโดยไม่ใส่ข้อความลงทะเบียนหรือไม่?


470

ใช้เป็นกลุ่มฉันมักจะต้องการแทนที่บล็อกของรหัสด้วยบล็อกที่ฉันเพิ่งกระชาก

แต่เมื่อฉันลบบล็อคของรหัสที่จะถูกแทนที่บล็อกนั้นจะเข้าสู่การลงทะเบียนซึ่งจะลบบล็อกที่ฉันเพิ่งกระชาก ดังนั้นฉันจึงมีนิสัยที่จะดึงแล้วใส่แล้วลบสิ่งที่ฉันไม่ต้องการ แต่ด้วยรหัสบล็อกขนาดใหญ่นี้จะยุ่งพยายามเก็บบล็อกแทรกและบล็อกเพื่อแยกต่างหาก

ดังนั้นวิธีที่ลื่นและเร็วที่สุดในการแทนที่ข้อความใน Vim คืออะไร?

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

1
vim-easyclip ( github.com/svermeulen/vim-easyclip ) ได้รับการออกแบบมาเพื่อแก้ไขปัญหาที่แน่นอนนี้
Steve Vermeulen

1
ฉันถามคำถามโดยไม่รู้ตัว (ในเวลานั้น) ซ้ำกับปัญหาจริงของคุณแต่ไม่ค่อยมีคำถามชื่อเรื่อง TL; DR - แทนที่ด้วยสิ่งที่คุณดึงใช้viwp(สำหรับwอ๊อด)
OJFord

คำตอบ:


429

หากต้องการลบบางอย่างโดยไม่บันทึกไว้ในการลงทะเบียนคุณสามารถใช้ "การลงทะเบียนหลุมดำ":

"_d

แน่นอนว่าคุณสามารถใช้รีจิสเตอร์ตัวอื่นที่ไม่สนใจสิ่งใดก็ได้


4
ตอนแรกฉันคิดว่าคำสั่งนี้ทำงานไม่ถูกต้อง จากนั้นฉันก็รู้ว่าฉันใช้คีย์บอร์ดแบบอเมริกัน "เดดคีย์" "<space>_dด้วยรูปแบบแป้นพิมพ์นี้ผมต้องประเภท จำเป็นต้องใช้พื้นที่เพื่อพิมพ์ "
Sebastián Grignoli

4
มีแนวคิดใดบ้างในการทำสิ่งนี้ในบรรทัดว่างเปล่า? (ถ้าฉันddอยู่บนเส้นที่ว่างเปล่ามันจะเข้าสู่หลุมดำมิฉะนั้นมันก็ddเหมือนปกติ)
Jonathan Dumaine

6
ในการลบอักขระหนึ่งตัวให้ลอง:"_x
kenorb

54
นี่คือพื้นที่หนึ่งที่โปรแกรมแก้ไขข้อความมาตรฐานชนะ คุณเพียงกดปุ่มลบ
Vince Panuccio

22
นอกจากนี้คุณยังสามารถดึงบางสิ่งด้วยyyหรือ '3yy' (หรืออะไรก็ได้) ซึ่งวางไว้ในการลงทะเบียนที่ไม่มีชื่อ แต่ยังอยู่ใน 0 จากนั้นคุณสามารถวางมันต่อไป"0pได้แม้จะถูกใช้งานdหลังจากนั้น
Halfgaar

102

อ๋อ มันซับซ้อนกว่าการลบข้อความ "เก่า" เล็กน้อยก่อน แต่:

ฉันเริ่มต้นด้วย ..

line1
line2
line3
line4

old1
old2
old3
old4

I shift+ vเลือกบรรทัด 1, บรรทัด 2, 3 และ 4 และลบออกด้วยdคำสั่ง

จากนั้นฉันก็ลบเส้นเก่า 1-4 บรรทัดด้วยวิธีเดียวกัน

จากนั้นทำ

"2p

นั่นจะเป็นการวางบรรทัดที่ดึงลงมาครั้งที่สอง (บรรทัด 1-4) "3pจะทำที่สามจาก - ล่าสุดและอื่น ๆ ..

ดังนั้นฉันจะจบลงด้วย

line1
line2
line3
line4

การอ้างอิง: เอกสารเป็นกลุ่มในการลงทะเบียนหมายเลข


หากคุณเลือกบรรทัดที่มี <Shift-v> คุณจะลบบรรทัดเหล่านั้นด้วย d ไม่ใช่ไม่ใช่ dd
Heikki Naski

31
1 ถึง 9 ใช้งานได้สำหรับการลบ ในการวางสิ่งสุดท้ายกระชากจริงๆ (กับ 'Y') คุณต้องใช้ "0p นั่นเป็นประโยชน์ในกรณีที่คุณเป็นครั้งแรก yanks บางสิ่งบางอย่างที่มีความประสงค์ที่จะเปลี่ยนเป็นอย่างอื่น แต่แล้วอย่างอื่นจะเขียนทับวางเริ่มต้นลงทะเบียน..
ราฟาเอลเดอเอฟ Ferreira

สำหรับข้อมูลเพิ่มเติมยกเลิกความซับซ้อนตรวจสอบGundo (ยกเลิกกราฟิก) สคริปต์
Lumi

@ RafaeldeF.Ferreira: ความคิดเห็นของคุณไม่ใช่คำตอบสำหรับคำถามนี้ แต่จริง ๆ แล้วมันอาจจะแก้ปัญหาที่เกิดขึ้นจริงที่นำไปสู่การ OP ถามคำถามในสถานที่แรก สำหรับฉันนั่นเป็นปัญหาที่แท้จริง
0xc0de

76

เอกสาร VIM: การลงทะเบียนหมายเลข 0 มีข้อความจากคำสั่ง yank ล่าสุดยกเว้นว่าคำสั่งระบุการลงทะเบียนอีกครั้งด้วย ["x]

เช่นเราดึง "foo" และลบ "bar" - รีจิสทรี 0 ยังคงมี "foo"! ดังนั้น "foo" สามารถวางโดยใช้"0p


53

การทำแผนที่ง่าย ๆ ช่วยให้คุณแทนที่การเลือกปัจจุบันด้วยบัฟเฟอร์ได้อย่างง่ายดาย

ตัวอย่างเช่นเมื่อคุณใส่สิ่งนี้ลงใน. vimrc ของคุณ

vmap r "_dP       // it's a capital 'p' on the end

จากนั้นหลังจากคัดลอกบางสิ่งลงในทะเบียน (เช่นด้วย 'y') คุณสามารถเลือกข้อความที่คุณต้องการแทนที่และเพียงกด 'r' บนแป้นพิมพ์ การเลือกจะถูกแทนที่ด้วยการลงทะเบียนปัจจุบันของคุณ

คำอธิบาย:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste

1
สำหรับรุ่นขั้นสูงเพิ่มเติมให้ตรวจสอบ: stackoverflow.com/questions/290465/…
Luc Hermitte

ฉันต้องการใช้vmap <C-P> "_dP
Harry Lee

7
คุณสามารถใส่ข้อความโดยไม่ลบการเลือก ตัวอย่างเช่นVpแทนที่บรรทัดปัจจุบันของคุณด้วยหนึ่งแยงทันที
Bobby Marinoff

วิธีนี้ไม่ได้แก้ไขปัญหาdที่ถูกใช้บ่อยในการลบ
Victor Yarema

35

ฉันใส่สิ่งต่อไปนี้ใน vimrc ของฉัน:

noremap  y "*y
noremap  Y "*Y
noremap  p "*p
noremap  P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P

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


6
แทนที่จะทำการแมปใหม่ทั้งหมดคุณสามารถset clipboard=unnamedหรือset clipboard=unnamedplusเปลี่ยนคลิปบอร์ดเริ่มต้นเป็น*หรือ+ตามลำดับ
Steve

5
@Steve หากคุณทำเช่นนั้น d จะเขียนทับการดึงข้อมูลล่าสุดไปยังคลิปบอร์ดที่ลงทะเบียนด้วยซึ่งเป็นคำถามที่พยายามหลีกเลี่ยง
79E09796

1
@ 79E09796 ฉันไม่ได้ตั้งใจจะบอกเป็นนัยว่ามันจะ; ฉันแสดงความคิดเห็นกับคำตอบนี้ไม่ใช่คำถามเดิม
Steve

1
ฉันใส่สิ่งเหล่านี้ลงใน. vimrc ของฉันและตอนนี้ yanking ไม่ทำงาน มีความคิดอะไรไหม
tba

2
@tba แทนที่ noremap ด้วย nnoremap (สอง n's) และควรทำงานได้ดี
meain

24

สำหรับตัวอย่างเฉพาะที่คุณให้ถ้าฉันเข้าใจคำถามนี่อาจเป็นไปได้:

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)

6
สิ่งนี้ทำงานได้ดียกเว้นเมื่อคุณต้องการวางมากกว่าการเลือกหลายรายการ

23

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

กล่าวอีกนัยหนึ่งการลบจะเขียนทับงัดที่ล่าสุดในการลงทะเบียนที่ไม่มีชื่อ แต่ก็ยังคงอยู่ในการ0ลงทะเบียน blackhole-register trick ( "_dd) ที่กล่าวถึงในคำตอบอื่น ๆ ใช้งานได้เพราะป้องกันการเขียนทับการลงทะเบียนที่ไม่มีชื่อ แต่ไม่จำเป็น

คุณอ้างอิงการลงทะเบียนโดยใช้เครื่องหมายคำพูดคู่ดังนั้นการวางข้อความ yanked ล่าสุดสามารถทำได้ดังนี้:

"0p

นี่คือการอ้างอิงที่ดีเยี่ยม:


16

เพื่อเน้นสิ่งที่EBGreen พูด :

หากคุณวางในขณะที่เลือกข้อความข้อความที่เลือกจะถูกแทนที่ด้วยข้อความที่วาง

หากคุณต้องการคัดลอกข้อความบางส่วนแล้ววางในหลายตำแหน่งใช้"0pเพื่อวาง การลงทะเบียนหมายเลข 0 มีข้อความจากคำสั่ง yank ล่าสุด


นอกจากนี้คุณสามารถแสดงรายการเนื้อหาของการลงทะเบียนทั้งหมดของคุณ:

:registers

คำสั่งที่ทำให้มันง่ายที่จะคิดออกว่าคุณต้องการลงทะเบียนเมื่อทำสิ่งที่ต้องการคำตอบของ DBR นอกจากนี้คุณจะเห็น /,%, # register (ดูเพิ่มเติมที่:help registers)


และสุดท้ายตรวจสอบcWและcWเปลี่ยนคำรวมถึงและไม่รวมถึงพื้นที่ต่อท้าย (การใช้เงินทุนWรวมถึงเครื่องหมายวรรคตอน)


10

หากคุณใช้ Vim คุณจะมีโหมดภาพซึ่งเหมือนกับการเลือก แต่ด้วยโหมดการแยกซึ่งเป็นพื้นฐานของ vi / vim

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

ตัวอย่าง:

ในไฟล์ข้อความด้วย:

1 | qwer
2 | asdf
3 | zxcv
4 | poiu

ตามลำดับต่อไปนี้ggVjyGVkpคุณจะลงท้ายด้วย:

1 | qwer
2 | asdf
3 | qewr
4 | asdf

อธิบาย:

  • gg: ไปที่บรรทัดแรก
  • V: เริ่มโหมดภาพด้วยเส้นทั้งเส้น
  • j: ลงหนึ่งบรรทัด (เมื่อการเลือกเริ่มต้นที่บรรทัดก่อนหน้าสิ่งนี้จะเพิ่มการเลือกลงหนึ่งบรรทัด)
  • y: งัดไปที่บัฟเฟอร์เริ่มต้น (ทั้งสองบรรทัดที่เลือกและมันจะออกจากคุณโดยอัตโนมัติจากโหมดภาพ)
  • G: ไปที่บรรทัดสุดท้าย
  • V: เริ่มโหมดภาพ (เหมือนเมื่อก่อน)
  • k: ขึ้นไปหนึ่งบรรทัด (เหมือนเมื่อก่อนด้วยโหมดภาพที่เปิดใช้งานสิ่งนี้จะเพิ่มการเลือกขึ้นหนึ่งบรรทัด)
  • p: วาง (ด้วยการเลือกในสองบรรทัดสุดท้ายมันจะแทนที่บรรทัดเหล่านั้นด้วยสิ่งที่อยู่ในบัฟเฟอร์ - 2 บรรทัดแรกในกรณีนี้)

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

หากคุณใช้ vi เท่านั้นคุณจะต้องใช้เครื่องหมายที่มองไม่เห็นแทนโหมดภาพ:he markสำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ฉันขอโทษ แต่ฉันไม่ดีกับสิ่งที่มองไม่เห็นเครื่องหมายนี้ฉันค่อนข้างปนเปื้อนด้วยโหมดภาพ


10

สำหรับ 'แทนที่คำ' ให้ลองcwในโหมดปกติ

สำหรับ 'แทนที่ย่อหน้า' ให้ลองcapในโหมดปกติ


1
สำหรับ 'แทนที่ถึงย่อหน้าถัดไป' ลองc}ในโหมดปกติ
jabirali

ทำไม "cap" ถึงทำเช่นนี้? "a" และ "p" ไม่ใช่ "append" และ "paste" ใช่หรือไม่
WiSaGaN

2
@WiSaGaN "ap" ย่อมาจาก "a ย่อหน้า": vimhelp.appspot.com/motion.txt.html#object-select
Swaroop CH

9

วิธีการแก้ปัญหาการบุกรุกน้อยที่สุดสำหรับคนขี้เกียจ:

การลงทะเบียน0มักจะมีการดึงเอาไว้ล่าสุด (เช่นRafael , alex2k8และidbriiได้กล่าวถึงแล้ว) น่าเสียดายที่การเลือกลงทะเบียน0ตลอดเวลานั้นค่อนข้างน่ารำคาญดังนั้นมันจะดีถ้าpใช้เป็น"0ค่าเริ่มต้น สามารถทำได้โดยใส่บรรทัดต่อไปนี้ใน.vimrc:

noremap p "0p
noremap P "0P
for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    execute 'noremap "'.s:i.'p "'.s:i.'p'
    execute 'noremap "'.s:i.'P "'.s:i.'P'
endfor

บรรทัดแรกแผนที่แต่ละจังหวะp "0pอย่างไรก็ตามสิ่งนี้ป้องกันไม่ให้pเข้าถึงการลงทะเบียนอื่น ๆ ดังนั้นpลายเส้นทั้งหมดที่มีการลงทะเบียนที่เลือกไว้อย่างชัดเจนจะถูกแมปกับนิพจน์บรรทัดคำสั่งที่เทียบเท่าภายใน for-loop Pเช่นเดียวกับที่จะทำเพื่อ

วิธีนี้จะรักษาลักษณะการทำงานมาตรฐานไว้ยกเว้นนัยpและPจังหวะซึ่งขณะนี้ใช้การลงทะเบียน0โดยค่าเริ่มต้น

คำแนะนำที่ 1:คำสั่งตัดอยู่ในขณะนี้แทนเพียง"0d dแต่เนื่องจากฉันขี้เกียจนี่นานเกินไปสำหรับฉัน;) ดังนั้นฉันจึงใช้การทำแผนที่ต่อไปนี้:

noremap <LEADER>d "0d
noremap <LEADER>D "0D

คีย์ผู้นำ\โดยค่าเริ่มต้นเพื่อให้คุณสามารถตัดข้อความได้อย่างง่ายดายโดยการพิมพ์หรือ\d\D

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

set timeout timeoutlen=3000 ttimeoutlen=100

7

ก่อนอื่นให้ทำคำสั่งนี้:

:h d

จากนั้นคุณจะรู้ว่าคุณสามารถลบการลงทะเบียนที่เฉพาะเจาะจง ด้วยวิธีนี้คุณจะไม่เปลี่ยนแปลงสิ่งที่อยู่ในการลงทะเบียนเริ่มต้นของคุณ


1
["x]d{motion} Delete text that {motion} moves over [into register x]- เป็นกลุ่ม:h d
Wes Turner

5

สถานการณ์ของฉัน: ในNormalโหมดเมื่อฉันลบอักขระโดยใช้xปุ่มกดการลบเหล่านั้นจะเขียนทับการลงทะเบียนล่าสุดของฉัน - การแก้ไขที่ซับซ้อนซึ่งฉันต้องการลบอักขระโดยใช้xและวางสิ่งที่ฉันมีในการลงทะเบียนล่าสุดของฉัน (เช่นการวางข้อความเดียวกัน สถานที่เพิ่มเติม)

ฉันลองคำแนะนำในคำตอบที่ยอมรับได้ ( "_d) แต่มันไม่ทำงาน

อย่างไรก็ตามจากคำตอบ / ความคิดเห็นที่ยอมรับได้ที่/vi/122/performing-certain-operations-without-clearing-registerฉันได้เพิ่มสิ่งนี้ลงไป~/.vimrcซึ่งใช้งานได้ (คุณอาจต้องรีสตาร์ท Vim ):

nnoremap x "_x

นั่นคือตอนนี้ฉันสามารถใช้คำสั่งyank ( y), delete ( d) และ paste ( p) ปกติ - และอักขระที่ฉันลบโดยxไม่ต้องเติมการลงทะเบียนล่าสุดอีกต่อไป


4

ข้อความถูกลบขณะอยู่ในโหมดแทรกจะไม่เข้าสู่การลงทะเบียนเริ่มต้น


2
แต่การลบข้อความจำนวนมากในโหมดเริ่มต้นคือช้า
Hamish Downer

3

โซลูชันสองข้อที่ฉันใช้ในบริบทที่ถูกต้องคือ

  • เน้นสิ่งที่คุณต้องการแทนที่ด้วยVISUALโหมดVims แล้ววางลงทะเบียน

ฉันใช้สิ่งนี้ส่วนใหญ่เป็นนิสัยเพราะฉันเพิ่งพบทางออกที่สองในภายหลังเช่น

yiw   " yank the whole word
viwp  " replace any word with the default register
  • YankRing ด้วยปลั๊กอินนี้คุณสามารถใช้การเชื่อมโยงคีย์<ctrl>+<p>เพื่อแทนที่การลงทะเบียนหมายเลขก่อนหน้าด้วยสิ่งที่คุณเพิ่งวาง

โดยทั่วไปคุณจะไปเกี่ยวกับการวางตามที่คุณต้องการ แต่เมื่อคุณรู้ว่าคุณมีตั้งแต่เขียนทับการลงทะเบียนเริ่มต้นจึงสูญเสียสิ่งที่คุณต้องการวางจริงคุณสามารถ<C-P>ค้นหาและแทนที่จากประวัติ YankRing!

หนึ่งในนั้นต้องมีปลั๊กอิน ...


3

ฉันพบการทำแผนที่ที่มีประโยชน์มากสำหรับจุดประสงค์ของคุณ:

xnoremap p "_dP

ข้อความที่ถูกลบจะอยู่ใน "การลงทะเบียนหลุมดำ" และข้อความที่ถูกดึงยังคงอยู่

ที่มา: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text


2

ในรุ่น windows (อาจเป็นใน Linux ด้วย) คุณสามารถดึงเข้าไปในบัฟเฟอร์การคัดลอก / วางของระบบโดยใช้"*y(เช่นก่อนหน้าคำสั่ง yank ด้วยเครื่องหมายคำพูดคู่และเครื่องหมายดอกจัน)

"*pจากนั้นคุณสามารถลบเส้นถอดเปลี่ยนได้ตามปกติและวางข้อความที่คัดลอกโดยใช้


2

ฉันมักจะทำผิดพลาดเมื่อทำตามคำสั่งเพื่อ 'y'ank แล้ว' "_d'elete เข้าไปในหลุมดำแล้ว 'p'aste ฉันชอบ' y'ank แล้วลบ แต่ฉันชอบแล้ว '' 0p 'จาก 0 register ซึ่งเป็นตำแหน่งที่ข้อความที่คัดลอกล่าสุดถูกส่งไป


2

สำหรับผู้ใช้ emacs-evil ฟังก์ชัน(evil-paste-pop)สามารถถูกทริกเกอร์หลังจากวางและวนรอบรายการก่อนหน้าใน kill-ring สมมติว่าคุณผูกไว้กับ<C-p>(เป็นค่าเริ่มต้นใน Spacemacs) คุณจะถูกpตามด้วยจำนวน<C-p>ที่ต้องการ


1

สำหรับผู้ใช้ Dvorak วิธีหนึ่งที่สะดวกมากคือการลบข้อความที่ไม่ต้องการลงใน "1 register แทน" _ หลุมดำลงทะเบียนถ้าเพียงเพราะคุณสามารถกด "+ 1 ด้วยการกด Shift เดียวกันและการเคลื่อนไหว Pinky ที่รวดเร็วตั้งแต่ 1 คือ กุญแจที่อยู่เหนือ "ใน Dvorak (บวก d อยู่ในอีกทางหนึ่งซึ่งทำให้คำสั่งทั้งหมดเร็วเหมือนนรก)

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


1

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

คุณสามารถใช้วิธีแก้ปัญหาต่อไปนี้ซึ่งเป็นเรื่องง่ายและทำงานได้ดีที่สุดสำหรับฉัน:

xnoremap <expr> p 'pgv"'.v:register.'y'

มันมาจากคำตอบ (และความคิดเห็น) ที่นี่: วิธีการวางโดยไม่ต้องลงทะเบียนแทนที่

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

PS: ถ้าคุณต้องการตัวแปรที่ง่ายกว่าซึ่งทำงานได้กับปลั๊กอินความคิด intellj คุณสามารถใช้สิ่งนี้ (ข้อเสีย: เขียนทับการลงทะเบียนที่ไม่มีชื่อแม้ว่าจะมีการลงทะเบียนอีกครั้งสำหรับการวาง):

vnoremap p pgvy


1

สำหรับผู้ที่ใช้ JetBrans IDE (PhpStorm, WebStorm, IntelliJ IDEA) กับ IdeaVim คุณอาจจะประสบปัญหากับการแมปที่ชอบและใช้มันเพื่อลบบรรทัดnnoremap d "_d ddทางออกที่เป็นไปได้สำหรับคุณ:nnoremap dd "_dd

มีปัญหาเกี่ยวกับ youtrack โปรดลงคะแนนให้พวกเขา: https://youtrack.jetbrains.com/issue/VIM-1189 https://youtrack.jetbrains.com/issue/VIM-1363


0

การตั้งค่าความซับซ้อนเป็นครั้งคราวเป็นกลุ่มของ Vim สำหรับความซับซ้อนมากกว่าการใช้งานจริงเป็นภาระแก่ผู้ใช้ในการใช้การลงทะเบียนเพื่อคัดลอก / ลบการกระทำ - บ่อยครั้งกว่าที่ไม่ต้องการเพียงแค่วางสิ่งที่คัดลอกและ "ลืม"

อย่างไรก็ตามแทนที่จะต่อสู้กับการลงทะเบียนที่ซับซ้อนของกลุ่มให้สะดวกยิ่งขึ้น: เลือกการลงทะเบียน "เริ่มต้น" เพื่อเก็บการลบล่าสุดของคุณ ตัวอย่างเช่นส่งการลบไปยัง d register (เปิด AC ทิ้งไว้สำหรับการใช้งาน ad-hoc; d เป็นตัวช่วยจำที่ดี):

nnoremap d "dd           "send latest delete to d register
nnoremap D "dD           "send latest delete to d register 
nnoremap dd "ddd         "send latest delete to d register
nnoremap x "_x           "send char deletes to black hole, not worth saving
nnoremap <leader>p "dp   "paste what was deleted
nnoremap <leader>P "dP   "paste what was deleted

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


0

การลงทะเบียน 0 ถึง 9 เป็นสิ่งล่าสุดที่คุณดึงหรือตัด ฯลฯ และไม่รวมสิ่งที่ถูกลบ ฯลฯ ดังนั้นหากคุณดึง / ตัดบางอย่างมันอยู่ในการลงทะเบียน 0 ด้วยแม้ว่าคุณจะพูดสิ่งที่ถูกลบทิ้งทั้งวันหลังจากนั้นลงทะเบียน 0 ยังคงเป็นสิ่งสุดท้ายที่คุณดึง / ตัด

yiw #goes ทั้งการลงทะเบียนเริ่มต้นและลงทะเบียน 0

มันกระชากคำที่เคอร์เซอร์อยู่

สิ่งที่ถูกลบและอื่น ๆ จะไปลงทะเบียนเริ่มต้น แต่ไม่ลงทะเบียน 0

ในโหมดมาตรฐาน:

"0p #put เนื้อหาของ register 0

ในโหมดแทรก:

ctrl-r 0 # ใส่เนื้อหาของ register 0

ฉันยังมีเพื่อนคนหนึ่งที่กระชาก / ตัดเพื่อลงทะเบียน x lol เสมอ

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