ลบคำหลังจากหรือรอบเคอร์เซอร์ใน VIM


212

ตอนนี้ฉันเปลี่ยนมาVIMจาก TextMate ฉันพบว่า^+Wในโหมด INSERT มีประโยชน์มาก อย่างไรก็ตามฉันต้องการลบไม่เพียง แต่คำก่อนเคอร์เซอร์ แต่คำหลังหรือรอบเคอร์เซอร์เช่นกัน

ฉันทำ googling แล้ว แต่สิ่งเดียวที่ฉันสามารถค้นหาได้คือ^+Wการลบคำก่อนเคอร์เซอร์

คำตอบ:


78

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

:imap <C-d> <C-[>diwi

29
": h diw" สำหรับ shrtcts ที่มีประโยชน์มากมาย!
klokop

12
คะแนนโบนัสโบนัสสำหรับการใช้ <Co> มันรันคำสั่งเดียวในโหมดปกติและกระโดดกลับเข้าไปในส่วนแทรกตรงดังนั้นสิ่งที่ต้องการimap <C-d> <C-o>diwก็เช่นกัน นอกจากนี้ยังไม่ได้สร้างจุดเลิกทำซึ่ง <Esc> ทำอะไรได้บ่อยมาก
zelk

<Co> ในโหมดแทรกทำวันของฉัน :)
Lusk116

541

โหมดปกติ:

daw : delete the word under the cursor    
caw : delete the word under the cursor and put you in insert mode 

125
มันมีประโยชน์สำหรับฉันที่จะคิดว่ามันเป็นดอว์: ลบคำแล้วถาม: เปลี่ยนคำ
welbornio

1
พระเจ้าฉันใช้da)และci)ไม่เคยคิดเรื่องนี้!
Sky

1
นั่นคือทองคำ! ทอง! ฉันทำแผนที่เด็กทารกเหล่านี้ใน.vimrcไฟล์ของฉันอย่างนั้น nmap <Leader>d daw และnmap <Leader>c caw
racl101

1
อาจกล่าวได้ว่าawเป็นตัวอย่างหนึ่งของการเลือกวัตถุ คุณสามารถลองเลือกวัตถุในโหมดภาพเพื่อดูว่ามีผลกระทบอะไรบ้าง: vimdoc.sourceforge.net/htmldoc/motion.html#object-select
crantok

103

ฉันคิดว่ามันเป็นเพียง daw

daw - delete a word

1
ฉันรู้ว่านั่นaเป็นคำสั่งAppend text after the cursor [count] times.แต่วิธีการdawทำงานอย่างไร
syntagma

3
@REACHUS อักขระเริ่มต้นdบอกให้คุณ 'ลบ' 'a' เป็นพารามิเตอร์ชนิดหนึ่งระบุว่าการลบนั้นจะรวมตัวคั่น ในที่สุด 'w' อีกครั้งparameterหากคุณจะระบุว่าwordหน่วยจะถูกลบ
vlad-ardelean

2
ความแตกต่างระหว่างdwและdawคืออะไร
AK_

5
@AK_ การตอบกลับล่าช้า แต่หากคุณอยู่ตรงกลางคำdwจะลบจากเคอร์เซอร์ไปที่ท้ายคำขณะที่dawจะลบทั้งคำพร้อมเว้นวรรค diwจะลบทั้งคำโดยไม่แตะช่องว่างรอบ ๆ คำ
Dmiters

67

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

หากเคอร์เซอร์อยู่ในคำว่า:
diwเพื่อลบในคำ (ไม่รวมช่องว่าง)
dawเพื่อลบรอบคำ (รวมช่องว่างก่อนคำถัดไป)

dwหากเคอร์เซอร์อยู่ในช่วงเริ่มต้นของคำว่าเพียงแค่กด

สิ่งนี้สามารถคูณด้วยการเพิ่มตัวเลขปกติสำหรับการเคลื่อนไหวเช่น 2w เพื่อเลื่อนไปข้างหน้า 2 คำดังนั้น d2w จึงลบสองคำ

แทรกโหมด ^ w
แนวคิดของการใช้ hjkl สำหรับการเคลื่อนไหวใน Vim คือการทำงานให้มีประสิทธิภาพมากขึ้นเพื่อให้มือของคุณอยู่ในแถวบ้าน ในตอนท้ายของคำ ^ w ใช้งานได้ดีในการลบคำได้อย่างรวดเร็ว หากคุณเข้าสู่โหมดแทรกให้ป้อนข้อความและใช้ปุ่มลูกศรเพื่อจบตรงกลางคำที่คุณขัดแย้งกับปรัชญาโฮมแถว
หากคุณอยู่ในโหมดปกติและต้องการเปลี่ยนคำคุณสามารถใช้c(เปลี่ยน) แทนd(ลบ) หากคุณต้องการเปลี่ยนคำทั้งหมดและเข้าสู่โหมดแทรกอีกครั้งโดยไม่ต้องกดiเพื่อกลับ เพื่อพิมพ์


42

คุณหมายถึงเป็นอย่างไร

dw

10
ไปงานปาร์ตี้ แต่ dw จะลบจากตำแหน่งปัจจุบันไปยังจุดสิ้นสุดของคำเพื่อลบคำทั้งหมดตั้งแต่ต้นใช้ diw หรือ daw
Dvid Silva

1
dwจะไม่ลบเครื่องหมายยัติภังค์หรือเครื่องหมายวรรคตอนที่ผ่านมา
ccpizza

* หมายเหตุ: นี่จะเขียนทับบัฟเฟอร์ / งัดสุดท้าย นี่เป็นการดำเนินการ 'ตัด' มากกว่าแค่ 'ลบ'
นพ. Mohiuddin Ahmed

23

หากต้องการลบอักขระทั้งหมดระหว่างช่องว่างสองช่องในโหมดปกติ:

daW

หากต้องการลบเพียงหนึ่งคำ:

daw 

20

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

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

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


1
ฉันใช้ ^ วาล็อตส่วนใหญ่เมื่อฉันพิมพ์คำผิด - แทนที่จะกลับไปและเพิ่มตัวอักษรที่หายไป / etc ฉันเพิ่งลบสิ่งทั้งหมดและเริ่มต้นอีกครั้ง .. ไปที่โหมดปกติเพื่อลบคำเดียวดูเหมือนว่าเสีย ของการกดแป้นไม่กี่ .. ตัวอย่างเช่น "ตัวอย่าง wrd [^ w] คำว่า" การกดแป้นพิมพ์น้อยกว่า "ตัวอย่าง wrd [^ c] [dw] [i] คำว่า"
dbr

1
dbr: เขาไม่ได้ขอให้ทำพฤติกรรมพื้นฐาน ^ W แม้ว่า vim นั้นสนับสนุน เขาถูกขอให้ลบคำทั้งหมดในขณะที่อยู่ตรงกลางในขณะที่อยู่ในโหมดแทรกซึ่งเป็นสถานการณ์แปลก ๆ สำหรับกลุ่มและดังนั้นจึงไม่มีคำสั่งให้ทำ คุณสามารถผูก ^ Q เป็น <Esc> ciw ได้ตลอดเวลาถ้าคุณต้องการฟังก์ชั่นการใช้งานจริงๆ โอ้ [i] ใน [^ c] [dw] [i] ซ้ำซ้อนคุณสามารถใช้ [^ c] [ciw]
bfabry

4
"มันดูเหมือนจะไม่มีทาง ... " - มีวิธีนับไม่ถ้วนที่จะทำ - ไม่มีทางที่จะมีในตัว Afaik ในขณะที่ฉันเห็นด้วยอย่างยิ่งกับคำสั่งของ Dan ในโหมดแทรกกับโหมดปกติคุณสามารถกำหนดโหมดการแมปแทรกได้ที่ ": ช่วย imap" ซึ่งทำทุกอย่างที่คุณต้องการเพื่อให้บรรลุถ้าคุณต้องการฟังก์ชั่นในโหมดแทรก
user55400

13

ในการลบทั้งคำเคอร์เซอร์ของคุณถูกใช้งานdiw
เพื่อลบทั้งคำเคอร์เซอร์ของคุณเปิดอยู่และทำให้คุณอยู่ในโหมดแทรกciw
หากคุณไม่ต้องการลบทั้งคำ แต่ลบจากตำแหน่งที่คุณอยู่dw/cw


8

เนื่องจากมีวิธีการลบคำจำนวนมากดังนั้นให้แสดงคำเหล่านั้น

สมมติว่าคุณแก้ไข:

foo-bar quux

และเรียกใช้คำสั่งขณะที่เคอร์เซอร์อยู่ที่ 'a' in 'bar':

foo-bquux  # dw:  letters then spaces right of cursor
foo-quux   # daw: letters on both sides of cursor then spaces on the right 
foo- quux  # diw: letters on both sides of cursor
foo-bquux  # dW:  non-whitespace then spaces right of cursor
quux       # daW: non-whitespace on both sides of cursor then spaces on the right
 quux      # diW: non-whitespace on both sides of cursor

5

โหมดแทรกไม่มีคำสั่งดังกล่าวโชคไม่ดี ใน VIM หากต้องการลบคำทั้งหมดภายใต้เคอร์เซอร์คุณอาจพิมพ์viwdในโหมดปกติ ซึ่งหมายถึง " V isual-block ฉัน nner W ord D elete" ใช้ตัวพิมพ์ใหญ่Wเพื่อรวมเครื่องหมายวรรคตอน


3

คำตอบที่ยอมรับล้มเหลวเมื่อพยายามลบคำซ้ำให้ลองใช้วิธีนี้แทน:

" delete current word, insert and normal modes
inoremap <C-BS> <C-O>b<C-O>dw
noremap <C-BS> bdw

มันแมป CTRL-BackSpace ยังทำงานในโหมดปกติ


ฉันชอบคำตอบนี้ดีกว่าเพียงเพราะมันยังทำงานในโหมดปกติ
sivabudh

2

สำหรับการลบจำนวนอักขระก่อนเคอร์เซอร์คุณสามารถใช้ X สำหรับการลบจำนวนคำหลังจากเคอร์เซอร์คุณสามารถใช้ dw (ตัวอย่างเช่นสามารถลบคำได้หลายคำโดยใช้ 3dw สำหรับ 3 คำ) สำหรับการลบรอบเคอร์เซอร์โดยทั่วไปคุณสามารถใช้ Daw


2

ใน vi เก่าให้bเลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของคำก่อนเคอร์เซอร์wย้ายเคอร์เซอร์ไปที่จุดเริ่มต้นของคำหลังจากเคอร์เซอร์eย้ายเคอร์เซอร์ที่ท้ายคำหลังจากเคอร์เซอร์และdwลบออกจากเคอร์เซอร์ไปยังท้ายคำ

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


2

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

dw

?

แก้ไข: ฉันเดาว่าคุณกำลังมองหาบางอย่างที่จะใช้ในโหมดแทรก แปลกพอไม่มีอะไรที่จะพบในเอกสาร ctrl-w ดูเหมือนว่าจะมีทั้งหมด


2

ฉันทำการแมปสองครั้งเพื่อให้ได้ความสอดคล้องในโหมดแทรกและออกจากโหมดแทรก

:map <'Key of your choice'> caw

:imap <'Key of your choice'> <'Esc'> caw


0

ฉันต้องการลบไม่เพียง แต่คำก่อนเคอร์เซอร์ แต่คำหลังหรือรอบเคอร์เซอร์เช่นกัน

ในกรณีนั้นโซลูชันที่เสนอโดย OP (เช่นใช้<c-w>) สามารถรวมกับคำตอบที่ยอมรับเพื่อให้:

inoremap <c-d> <c-o>daw<c-w>

อีกวิธีหนึ่ง (แก้ปัญหาสั้นลง):

inoremap <c-d> <c-o>vawobd

ตัวอย่างอินพุต:

word1 word2 word3 word4
               ^------------- Cursor location

เอาท์พุท:

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