ลบจนกว่าจะสิ้นสุดด้านขวาของบล็อกด้านในปัจจุบัน


21

สมมติว่าฉันมีรหัสเช่นนี้ ( |แสดงถึงตำแหน่งเคอร์เซอร์ ):

func1(x|, func2(), y); 

ฉันต้องการที่จะได้รับ:

func1(x|);

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

ฉันรู้ว่าฉันสามารถไปด้วยdt).แต่ฉันสงสัยว่ามีวิธีผสมกับสิ่งที่di)ไม่


1
ฉันสนใจที่จะทราบว่ามีวิธีง่าย ๆ ในการ "ลบครึ่งซ้าย / ขวาของบล็อกด้านใน / ด้านนอก" ตามที่คุณถาม แต่เป็นบันทึกด้านข้างฉันอาจจะทำC);ในกรณีนี้โดยเฉพาะ
Shahbaz

1
บางครั้งการ%เคลื่อนไหวสามารถทำสิ่งที่คุณกำลังมองหา (เช่นd%)
alxndr

คำตอบ:



5

การเคลื่อนที่ไปในทิศทางเดียวเท่านั้นในขณะที่วัตถุข้อความมีเพียงสองทิศทางเท่านั้น

ซึ่งหมายความว่าคุณไม่สามารถมี text-object ได้ครึ่งหนึ่งเว้นแต่ว่าคุณจะสร้างโอเปอเรเตอร์ที่รอดำเนินการซึ่งใช้ text-object นั้นภายใต้ประทุนหรือเลียนแบบพฤติกรรมของมัน

ในตัวอย่างของคุณข้อความที่ถูกคลุมไว้i)นั้นมองเห็นได้ง่าย:

func1(x, func2(), y);
      ^^^^^^^^^^^^^

แต่คุณจะบอกให้ Vim ทำงานอย่างไรจากเคอร์เซอร์ไปยังจุดสิ้นสุดของข้อความนั้น? หนึ่งจะต้องสร้างผู้ประกอบการที่กำหนดเองเช่นobi)และoei)(ตัวอย่างกึ่งสุ่ม)

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>

4
จะน่าสนใจในการสร้างการเคลื่อนไหวทั่วไปที่นำมาใช้ใหม่วัตถุข้อความที่กำหนดไว้แล้วรวมกับตำแหน่งเคอร์เซอร์ปัจจุบัน; สำหรับตัวอย่างเช่นแทนที่จะib, imbไปทางขวาและiMbไปทางซ้ายและอื่น ๆ (โดยอัตโนมัติ)
VanLaser

3

สำหรับกรณีนี้ฉันจะทำ dfy

สำหรับกรณีทั่วไป:

  • dT( ลบจากเคอร์เซอร์ไปที่จุดเริ่มต้นของบล็อก
  • vib เลือกส่วนที่เหลือของบล็อกด้านใน
  • p แทนที่บล็อกด้านในด้วยสิ่งที่คุณเพิ่งลบ

คุณสามารถทำให้เป็นแผนที่

 :map K dt(vibp

3

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


เพื่ออธิบายพร้อมตัวอย่างสำหรับ

func1(x|, func2(), y); 

คำสั่งc2f))จะให้

func1(x)|;

ซึ่งในตอนแรกอาจดูสง่างามน้อยกว่าคำตอบอื่น ๆ อย่างไรก็ตามสังเกตว่ากลยุทธ์นี้เป็นสากลและไม่ได้ขึ้นอยู่กับคำจำกัดความของบล็อกใด ๆ


เช่นกับ

<div| class="some-class">text</div>

คำสั่งcf>>จะให้

<div>|text</div>

หรือเมื่อแก้ไขไฟล์ csv เช่น

2016-11-29,question,vi|.stackexchange.com,10435

คำสั่งcf,,จะให้

2016-11-29,question,vi,|10435

บ่อยครั้งที่ฉันใช้สิ่งนี้เพื่อลบสตริงที่เหลือจาก

printf("Hello world| - a boring example\n");

ไปยัง

printf("Hello world\|n");

กับ cf\\

หรือจาก

print("Hello world| - a boring example");

ไปยัง

print("Hello world"|);

cf""กับ


สิ่งนี้จะเปลี่ยนตำแหน่งปัจจุบันไปยังตำแหน่งที่แตกต่างกันเล็กน้อยจากที่ขอและเปลี่ยนเป็นโหมดแทรก แต่ฉันต้องการแบ่งปัน go-to-solution เพื่อลบสิ่งที่เหลือทั้งหมด


1
ปัญหาเกี่ยวกับcfวิธีแก้ไขคือฉันต้องระบุตัวละครที่ฉันต้องการหยุดการลบ คำถามถามว่าจะทำอย่างไรถ้าคุณไม่สามารถเพียงแค่ทำcf)เพราะมีอีก)ก่อนที่)คุณจริงต้องการที่จะเข้าถึง (ตัวอย่างเช่นเมื่อคุณต้องการที่จะเปลี่ยนแปลงfunc(x|, g(x, x), x, x, g(x, x))ไปfunc(x)) โดยทั่วไปฉันอยากจะรู้ว่าฉันจะหลีกเลี่ยงการกดหลัง. cf)
Mateusz Piotrowski

โปรดทราบว่าคุณยังสามารถใช้tแทนการfลบขึ้น แต่ไม่รวมถึงตัวละครที่กำหนดดังนั้นสำหรับตัวอย่างแรกของคุณ ( func1(x|, func2(), y);), d2t)คุณอาจจะเป็นเพียงแค่การใช้งาน ในฐานะที่เป็น @MateuszPiotrowski กล่าวถึงว่ามันไม่ได้เป็นวิธีการแก้ปัญหาทั่วไปและต้องการให้คุณรู้ว่าตัวละครที่คุณต้องการลบ ตามปกติแล้วคุณจะรู้ว่าตัวละครตัวไหนจบบล็อกที่คุณใช้อยู่ในภาษาที่กำหนดนั่นไม่เลวเลย
Haegin

3

เป็นกลุ่มนินจาฟุตปลั๊กอินอาจจะมีสิ่งที่คุณกำลังมองหา จากสิ่งที่ฉันเข้าใจมันสร้างd[และd]เป็น "ลบจากเคอร์เซอร์ไปยังจุดเริ่มต้น / สิ้นสุดของวัตถุข้อความ" ดังนั้นd]i)ควร "ลบจนกว่าจะสิ้นสุดวงเล็บโดยรอบ"

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