คุณสามารถจับหรือลบระหว่างวงเล็บใน vi / vim ได้หรือไม่?


129

กำหนดรหัสบรรทัดนี้ใน C:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));

มีวิธีลบหรือดึงจากวงเล็บตัวหนาแรกไปสู่วงเล็บที่ตรงกันหรือไม่? ฉันคิดเกี่ยวกับdf)แต่นั่นจะทำให้คุณได้รับหลังจาก 9.0 เท่านั้น

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

คำตอบ:


168

การเคลื่อนไหวต่างๆ:%

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

ใช้งานได้เนื่องจาก%เป็น "คำสั่งการเคลื่อนไหว" ดังนั้นจึงสามารถใช้ได้ทุกที่ที่กลุ่มต้องการคำสั่งดังกล่าว จาก:help y:

["x]y{motion}       Yank {motion} text [into register x].  When no
                    characters are to be yanked (e.g., "y0" in column 1),
                    this is an error when 'cpoptions' includes the 'E'
                    flag.

โดยค่าเริ่มต้น "item" จะรวมวงเล็บวงเล็บปีกกาความคิดเห็นรูปแบบ C และคำสั่ง precompiler ต่างๆ ( #ifdefฯลฯ )

มีปลั๊กอินสำหรับ "การจับคู่% ขยาย" ที่คุณสามารถค้นหาบนเป็นหน้าแรกของกลุ่ม

คุณสามารถอ่านเอกสารประกอบ%และคำสั่งการเคลื่อนไหวที่เกี่ยวข้องได้โดยเข้าสู่:help various-motionsโหมดคำสั่ง

วัตถุเลือก

มีชุดคำสั่งการเคลื่อนไหวอีกชุดหนึ่งที่คุณสามารถใช้ในโหมดภาพเพื่อเลือกวัตถุข้อความต่างๆ

ในการแก้ปัญหาเฉพาะของคุณคุณต้องดำเนินการดังต่อไปนี้:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                   ^

^สมมติว่าเคอร์เซอร์ของคุณอยู่ในตำแหน่งที่ ป้อนลำดับต่อไปนี้เพื่อเลือกส่วนที่คุณต้องการ:

v2a)

ขั้นแรกให้vเข้าสู่โหมด Visual จากนั้นคุณระบุว่าคุณต้องการ2เพิ่มระดับของค่าประกัน ในที่สุดก็a)เลือก "a block" หลังจากนั้นคุณสามารถใช้dหรือxเพื่อลบ ฯลฯ

หากคุณไม่ต้องการรวม parens ด้านนอกคุณสามารถใช้ "inner block" แทน:

v2i)

ดู:help object-selectรายการคำสั่งที่เกี่ยวข้องทั้งหมด


ขอบคุณ! ฉันรู้เกี่ยวกับ% การสลับระหว่างรายการที่ตรงกัน ไม่รู้ว่ามันมีประโยชน์ในคำสั่งเช่นกัน +1 และได้รับการยอมรับ
romandas

5
ที่น่าสนใจฉันคิดเสมอว่าaหมายถึง "รอบ" มากกว่า "ก" รู้สึกว่ามันเติมเต็ม "ภายใน" ได้ดีขึ้น ไม่ใช่วัน ๆ ไปโดยไม่ได้เรียนรู้สิ่งใหม่ ๆ เกี่ยวกับ Vim
Andrew Marshall

218

เกี่ยวกับอะไรdibหรือdi(.

มันจะลบบล็อกด้านใน (... ) ที่เคอร์เซอร์อยู่

ฉันชอบการเคลื่อนไหวและการเลือกข้อความ - วัตถุ !


10
โชคดีที่คำถามนี้เป็นคำถามแรกเมื่อฉันใช้ Google - ฉันไม่รู้ว่าคำตอบนี้ช่วยฉันได้กี่ครั้ง และฉันก็ลืมมันไปเสมอ… :-(
Konrad Rudolph

16
เป็นไปได้ไหมที่จะลบรวมทั้งวงเล็บ (ครับผมตอบคำถามของฉันเอง: dab=> ลบบล็อก (รวมทั้งวงเล็บของมัน)
bantic

5
ฉันโหวตขึ้น นอกจากนี้หากคุณต้องการคำที่ถูกต้องในวงเล็บทำCIW
พัฒนา Marius Žilėnas

5
+1! ฉันรู้สึกทึ่งเมื่อพบการเคลื่อนไหวของข้อความและวัตถุเมื่อเร็ว ๆ นี้! ไม่ต้องพยายามวางเคอร์เซอร์ในจุดที่ถูกต้องเพื่อดึงข้อความอีกต่อไป: D
กริยา

36

หากต้องการลบสิ่งที่อยู่ในวงเล็บคู่คุณสามารถออกdi(และอนุพันธ์ได้ตลอดเวลา

บันทึก :

ตามที่ @porglezomb แนะนำในความคิดเห็นของเขาคุณสามารถใช้a("พร้อมกับ") แทนi("inside") เพื่อรวมวงเล็บ ดังนั้นการใช้da(ลบภายในทุกอย่าง(และ)รวมถึงและ()

การลบข้อความภายในวงเล็บคู่นอกทันที:

ดังนั้นสำหรับโค้ดบรรทัดนี้

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                ^       ^
                                |       |
                                 \_______\___---> Cursor range

สมมติว่าเคอร์เซอร์ของคุณอยู่ในช่วงเคอร์เซอร์ดังกล่าวข้างต้นคุณสามารถออกคำสั่งต่อไปนี้:

di(   --> Deletes '5.0/9.0'
ci(   --> Substitutes '5.0/9.0'
yi(   --> Yanks '5.0/9.0'

การลบข้อความภายในวงเล็บคู่นอกที่ n:

ในการจับทุกอย่างภายในวงเล็บคู่นอกที่ n ให้เพิ่มnก่อนคำสั่งด้านบน ดังนั้นด้วยตำแหน่งเคอร์เซอร์เดียวกันกับด้านบน

2di(   --> Deletes '(5.0/9.0) * (fahr-32)'
2ci(   --> Substitutes '(5.0/9.0) * (fahr-32)'
2yi(   --> Yanks '(5.0/9.0) * (fahr-32)'

3di(   --> Deletes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3ci(   --> Substitutes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3yi(   --> Yanks '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'

3
คุณควรเพิ่มข้อความที่พูดถึงaในฐานะคู่หูiเนื่องจากน่าจะช่วยคนได้มาก
porglezomp

@romandas นี่ควรเป็นคำถามที่ได้รับการยอมรับ ฉันกำลังค้นหาปัญหาเดียวกันในวันนี้และ @Kevin เป็นคนเดียวที่ให้คำตอบที่เหมาะสม แน่นอนว่าฉันสามารถ "ใช้ผิด" %สำหรับปัญหานี้ได้ แต่ต้องใช้เวลามากกว่านี้และในความคิดของฉันควรใช้สำหรับสถานการณ์ที่ซับซ้อนมากขึ้นเท่านั้น การลบบางสิ่งภายในขอบเขตที่กำหนดนั้นเป็นกรณีการใช้งานที่diสร้างขึ้นสำหรับ
daniel451

19

คุณสามารถใช้d%สำหรับการลบและy%สำหรับการดึง


3
% คือตัวระบุการเคลื่อนไหวสำหรับ "วงเล็บปีกกาหรือวงเล็บปีกกาที่ตรงกัน" ข้อกำหนดการเคลื่อนไหวใด ๆ สามารถจับคู่กับ d และ y (และสิ่งอื่น ๆ อีกมากมาย)
ความวุ่นวาย

10

วางเคอร์เซอร์ของคุณในวงเล็บแรกแล้วกดหรือv%yv%d


3
ที่ดี! % กระโดดไปที่พาเรนที่ตรงกัน คุณยังสามารถใช้ d% และ y% ได้

1
โปรดทราบด้วยว่า 'd%' สามารถเริ่มต้นที่จุดเริ่มต้นของชื่อฟังก์ชันและจะลบการเรียกใช้ฟังก์ชันทั้งหมด นอกจากนี้ยังใช้ได้กับคู่ "{}", "[]" และแม้แต่ "<>"
Jonathan Leffler

@Leffler ขอบคุณสำหรับเคล็ดลับ! และเป็นเรื่องดีที่ทราบว่า% ทำงานในโหมดภาพได้เช่นกัน
strager

3

ลองใช้ ci [block-surrounder]

ในกรณีของคุณให้วางเคอร์เซอร์ไว้ที่ใดก็ได้ระหว่างวงเล็บ 2 อันที่คุณเลื่อนไว้สูงแล้วลองใช้ปุ่ม: ci (


เกือบ การทดสอบนี้ดูเหมือนว่าเคอร์เซอร์จะต้องอยู่ในวงเล็บแรกไม่ใช่ระหว่างและ 'c' คือคำสั่ง change ด้วยเคอร์เซอร์บนวงเล็บเปิด 'di (' จะลบไปยังวงเล็บปิดที่ตรงกันและ 'yi (' yanks.
Richard Neish

ci ทำงานให้ฉันตลอดเวลา สิ่งที่ฉันต้องทำคือตรวจสอบให้แน่ใจว่าเคอร์เซอร์อยู่ระหว่างวงเล็บที่ล้อมรอบบล็อกข้อความที่ฉันต้องการลบ
Justin Nguyen

2

ดังคำตอบของ David Norman กล่าวว่า

วางเคอร์เซอร์ของคุณในวงเล็บแรกแล้วกดหรือv%yv%d

คำอธิบายจากhttp://vimdoc.sourceforge.net/htmldoc/vimindex.html :

แท็กการดำเนินการบันทึกถ่านในโหมดปกติ        
-------------------------------------------------- ----------------------------
| v | v เริ่มโหมดภาพ characterwise
|% | % 1 ค้นหาวงเล็บ (ลอน / สี่เหลี่ยม) ถัดไปบน
                                       บรรทัดนี้และไปที่การจับคู่หรือไปที่
                                       จับคู่วงเล็บความคิดเห็นหรือไปที่การจับคู่
| d | ["x] d {motion} 2 ลบข้อความ Nmove [ลงในบัฟเฟอร์ x]

ซึ่งหมายความว่ามันจะเลือกทุกอย่างระหว่างและรวมทั้งสองวงเล็บ ( %) ในขณะที่แสดงตัวเลือกให้กับคุณสายตา ( v) แล้วงัด / คัดลอกyหรือลบ / ตัดdมัน (ไปยังบัฟเฟอร์เริ่มต้น)

คุณสามารถวาง / วางด้วยpไฟล์.

ทำคำตอบนี้ว่า "สอนตัวเองให้ตกปลา" .


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