เป็นกลุ่ม - วิธีการลบกลุ่มของข้อความขนาดใหญ่โดยไม่ต้องนับบรรทัด?


193

ในกลุ่มฉันมักพบว่าตัวเองกำลังลบ (หรือคัดลอก) บล็อกข้อความขนาดใหญ่ หนึ่งสามารถนับบรรทัดของข้อความและพูด (ตัวอย่าง) 50ddเพื่อลบ 50 บรรทัด

แต่จะมีวิธีการลบบล็อคข้อความขนาดใหญ่นี้โดยไม่ต้องรู้ว่าจะต้องลบกี่บรรทัด?


1
ถ้าหน้าต่างมีขนาดใหญ่พอการกำหนดหมายเลขบรรทัดสัมพันธ์จะเป็นประโยชน์ที่นี่ วางเคอร์เซอร์ที่ด้านบนของหน้าต่างค้นหาหมายเลขบรรทัดสัมพัทธ์ของบรรทัดสุดท้ายที่จะลบ (พูด, n), เพิ่มหนึ่งจากนั้นพิมพ์หมายเลขนั้นแล้วพิมพ์ dd เช่นถ้า n = 50 51ddแล้ว หรือใช้คำสั่ง motion -50d<down arrow>
BallpointBen

"ค้นหาหมายเลขบรรทัดสัมพัทธ์" - หรือใช้:set rnuและ Vim จะทำสิ่งนี้ทันที! บรรทัดที่คุณอยู่จะยังคงถูกกำหนดหมายเลขอย่างแน่นอน แต่บรรทัดด้านบนและด้านล่างเคอร์เซอร์จะมีหมายเลข 1, 2, ... (และอัปเดตด้วยการเคลื่อนไหวของเคอร์เซอร์เหตุการณ์ระดับไฟล์ ฯลฯ )
John P

คำตอบ:


287

ฉันไม่มีกูรูที่ไร้ความปรานี แต่สิ่งที่ฉันใช้ในกรณีนี้คือ "โหมดภาพ" ในโหมดคำสั่งพิมพ์V(ตัวพิมพ์ใหญ่) จากนั้นเลื่อนขึ้น / ลงเพื่อไฮไลต์บล็อกที่คุณต้องการลบ (คำสั่งการเคลื่อนไหวตามปกติทั้งหมดใช้งานได้) แล้วเอามันด้วยหรือxd


2
แปลก. ฉันรู้ว่ามันใช้งานได้สำหรับฉัน (tm) ที่นี่บน Linux (vim 7.3.50) และกับ gVim บน Windows และตัดสินโดยคำตอบอื่น ๆ ทำงานเพื่อคนอื่น บางทีการตั้งค่าบางอย่างในตัวคุณ.vimrcกำลังทำอยู่ใช่ไหม
จ้า

ตกลงด้วยเหตุผลบางอย่างฉันไม่ได้ตระหนักว่าคุณสามารถเข้าสู่โหมดภาพโดยใช้Shift- v... ฉันพยายามใช้CTRLกุญแจด้วย ดังนั้นวิธีนี้ใช้งานได้และอาจเป็นวิธีที่สะดวกที่สุด
Justin Ethier

7
คุณอาจต้องการชี้แจงว่ามีโหมดภาพสองโหมด - Visual Line ( CTRL- v) และ Visual Block ( Shift- v)
Justin Ethier

2
ฉันทำสิ่งนี้มาก แต่ฉันมักจะคิดว่ามันโกงและเป็นกลุ่มน้อยกว่าอุดมคติ
Jim Mitchener

9
จริง ๆ แล้วมีโหมดการมองเห็นสามโหมด: โหมด Visual (ตามตัวละคร {v}), โหมดบรรทัด Visual (Line based {Sv}) และโหมดบล็อก Visual (อนุญาตให้เลือกบล็อก {Cv})
Tom Regner

293

ไปที่บรรทัดเริ่มต้นและพิมพ์ma(ทำเครื่องหมาย "a") จากนั้นไปที่บรรทัดสุดท้ายและป้อนd'a(ลบเพื่อทำเครื่องหมาย "a")

ที่จะลบทุกบรรทัดจากปัจจุบันไปยังบรรทัดที่ทำเครื่องหมายไว้ (รวม) นอกจากนี้ยังเข้ากันได้กับviและvimในโอกาสที่สภาพแวดล้อมของคุณไม่ได้รับพรหลัง


3
หินก้อนประหลาดนี้! ฉันเกลียดเวลาที่ฉันทำอะไรบางอย่าง (เช่นการนับจำนวนบรรทัด) ก่อนที่ฉันจะมองหาวิธีแก้ปัญหาที่ดีกว่า ขอบคุณ!
ryanjdillon

1
ยอดเยี่ยมจริง ๆ ฉันมักจะใช้โหมดภาพเพื่อลบการบล็อก แต่วิธีนี้จะดีกว่า +1
hish

4
ฉันพบสิ่งนี้มีประโยชน์มากกว่าโหมดภาพเพื่อลบบรรทัด 500k +
Michael - Where's Clay Shirky

คำตอบที่เป็นประโยชน์จริงๆ ฉันใช้เพื่อลบอีเมลในเซิร์ฟเวอร์ของฉันจากไฟล์/var/mail/usernameเป็นจำนวนมากและปล่อยให้อีเมลฉบับสุดท้ายยังคงอยู่ ฉันทำเครื่องหมายจากนั้นฉันป้อนตัวอย่าง50000แล้วตามด้วยggเพื่อไปที่บรรทัด 50.000 จากนั้นฉันลบทุกบรรทัดในระหว่าง ทำงานเหมือนจับใจ!
otmezger

1
@horta ฉันอาจไม่ได้ใช้vimเป็นเครื่องมือในการแก้ไขไฟล์กิกะไบต์ - ฉันมักจะเลือกใช้เครื่องมือประมวลผลข้อความเช่นawkและพี่น้อง :-)
paxdiablo

46

คุณสามารถใช้โหมดภาพได้ด้วย (คำสั่งบางอย่างสามารถใช้งานได้ด้วยตัวเลือกการลบด้วย) vip vapเพื่อเลือกย่อหน้าv2apเพื่อเลือกการdapทำงานสองย่อหน้า d2apเช่นกัน คุณสามารถลบภายในบล็อกของ[ ]ชอบda[

สำหรับการอ้างอิง: ประเภทของวัตถุ จากเอกสาร vim: ส่วนที่ 4 http://vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a word (with white space)           
iw  inner word                  
aW  a WORD (with white space)           
iW  inner WORD                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  

1
da [, da {, da "ทั้งหมดมีประโยชน์สำหรับโปรแกรมเมอร์
Rene Wooller

1
ขอบคุณ! dapง่ายต่อการจดจำเป็น "ลบย่อหน้า"
Tropilio

38

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

สมมติว่าคุณต้องการลบจากบรรทัด 24-39 คุณสามารถใช้คำสั่ง ex

:24,39d

นอกจากนี้คุณยังสามารถดึงสายโดยใช้

:24,39y

และค้นหาและแทนที่ด้วยการใช้ 24-39 บรรทัด

:24,39s/find/replace/g

11

หากคุณเปิดหมายเลขบรรทัดset numberคุณสามารถทำได้ง่ายๆdNNGซึ่งจะลบบรรทัด NN ออกจากตำแหน่งปัจจุบัน ดังนั้นคุณสามารถนำทางไปยังจุดเริ่มต้นของบรรทัดที่คุณต้องการลบและเพียงแค่d50Gสมมติว่าเป็นบรรทัดสุดท้ายที่คุณต้องการลบ


10

มันขึ้นอยู่กับว่าบล็อกขนาดใหญ่นั้นคืออะไร บางทีคุณอาจต้องการลบย่อหน้าในกรณีที่dipจะทำ


ขอบคุณสำหรับทิป. น่าเสียดายที่ฉันทำงานกับรหัสที่นี่และมักจะต้องการการควบคุมที่ละเอียดยิ่งขึ้นกว่านั้น
Justin Ethier

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

ใช้งานได้เพราะ 'd' หมายถึงลบ 'p' ในบริบทนี้หมายถึงย่อหน้า
user98761

7

มีความเป็นไปได้หลายอย่างสิ่งที่ดีที่สุดขึ้นอยู่กับข้อความที่คุณใช้

ความเป็นไปได้สองประการที่อยู่ในใจ:

  • สลับไปที่โหมดภาพ ( V,S-V ... ) เลือกข้อความที่มีการเคลื่อนไหวของเคอร์เซอร์แล้วกดd
  • ลบทั้งย่อหน้าด้วย: dap

ฉันใช้ dap บ่อยมากตอนนี้ที่ฉันรู้เกี่ยวกับมันและชอบที่จะ dis และ dip แต่มันมักจะลบบล็อกและบรรทัดว่างที่มาหลังจากบล็อก แต่ก็เป็นวิธีที่จะลบบล็อกและบรรทัดว่างที่ มาก่อนหรือไม่
Funkodebat

ในช่วงกลางของข้อความที่มีย่อหน้าจะไม่มีความแตกต่างทางไวยากรณ์ในผลลัพธ์หรือไม่ หากมีฉันแนะนำให้เขียนสิ่งที่คุณต้องการด้วยตัวอย่างในคำถามใหม่
Tom Regner

6

หากมองเห็นบล็อกทั้งหมดบนหน้าจอคุณสามารถใช้การตั้งค่าใหม่ได้ ดู: ช่วย relativenumber พร้อมใช้งานใน 7.3


ฉันไม่ทราบว่ามีประโยชน์อย่างไร: se rnu จนกระทั่งฉันเริ่มใช้มัน - ยอดเยี่ยมสำหรับการรู้ 50dd รวมถึงการนำทาง 50j
rshdev

3

คุณสามารถวางเคอร์เซอร์ของคุณที่จุดเริ่มต้นหรือจุดสิ้นสุดของบล็อกและเข้าสู่โหมดภาพ (shift-v) จากนั้นเลื่อนขึ้นหรือลงจนกว่าจะมีการไฮไลต์บล็อกที่ต้องการ สุดท้ายคัดลอกข้อความโดยกด y หรือตัดข้อความโดยกด d


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

3

ควบคู่ไปกับการเคลื่อนไหวอื่น ๆ ที่กล่าวแล้วที่นี่ยังมี/{pattern}<CR>การเคลื่อนไหวดังนั้นหากคุณรู้ว่าคุณต้องการลบกับสายที่มี foo dV/foo<CR>คุณสามารถทำ Vอยู่ที่นี่เพื่อบังคับให้มีการเคลื่อนไหวแบบ line-wise เพราะโดยค่าเริ่มต้น/คือ characterwise


3

การนับบรรทัดนั้นน่าเบื่อเกินไปสำหรับฉัน แต่การนับ 'ย่อหน้า' นั้นไม่ได้เลวร้ายนัก '{' และ '}' เลื่อนเคอร์เซอร์ไปที่บรรทัดว่างแรกก่อนและหลังเคอร์เซอร์ตามลำดับ การย้ายเคอร์เซอร์สามารถใช้ร่วมกับการลบได้และคำตอบอื่น ๆ อีกมากมายใช้วิธีการที่คล้ายกัน (dd สำหรับบรรทัด, dG สำหรับจุดสิ้นสุดของเอกสาร ฯลฯ )
ตัวอย่างเช่น:

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

หากเคอร์เซอร์ของคุณเริ่มเหนือบล็อกความคิดเห็น 'd}' จะลบบล็อกความคิดเห็นและ 'd2}' จะลบทั้งบล็อกข้อคิดเห็นและบล็อกโค้ด หากเคอร์เซอร์ของคุณเริ่มต้นด้านล่างบล็อครหัสให้ 'd {' ลบรหัสและ 'd2 {' จะลบทั้งคู่ แน่นอนคุณสามารถข้ามบล็อกได้โดยเลื่อนเคอร์เซอร์ก่อน: '{d {' หรือ '} d}'

หากคุณสอดคล้องกับช่องว่างหรือคุณสามารถนับย่อหน้าได้อย่างรวดเร็วการดำเนินการนี้ควรใช้ ไฟล์ช่วยเหลือ Vim มีลูกเล่นเคอร์เซอร์มากขึ้นหากคุณสนใจ


1

คุณสามารถป้อนตัวเลขที่มีขนาดใหญ่มากและกดddถ้าคุณต้องการลบทุกบรรทัดใต้เคอร์เซอร์


มันอาจจะใช้งานได้ง่ายกว่าdGซึ่งจะลบไปที่ท้ายเอกสารเนื่องจากGค่าเริ่มต้นจะไปที่บรรทัดสุดท้าย
andyg0808

1

การลบกลุ่มข้อความ

สมมติว่าเคอร์เซอร์ของคุณอยู่ที่จุดเริ่มต้นของบล็อก:

V/^$<CR>d (where <CR> is the enter/return key)

คำอธิบาย

  • เข้าสู่โหมด "linewise-visual": V
  • ไฮไลต์จนถึงบรรทัดว่างถัดไป: /^$<CR>
  • ลบ: d

การรวมคีย์

โซลูชันที่แข็งแกร่งยิ่งขึ้น:

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

คำอธิบาย

  • ปิดการใช้งาน Wrap การค้นหา: :set nowrapscan
  • ทำการแมปDกุญแจ (ไปยังคำสั่งต่อไปนี้)::nnoremap D
  • เข้าสู่โหมด "linewise-visual": V
  • ไฮไลต์จนถึงบรรทัดว่าง / ช่องว่างถัดไปหรือ EOF: /^\s*$\\|\%$<CR>
  • ลบ: d
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.