วิธีแทนที่ข้อความระหว่างเครื่องหมายคำพูดใน vi


106

สมมติว่าฉันมีรหัสบรรทัดนี้:

$query = "SELECT * FROM table";

มีคำสั่งใน vi / vim ที่สามารถลบทุกอย่างได้ทันทีระหว่างเครื่องหมายคำพูดและตำแหน่งเคอร์เซอร์ระหว่างคำสั่งเพื่อให้ฉันเริ่มพิมพ์ได้หรือไม่?

คำตอบ:


182

ใช้ci"ซึ่งหมายความว่า: เปลี่ยนสิ่งที่อยู่ในเครื่องหมายคำพูดคู่

คุณยังสามารถจัดการกับวัตถุข้อความอื่น ๆ ในลักษณะเดียวกันได้เช่น:

  • ci' - เปลี่ยนภายในเครื่องหมายคำพูดเดียว
  • ciw - เปลี่ยนภายในคำ
  • ci( - เปลี่ยนในวงเล็บ
  • dit - ลบภายในแท็ก HTML ฯลฯ

เพิ่มเติมเกี่ยวกับข้อความที่เป็นกลุ่มที่แตกต่างกันวัตถุที่นี่


2
ดูเหมือนว่าเพียงการทำงานกับแต่ไม่vim vi(ไม่แน่ใจ)
Ivan Chau

สำหรับฉันสิ่งนี้ใช้ได้เฉพาะในบรรทัดปัจจุบันเท่านั้นไม่ใช่ที่ใดก็ได้ในเอกสาร
และในที่สุด

คำสั่งใดที่จะทำสิ่งนี้ย้อนหลัง? นั่นคือถ้าคุณต้องการแทนที่ข้อความภายในเครื่องหมายคำพูดที่อยู่หลังเคอร์เซอร์
dtburgess

1
@dtburgess: ทางเดียวคือF"ci".
Eugene Yarmash

ci 'และ ci "ใช้งานได้ดี แต่ ci (ไม่ได้ผลสำหรับฉันใคร ๆ ก็คิดว่าทำไม
Vram Vardanian

24

คุณสามารถเลือกระหว่างเครื่องหมายคำพูดแล้วลบ ( d) เปลี่ยน ( c) ฯลฯ โดยใช้

vi"

ในทำนองเดียวกันคุณสามารถแทนที่วงเล็บปีกกาองค์ประกอบ XML ฯลฯ ได้ดังนี้:

vi(
vi{
vit

หรือเพียงแค่การเปลี่ยนแปลง / ลบทำที่สอดคล้องกันdi", ci"ฯลฯ แทนaสำหรับiพินัยกรรมครอบคลุมองค์ประกอบโดยรอบ (เพื่อให้คุณทำเครื่องหมายหรือเปลี่ยนวงเล็บและเนื้อหาตัวอย่าง)


5

ฉันได้สร้างปลั๊กอินvim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

มีวัตถุข้อความสำหรับคู่คำพูดที่ใกล้เคียงที่สุดทุกประเภทและรองรับคำพูดที่ครอบคลุมหลายบรรทัด ใช้เพียงอย่างเดียวiqหรือaqอนุญาตให้คุณดำเนินการกับเนื้อหาของเครื่องหมายคำพูด single ('), double (") หรือ back (`) ที่ล้อมรอบเคอร์เซอร์อยู่หน้าเคอร์เซอร์หรืออยู่ข้างหลัง (ตามลำดับที่ต้องการ) กล่าวอีกนัยหนึ่งก็คือมันจะกระโดดไปข้างหน้าหรือข้างหลังเมื่อจำเป็นเพื่อเข้าถึงเครื่องหมายคำพูด

ง่ายต่อการทำความเข้าใจโดยดูจากตัวอย่าง (เคอร์เซอร์แสดงด้วย|):

  1. ก่อน: foo '1, |2, 3' bar; หลังจากกดdiq:foo '|' bar
  2. ก่อน: foo| '1, 2, 3' bar; หลังจากกดdiq:foo '|' bar
  3. ก่อน: foo '1, 2, 3' |bar; หลังจากกดdiq:foo '|' bar
  4. ก่อน: foo '1, |2, 3' bar; หลังจากกดdaq:foo | bar
  5. ก่อน: foo| '1, 2, 3' bar; หลังจากกดdaq:foo | bar
  6. ก่อน: foo '1, 2, 3' |bar; หลังจากกดdaq:foo | bar

ตัวอย่างด้านบนมีให้สำหรับอัญประกาศเดี่ยวปลั๊กอินจะทำงานในลักษณะเดียวกันสำหรับเครื่องหมายคำพูดคู่ (") และหลัง (`)

นอกจากนี้คุณยังสามารถใช้ประกอบการอื่น ๆ : ciq, diq, yiq, viqฯลฯ

โปรดดูหน้า github ที่ลิงก์ด้านบนสำหรับรายละเอียดเพิ่มเติม


3

จากภายในคำพูดที่คุณสามารถทำได้

di"

อ่านเป็นลบด้านใน "


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

1
ขอบคุณที่ทราบ! เพียงแค่แสดงให้เห็นว่าฉันควรอ่านสิ่งต่างๆอย่างรอบคอบมากขึ้น :)
Sam Peacey

3

นอกจากคำตอบของ Brian แล้วคุณยังสามารถp(วาง) และy(ดึง) ค่าใหม่ได้ดังนั้นหากคุณต้องการแทนที่ค่าภายในเครื่องหมายคำพูดด้วยค่าอื่นคุณสามารถyi"เลือกสิ่งที่คุณต้องการคัดลอกvi"เพื่อเลือกพื้นที่ได้ ที่คุณต้องการแทนที่แล้วเพียงpเพื่อแทนที่ค่าอย่างถูกต้อง


0

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

T"ct"

ที่ไหน:

T "- เลื่อนกลับหลังอักขระ"

c - เปลี่ยนคำสั่ง

t "- ระบุตำแหน่งสิ้นสุดสำหรับคำสั่ง c ซึ่งควรหยุดการลบอักขระกล่าวอีกนัยหนึ่งคือช่วงที่จะเปลี่ยน

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