เหตุใด ci "สามารถอยู่นอกพื้นที่ที่ยกมาและ ci (ใช้ได้เฉพาะในวงเล็บเท่านั้น?


27

เมื่อใช้ci"เคอร์เซอร์ไม่จำเป็นต้องอยู่ในพื้นที่ที่ยกมาเป็นสองเท่า

|String somestring = "some text";

สมมติว่าท่อเป็นตำแหน่งเคอร์เซอร์ci"จะทำให้มันข้ามไปยังพื้นที่ที่ยกมา

ในทางกลับกันเมื่อใช้ci(เคอร์เซอร์จะต้องอยู่ในวงเล็บเพื่อให้สามารถใช้งานได้และจะไม่ย้ายเคอร์เซอร์ข้างใน

อะไรคือสาเหตุของพฤติกรรมที่แตกต่าง? ฉันคิดว่ามีวิธีการแมปปุ่มเพื่อให้พฤติกรรมนี้มีอยู่ มีข้อบกพร่องในการทำเช่นนี้หรือไม่?


คำตอบ:


25

ความแตกต่างที่สำคัญที่นี่คือคำสั่ง parenthetical (กำหนดเป้าหมายโดยci() สามารถซ้อนในขณะที่สตริงที่ยกมา (กำหนดเป้าหมายโดยci") ไม่สามารถ

หากเคอร์เซอร์ของคุณอยู่นอกคำสั่งแบบ parent บางอันมันอาจยังอยู่ในคำสั่งอื่น ตัวอย่างเช่น ( *ทำเครื่องหมายตำแหน่งเคอร์เซอร์):

$foo = array(
    'x' => ar*ray(1, 2, 3),
);

บรรทัดที่เคอร์เซอร์เปิดอยู่มี(1, 2, 3)แต่เคอร์เซอร์อยู่ภายในarray(...)บล็อกที่ใหญ่กว่า ci(ในกรณีนี้อย่างใดอย่างหนึ่งที่มีขนาดใหญ่เป็นเป้าหมายที่เหมาะสมสำหรับ

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


10

ครอบครัวของวัตถุที่อ้างข้อความ ( i', i", a'และa") มีความแตกต่างกว่าที่เหลือของข้อความวัตถุที่พวกเขาเท่านั้นดูที่บรรทัดปัจจุบัน เนื่องจากสิ่งนี้ตัวเลือกจึงไม่ต้องการให้เคอร์เซอร์อยู่ในเครื่องหมายคำพูด แต่กลุ่มจะค้นหาไปข้างหน้าภายในบรรทัดเพื่อค้นหาสตริงที่มีเครื่องหมายคำพูดเมื่อเคอร์เซอร์ไม่ได้อยู่ข้างใน

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


8

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

wellle / targets.vim ฉันเพิ่งพบปลั๊กอินนี้และฉันคิดว่ามันมีค่าต่ำเกินไป มันมีวัตถุข้อความใหม่: din(Mnemonic:. (ง) หนึ่งคำ (i) nside (n) ต่อ "(" นี้สามารถทำงานร่วมกับผู้ประกอบการและวัตถุอื่น ๆ ที่แตกต่างกันหลายประการเช่นan(, in", il((ในวงเล็บที่ผ่านมา)

นอกจากนี้ยังจะแทนที่พฤติกรรมเริ่มต้นของเพื่อให้รูปลักษณ์ก่อนเพื่อดูว่าเคอร์เซอร์อยู่ในวงเล็บแล้วถ้ามันไม่ได้มันทำงานแบบเดียวกับi( in(พฤติกรรมนี้สามารถเปิดหรือปิด ตัวอย่างเช่น:

def foo(bar):
^cursor here

การพิมพ์ci(จะทำหน้าที่เช่นเดียวกับcin(เนื่องจากเคอร์เซอร์ไม่อยู่ในวงเล็บ

def foo( ):
        ^Cursor here, and in insert mode

สิ่งนี้ยอมรับการนับด้วย:

def foo(bar):           #Define function foo(bar)
^cursor here

พิมพ์ดีดc2in(:

def foo(bar):           #Define function foo( )
                                             ^cursor here

นอกจากนี้ยังมีวัตถุใหม่ "โต้แย้ง" ตัวอย่างเช่นdanaหมายถึง "ลบรอบอาร์กิวเมนต์ถัดไป" นอกจากนี้ยังยอมรับการนับ ตัวอย่างเช่น:

def foo(arg1, arg2, BADarg3):
^ cursor here

พิมพ์ดีดd3ana:

def foo(arg1, arg2):
                  ^ cursor here

มีหลายคุณสมบัติอื่น ๆ ปลั๊กอินนี้มี แต่เหล่านี้เป็นคนที่มีพื้นฐาน


1
ดี! นี่เป็นส่วนเสริมที่ดี ฉันอาจจะต้องตรวจสอบว่า
Reaver

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