ข้ามไปยังคำที่ฉันเพิ่งเปลี่ยนไป


12

หากฉันมีดังต่อไปนี้:

function foo(bar) {
    return bar + 1;
}

และฉันจะใช้cwในการเปลี่ยนแปลงครั้งแรกbarที่จะbazฉันจะข้ามไปจับคู่ต่อไปbarเพื่อที่ฉันสามารถใช้.เพื่อให้การเปลี่ยนแปลงเดียวกันได้หรือไม่

ฉันไม่สามารถใช้*เพราะการค้นหาคำปัจจุบันภายใต้เคอร์เซอร์และฉันก็โง่ไม่ได้ค้นหาbarเป็นครั้งแรกดังนั้นnจะไม่ทำงาน

มีวิธีง่ายๆในการค้นหาคำที่เกิดขึ้นต่อไปเหมือนเดิมก่อนที่จะเปลี่ยนหรือไม่

ฉันไม่ต้องการค้นหาและแทนที่เนื่องจากอาจมีเหตุการณ์อื่นเกิดขึ้นbarในไฟล์ของฉันที่ฉันไม่ต้องการเปลี่ยนหรือเพราะมีเพียงสองกรณีbarเท่านั้นและฉันลืมไป:%s/bar/baz/ก่อนที่จะเริ่มและนั่นก็เกินไป ความพยายามอย่างมากในการเปลี่ยนอินสแตนซ์ที่เหลืออยู่เท่านั้น


2
แต่นั่นไม่ได้เป็นไปตามขั้นตอนการทำงานทั้งหมดที่คุณอธิบาย แต่ความเอียงอายช่วยปรับปรุงการ*ค้นหา โดยเฉพาะอย่างยิ่งทำให้*สามารถเลือกคำปัจจุบันโดยไม่ต้องเลื่อนเคอร์เซอร์ของคุณ เมื่อติดตั้งแล้วคุณสามารถทำ*ciwเพื่อวางคำเก่าลงในการค้นหาและเปลี่ยนคำ แล้วคุณสามารถใช้และn .
statox

การกด n จะย้ายคุณไปยังรูปแบบการค้นหาล่าสุดครั้งถัดไป ทำไมคุณไม่ลองดูล่ะ
SibiCoder

... เพราะฉันไม่ได้ค้นหาการเกิดขึ้นครั้งแรกดังนั้นnจะไม่ทำงาน
Roger Lipscombe

คำตอบ:


14

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

/<C-r>"<CR>

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


5

หากต้องการขยายขอบเขตการทำงานให้เป็นแบบสมบูรณ์ ...

หากคุณทำการแก้ไขประเภทนี้ได้มากขึ้นและตระหนักว่าคุณต้องใช้การแก้ไขแบบเดียวกันกับย่อหน้า / ฟังก์ชั่นคุณสามารถใช้"และการ.ลงทะเบียน

ในตัวอย่างของคุณคุณสามารถทำการแก้ไขเริ่มต้นของอาร์กิวเมนต์ หากคุณเข้าสู่โหมดภาพ (ฉันจะใช้ Visual Line เพียงเพื่อให้แน่ใจว่าคุณเลือกทุกอย่างถูกต้อง) จากนั้นใช้การค้นหาและแทนที่

V]] - Visual Line ไปที่ท้ายย่อหน้า / ฟังก์ชั่น

  • : - เนื่องจากคุณอยู่ในโหมดภาพสิ่งนี้จะกลายเป็น :'<,'>
  • s/ - ค้นหา
  • CTRL+ "- รายการสุดท้ายดึง / ลบ (แถบในตัวอย่าง)
  • / - และแทนที่
  • CTRL+ .- การแทรกครั้งล่าสุด (baz ในตัวอย่าง)

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


2

หากคุณไม่รังเกียจที่จะกดชุดค่าผสมที่แตกต่างไปcwจากนั้นฉันเชื่อว่าคุณสามารถได้รับสิ่งที่คุณต้องการได้อย่างง่ายดายโดยการกำหนดทางลัด สิ่งที่คุณสามารถทำได้คือการวางต่อไปนี้

nmap <leader>a "1yiw:let @/=@1^Mciw

ใน.vimrcไฟล์ ของคุณ ทราบว่า ^Mเป็นการจับตัวของผลตอบแทนที่สำคัญและไม่ตัวละครและ^ Mคุณจะได้รับโดยการกดCtrl+ ในโหมดแทรกตามมาด้วยV Enterขณะนี้ด้วยการกำหนดนี้การกด<leader>aจะทำเช่นเดียวกันcwแต่ตอนนี้คำ (ก่อนการเปลี่ยนแปลง) จะอยู่ใน "การลงทะเบียนการค้นหาล่าสุด" ของคุณ (นั่นคือการ/ลงทะเบียน) ดังนั้นการกดnหลังจากที่คุณทำการเปลี่ยนแปลงและส่งกลับ สู่โหมดปกติคุณจะได้รับสิ่งต่อไปนี้ ในทำนองเดียวกันการกดNจะนำคุณไปสู่เหตุการณ์ก่อนหน้า

ทางลัด แน่นอนคุณสามารถเลือกทางลัดที่แตกต่างกว่า<leader>aแต่ฉันเพิ่งพบว่านี่เป็นทางลัดที่เข้าถึงได้ง่ายมาก โดยส่วนตัวแล้วฉันได้ตั้งค่าไว้<leader>เพื่อ,ให้ฉันต้องกด,แล้วตามด้วยaแต่นี่เป็นเพราะฉันไม่ได้ใช้แป้นพิมพ์แบบอเมริกันดังนั้นฉัน\จึงซ่อนตัวอยู่บ้าง (ฉันเชื่อว่า\เป็นค่าเริ่มต้น<leader>)

คำอธิบาย ความคิดนั้นง่ายมาก งัดคำภายใต้เคอร์เซอร์ไปที่ลงทะเบียนค้นหาแล้วทำ/ cwดังนั้นจึงnmap <leader>a "/yciwเป็นสิ่งที่ผมกำลังเล็งหา แต่โชคร้ายที่ฉันไม่คิดว่าคุณสามารถงัดเพื่อลงทะเบียนค้นหาเพื่อการแก้ปัญหาคือการงัดคำภายใต้เคอร์เซอร์ไปที่1ลงทะเบียนตั้งแล้วลงทะเบียนเท่ากับว่าแล้วทำ/ cwดังนั้น"1yiwส่วนที่ yanks คำภายในภายใต้เคอร์เซอร์เพื่อลงทะเบียน1คือ หากคุณไม่ทราบคำศัพท์ภายในคุณสามารถตรวจสอบ:help iwได้ หลังจากนั้น:let @/=@1ตามด้วยการจับภาพของEnterทำให้เนื้อหาของการลงทะเบียนเข้าสู่1 /ณ จุดนี้nและNทำงานเป็นคำถัดไปและก่อนหน้าของคำที่อยู่ใต้เคอร์เซอร์จากนั้น a ciwจะทำเพื่อให้คำที่อยู่ภายใต้เคอร์เซอร์ถูกลบและ Vim จะถูกใส่ในโหมดแทรก

คำต่อคำที่ ฉันเพิ่งรู้ว่าฉันคิดว่าคุณต้องการคำทั้งหมดภายใต้เคอร์เซอร์ไม่ใช่จากจุดของเคอร์เซอร์และบน นี่คือเหตุผลที่ฉันใช้iwแทนwทุกที่ หากไม่เป็นเช่นนั้นคุณควรใช้

nmap <leader>a "1yw:let @/=@1^Mcw

แทน. หากเคอร์เซอร์อยู่บนตัวอักษรตัวแรกของคำนั้นจะไม่มีความแตกต่าง

ข้อจำกัดความรับผิดชอบ การแก้ปัญหานี้อาจจะทำงานได้ไม่ดีถ้าคุณพยายามที่จะใช้ในสิ่งที่มีสิ่งที่แตกต่างจากตัวอักษรเช่นโดยมีขาตั้งเคอร์เซอร์บน\หรือโดยการแทนที่iwโดยiW, ib, isหรือipหรือบางสิ่งบางอย่าง ( แต่ผมไม่ทราบว่าทำไมคุณจะ ต้องการคุณลักษณะนี้ด้วยประโยคทั้งหมด)

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