วิธีการลบ (ไม่ตัด) ในกลุ่ม?


145

ฉันจะลบบรรทัดโดยไม่ใส่ลงในบัฟเฟอร์เริ่มต้นได้อย่างไร

ตัวอย่าง:

line that will be copied.

line that I want to be substitued with the previous one.

สิ่งที่ฉันพยายามทำ:

yy
dd
p

แต่ Vim จะแทนที่สตริงที่คัดลอกล่าสุดด้วยค่าที่ถูกลบ (cutted) ฉันรู้ว่าฉันสามารถใช้บัฟเฟอร์เหมือน"1yy, ddแล้ว"1pแต่ฉันมักจะลืมที่จะใส่สตริงคัดลอกในบัฟเฟอร์แล้วฉันต้องวางเนื้อหาครั้งแรกของฉัน (สายที่จะถูกคัดลอก) และลบสิ่งที่ฉันต้องการ (สายที่ฉันต้องการ ที่จะถูกแทนที่ด้วยอันก่อนหน้านี้)

ฉันจะลบข้อความใน Vi (m) โดยไม่ต้องคัดลอกได้อย่างไร

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


คำตอบ:


130

ใช้ "หลุมดำลงทะเบียน" "_เพื่อลบบางสิ่ง: "_d.
ใช้"_dPเพื่อวางบางสิ่งบางอย่างและวางไว้เพื่อการวางต่อไป

<C-o>dwสำหรับคำถามที่สองคุณสามารถใช้ <C-o>ถูกใช้เพื่อดำเนินการคำสั่งปกติโดยไม่ต้องออกจากโหมดแทรก

คุณสามารถตั้งค่าการแมปของคุณเองเพื่อบันทึกการพิมพ์แน่นอน ฉันมีสิ่งเหล่านี้:

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP

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

3
ไม่dยัง "ตัด" และpยังคง "วาง" ในขณะที่<leader>dลบจริงและ<leader>pทิ้งข้อความที่เลือกและวางเนื้อหาของการลงทะเบียนเริ่มต้น <leader>pอนุญาตให้ฉันวางข้อความเดียวกันหลาย ๆ ครั้งโดยไม่ต้องใช้ชื่อรีจิสเตอร์
romainl

119

การลงทะเบียนหลุมดำ "_จะทำเคล็ดลับ แต่มีวิธีแก้ปัญหาที่ดีกว่า:

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

ดังนั้นนี่คือคำสั่งที่คุณต้องการใช้ตามตัวอย่างของคุณ:

yy
dd
"0p

1
เยี่ยมมากนี่ควรเป็นคำตอบที่ยอมรับได้ มันง่ายกว่ามากในการระบุการลงทะเบียนด้วยตนเองเมื่อใดก็ตามที่ฉันต้องการวางมากกว่าเพื่อระบุการลงทะเบียนทุกครั้งที่ฉันลบอะไร
JShorthouse

44

นั่นเป็นหนึ่งในสิ่งที่ฉันไม่ชอบเกี่ยวกับเสียงเรียกเข้า ... ฉันลงเอยทำแผนที่ddเพื่อลงทะเบียนหลุมดำใน. vimrc และชีวิตของฉันดีตั้งแต่

nnoremap d "_d
vnoremap d "_d

6
แล้วคุณจะตัดอย่างไร
VitalyB

11
v/Vด้วยxก็ถูกตัด และการตัดด้วยxยังสอดคล้องกับCtrl + xใน OS ใด ๆ
WesternGun

22

การแม็พต่อไปนี้จะสร้าง:

  • d => "ลบ"
  • ผู้นำ d => "ตัด"
nnoremap x "_x
nnoremap d "_d
nnoremap D "_D
vnoremap d "_d

nnoremap <leader>d ""d
nnoremap <leader>D ""D
vnoremap <leader>d ""d

นอกจากนี้ยังเป็นแนวปฏิบัติที่ดีที่จะมีการตั้งค่าคีย์ "ผู้นำ" เป็นจุลภาคเช่น:

let mapleader = ","
let g:mapleader = ","

ตัวอย่างสองตัวนี้จะทำให้ ", d" เป็นคำสั่งตัดใหม่ของคุณ

หากคุณต้องการใช้การจับคู่เหล่านี้กับการกำหนดค่าคลิปบอร์ดระบบที่ใช้ร่วมกันดูรายละเอียดเพิ่มเติมได้ที่https://github.com/pazams/d-is-for-delete


ฉันหวังว่าฉันจะ upvote คำตอบนี้มากกว่าหนึ่งครั้ง - ผมใช้คำตอบ kprobst แต่จากนั้นจะตัดบรรทัดผมใช้ซึ่งเป็นบิตที่ไม่ยั่งยืนบนนิ้วมือของฉันyydd ;-)
Tahir Hassan

1
ความคิดของ Intellij ทำตัวแปลกมากหลังจากนี้ ววไม่มีอะไร , d ไม่ทำอะไรเลย
s1n7ax

ฉันชอบทางออกมาก สิ่งหนึ่งที่ไม่ได้ทำงานสำหรับฉัน - ,ddคือการตัดสายด้วย หลังจากเพิ่มnnoremap <leader>dd ""ddมันเริ่มทำงาน
Alexey

8

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

สำหรับข้อมูลเพิ่มเติมคุณสามารถพิมพ์:help "_หรือ:help deleting


-1
yy
Vx
p

เมื่ออยู่ในโหมดแสดงภาพxจะเป็นการลบการเลือกดังนั้นหากคุณต้องการลบทั้งบรรทัดให้กดปุ่มแรกVเพื่อเลือกบรรทัดในโหมดภาพจากนั้นกดxเพื่อลบการเลือก


3
นี่เป็นการคัดลอกบรรทัดที่ถูกลบไปยังคลิปบอร์ดซึ่งเป็นสิ่งที่ OP ต้องการหลีกเลี่ยง
aVeryStableGenius

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