ตอนนี้ฉันเปลี่ยนมาVIM
จาก TextMate ฉันพบว่า^+W
ในโหมด INSERT มีประโยชน์มาก อย่างไรก็ตามฉันต้องการลบไม่เพียง แต่คำก่อนเคอร์เซอร์ แต่คำหลังหรือรอบเคอร์เซอร์เช่นกัน
ฉันทำ googling แล้ว แต่สิ่งเดียวที่ฉันสามารถค้นหาได้คือ^+W
การลบคำก่อนเคอร์เซอร์
ตอนนี้ฉันเปลี่ยนมาVIM
จาก TextMate ฉันพบว่า^+W
ในโหมด INSERT มีประโยชน์มาก อย่างไรก็ตามฉันต้องการลบไม่เพียง แต่คำก่อนเคอร์เซอร์ แต่คำหลังหรือรอบเคอร์เซอร์เช่นกัน
ฉันทำ googling แล้ว แต่สิ่งเดียวที่ฉันสามารถค้นหาได้คือ^+W
การลบคำก่อนเคอร์เซอร์
คำตอบ:
สิ่งที่คุณควรทำคือสร้าง imap ของคีย์บางตัวให้กับชุดคำสั่งในกรณีนี้คำสั่งจะทำให้คุณเข้าสู่โหมดปกติลบคำปัจจุบันแล้วนำกลับมาใส่ใหม่:
:imap <C-d> <C-[>diwi
imap <C-d> <C-o>diw
ก็เช่นกัน นอกจากนี้ยังไม่ได้สร้างจุดเลิกทำซึ่ง <Esc> ทำอะไรได้บ่อยมาก
โหมดปกติ:
daw : delete the word under the cursor
caw : delete the word under the cursor and put you in insert mode
da)
และci)
ไม่เคยคิดเรื่องนี้!
.vimrc
ไฟล์ของฉันอย่างนั้น nmap <Leader>d daw
และnmap <Leader>c caw
aw
เป็นตัวอย่างหนึ่งของการเลือกวัตถุ คุณสามารถลองเลือกวัตถุในโหมดภาพเพื่อดูว่ามีผลกระทบอะไรบ้าง: vimdoc.sourceforge.net/htmldoc/motion.html#object-select
ฉันคิดว่ามันเป็นเพียง daw
daw - delete a word
a
เป็นคำสั่งAppend text after the cursor [count] times.
แต่วิธีการdaw
ทำงานอย่างไร
d
บอกให้คุณ 'ลบ' 'a' เป็นพารามิเตอร์ชนิดหนึ่งระบุว่าการลบนั้นจะรวมตัวคั่น ในที่สุด 'w' อีกครั้งparameter
หากคุณจะระบุว่าword
หน่วยจะถูกลบ
dw
และdaw
คืออะไร
dw
จะลบจากเคอร์เซอร์ไปที่ท้ายคำขณะที่daw
จะลบทั้งคำพร้อมเว้นวรรค diw
จะลบทั้งคำโดยไม่แตะช่องว่างรอบ ๆ คำ
ด้านล่างใช้งานได้สำหรับโหมดปกติ:ฉันเห็นด้วยกับคำตอบของแดนโอลสันว่าคุณน่าจะอยู่ในโหมดปกติสำหรับการลบส่วนใหญ่ รายละเอียดเพิ่มเติมด้านล่าง
หากเคอร์เซอร์อยู่ในคำว่า:
diw
เพื่อลบในคำ (ไม่รวมช่องว่าง)
daw
เพื่อลบรอบคำ (รวมช่องว่างก่อนคำถัดไป)
dw
หากเคอร์เซอร์อยู่ในช่วงเริ่มต้นของคำว่าเพียงแค่กด
สิ่งนี้สามารถคูณด้วยการเพิ่มตัวเลขปกติสำหรับการเคลื่อนไหวเช่น 2w เพื่อเลื่อนไปข้างหน้า 2 คำดังนั้น d2w จึงลบสองคำ
แทรกโหมด ^ w
แนวคิดของการใช้ hjkl สำหรับการเคลื่อนไหวใน Vim คือการทำงานให้มีประสิทธิภาพมากขึ้นเพื่อให้มือของคุณอยู่ในแถวบ้าน ในตอนท้ายของคำ ^ w ใช้งานได้ดีในการลบคำได้อย่างรวดเร็ว หากคุณเข้าสู่โหมดแทรกให้ป้อนข้อความและใช้ปุ่มลูกศรเพื่อจบตรงกลางคำที่คุณขัดแย้งกับปรัชญาโฮมแถว
หากคุณอยู่ในโหมดปกติและต้องการเปลี่ยนคำคุณสามารถใช้c
(เปลี่ยน) แทนd
(ลบ) หากคุณต้องการเปลี่ยนคำทั้งหมดและเข้าสู่โหมดแทรกอีกครั้งโดยไม่ต้องกดi
เพื่อกลับ เพื่อพิมพ์
คุณหมายถึงเป็นอย่างไร
dw
dw
จะไม่ลบเครื่องหมายยัติภังค์หรือเครื่องหมายวรรคตอนที่ผ่านมา
หากต้องการลบอักขระทั้งหมดระหว่างช่องว่างสองช่องในโหมดปกติ:
daW
หากต้องการลบเพียงหนึ่งคำ:
daw
มันไม่ได้มีลักษณะเหมือนมีใด ๆในตัววิธีที่จะทำในโหมดแทรกซึ่งเป็นคำถามที่ คำตอบอื่น ๆ บางคำตอบถูกต้องสำหรับโหมดปกติรวมทั้งชี้ให้เห็นว่าสามารถสร้างการแมปที่กำหนดเองเพื่อเพิ่มฟังก์ชันการทำงานในโหมดแทรก
สุจริตคุณควรทำการลบในโหมดปกติเป็นส่วนใหญ่ ^ W เป็นระเบียบเรียบร้อยที่จะรู้ แต่ฉันไม่แน่ใจว่าฉันสามารถนึกถึงสถานการณ์ที่ฉันอยากจะทำมากกว่าเอสเพื่อเข้าสู่โหมดปกติและมีคำสั่งการลบที่ทรงพลังกว่าเมื่อต้องการกำจัด
เสียงเรียกเข้านั้นแตกต่างจากตัวแก้ไขอื่น ๆ จำนวนมาก (รวมถึง TextMate) ด้วยวิธีนี้ หากคุณใช้งานอย่างมีประสิทธิภาพคุณอาจพบว่าคุณไม่ได้ใช้เวลามากในโหมดแทรก
ในการลบทั้งคำเคอร์เซอร์ของคุณถูกใช้งานdiw
เพื่อลบทั้งคำเคอร์เซอร์ของคุณเปิดอยู่และทำให้คุณอยู่ในโหมดแทรกciw
หากคุณไม่ต้องการลบทั้งคำ แต่ลบจากตำแหน่งที่คุณอยู่dw/cw
เนื่องจากมีวิธีการลบคำจำนวนมากดังนั้นให้แสดงคำเหล่านั้น
สมมติว่าคุณแก้ไข:
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
โหมดแทรกไม่มีคำสั่งดังกล่าวโชคไม่ดี ใน VIM หากต้องการลบคำทั้งหมดภายใต้เคอร์เซอร์คุณอาจพิมพ์viwd
ในโหมดปกติ ซึ่งหมายถึง " V isual-block ฉัน nner W ord D elete" ใช้ตัวพิมพ์ใหญ่W
เพื่อรวมเครื่องหมายวรรคตอน
คำตอบที่ยอมรับล้มเหลวเมื่อพยายามลบคำซ้ำให้ลองใช้วิธีนี้แทน:
" delete current word, insert and normal modes
inoremap <C-BS> <C-O>b<C-O>dw
noremap <C-BS> bdw
มันแมป CTRL-BackSpace ยังทำงานในโหมดปกติ
สำหรับการลบจำนวนอักขระก่อนเคอร์เซอร์คุณสามารถใช้ X สำหรับการลบจำนวนคำหลังจากเคอร์เซอร์คุณสามารถใช้ dw (ตัวอย่างเช่นสามารถลบคำได้หลายคำโดยใช้ 3dw สำหรับ 3 คำ) สำหรับการลบรอบเคอร์เซอร์โดยทั่วไปคุณสามารถใช้ Daw
ใน vi เก่าให้b
เลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของคำก่อนเคอร์เซอร์w
ย้ายเคอร์เซอร์ไปที่จุดเริ่มต้นของคำหลังจากเคอร์เซอร์e
ย้ายเคอร์เซอร์ที่ท้ายคำหลังจากเคอร์เซอร์และdw
ลบออกจากเคอร์เซอร์ไปยังท้ายคำ
หากคุณพิมพ์wbdw
คุณจะลบคำรอบ ๆ เคอร์เซอร์แม้ว่าเคอร์เซอร์จะอยู่ที่ตำแหน่งเริ่มต้นหรือท้ายคำ โปรดทราบว่าช่องว่างหลังคำจะถือว่าเป็นส่วนหนึ่งของคำที่จะลบ
ไม่แน่ใจเกี่ยวกับการใช้ "ก่อน" และ "หลัง" ของคุณอย่างแน่นอน แต่คุณได้ลองแล้วหรือยัง
dw
?
แก้ไข: ฉันเดาว่าคุณกำลังมองหาบางอย่างที่จะใช้ในโหมดแทรก แปลกพอไม่มีอะไรที่จะพบในเอกสาร ctrl-w ดูเหมือนว่าจะมีทั้งหมด
ฉันทำการแมปสองครั้งเพื่อให้ได้ความสอดคล้องในโหมดแทรกและออกจากโหมดแทรก
:map <'Key of your choice'> caw
:imap <'Key of your choice'> <'Esc'> caw
ฉันต้องการลบไม่เพียง แต่คำก่อนเคอร์เซอร์ แต่คำหลังหรือรอบเคอร์เซอร์เช่นกัน
ในกรณีนั้นโซลูชันที่เสนอโดย 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