VIM แทนที่คำด้วยเนื้อหาของ paste buffer หรือไม่


110

ฉันต้องการแทนที่คำหลายคำในไฟล์และต้องการทำด้วยคำสั่ง vi ไม่ใช่คำสั่ง EX เช่น:%s///g. ฉันรู้ว่านี่เป็นวิธีทั่วไปที่เราแทนที่คำที่ตำแหน่งเคอร์เซอร์ปัจจุบัน: cw<text><esc>แต่มีวิธีดำเนินการกับเนื้อหาของรีจิสเตอร์ที่ไม่มีชื่อเป็นข้อความแทนที่หรือไม่โดยไม่เขียนทับรีจิสเตอร์


8
ความละเอียด: เพื่อความต้องการของฉันในทันทีฉันเคย12ylดึงอักขระ 12 ตัวและ"_cw^r0เพื่อแทนที่คำ จากนั้นฉันก็สามารถใช้.คำสั่งเพื่อทำการแทนที่ซ้ำตลอดทั้งไฟล์
plong

คำตอบ:


127

ฉันกำลังคิดโดย "วาง" คุณหมายถึงทะเบียนที่ไม่มีชื่อ (ดึง / ใส่ / เปลี่ยนแปลง / ลบ / แทนที่) ใช่ไหม (เนื่องจากเป็นคำสั่งที่ถูกเขียนทับโดยคำสั่ง change)

ลงทะเบียนถูกกำหนดโดยการพิมพ์โดยทั่วไป"แล้วชื่อ (ตัวเดียว) ของการลงทะเบียนเช่น"ayนั้น"apจะงัดเข้าไปลงทะเบียนแล้วใส่เนื้อหาของการลงทะเบียนa aเช่นเดียวกันกับคำสั่งเปลี่ยนแปลง ในกรณีนี้ถ้าคุณไม่ต้องการให้ข้อความที่คุณเอามีคำสั่งเปลี่ยนแปลงไปทุกที่คุณสามารถใช้การลงทะเบียนของหลุมดำ:"_ "_cwจากนั้นเมื่ออยู่ในโหมดแทรกคุณสามารถกด ctrl-R ตามด้วยรีจิสเตอร์ที่คุณต้องการ (อาจ") เพื่อใส่เนื้อหาของรีจิสเตอร์นั้น

  • "* - การลงทะเบียนการเลือก (วางปุ่มกลาง)
  • "+ - ลงทะเบียนคลิปบอร์ด (อาจเข้าถึงได้ด้วย ctrl-shift-v ผ่านเทอร์มินัล)
  • "" - ค่าเริ่มต้นของกลุ่ม (ไม่มีชื่อ) ดึง / ใส่ / เปลี่ยนแปลง / ลบ / แทนที่ลงทะเบียน

คำตอบสั้น ๆ : "_cw^R"

แก้ไข: ตามที่คนอื่นแนะนำแน่นอนคุณสามารถใช้การลงทะเบียนอื่นสำหรับการดึง (หรืออะไรก็ได้) ที่ทำให้ข้อความของคุณอยู่ในการลงทะเบียนเริ่มต้น คุณไม่ได้คิดถึงสิ่งนั้นเป็นอันดับแรกเสมอไปดังนั้นจึงเป็นการดีที่จะทำคำสั่งเปลี่ยนแปลงเพียงครั้งเดียวโดยไม่ทำให้มันหายไป แม้ว่ามันจะไม่ปลิวไปเลยก็ตาม มีการลงทะเบียนหมายเลข"0ผ่าน"9:

กลุ่มเติมลงทะเบียนเหล่านี้ด้วยข้อความจากคำสั่งดึงและลบ

รีจิสเตอร์หมายเลข 0 มีข้อความจากคำสั่ง yank ล่าสุดเว้นแต่ว่าคำสั่งจะระบุรีจิสเตอร์อื่นด้วย ["x]

รีจิสเตอร์หมายเลข 1 มีข้อความที่ลบโดยคำสั่งลบหรือเปลี่ยนแปลงล่าสุดเว้นแต่คำสั่งจะระบุรีจิสเตอร์อื่นหรือข้อความน้อยกว่าหนึ่งบรรทัด (ใช้รีจิสเตอร์ลบขนาดเล็กแล้ว) ยกเว้นจะทำสำหรับผู้ประกอบการที่มีคำสั่งลบการเคลื่อนไหวเหล่านี้: %, (, ), `, /, ?, n, N, และ{ }ลงทะเบียน "1 จะถูกใช้เสมอ (ซึ่งเข้ากันได้กับ Vi)" - register ถูกใช้เช่นกันหากการลบอยู่ในบรรทัด

ด้วยการลบหรือการเปลี่ยนแปลงแต่ละครั้ง Vim จะเปลี่ยนเนื้อหาก่อนหน้าของรีจิสเตอร์ 1 เป็นรีจิสเตอร์ 2, 2 เป็น 3 และอื่น ๆ โดยจะสูญเสียเนื้อหาก่อนหน้าของรีจิสเตอร์ 9


1
เอาล่ะคิดว่าฉันได้คัดลอกเอกสารที่ลงทะเบียนไว้ในคำตอบของฉันมากพอแล้วหรือยัง? :help registersมันคือทั้งหมดที่มีอยู่ภายใต้
Cascabel

48

การใช้ข้อมูลในโพสต์นี้ฉันได้สร้างแผนที่ที่เป็นประโยชน์นี้ขึ้น ฉันเลือก 'cp' เพราะมีความหมายว่า "change paste"

nmap <silent> cp "_cw<C-R>"<Esc>

แก้ไข:

นอกจากนี้ฉันยังก้าวไปอีกขั้นและสนับสนุนการเคลื่อนไหวใด ๆ

เพื่อให้ได้คำสั่งที่เทียบเท่ากับด้านบนให้ใช้cpwสำหรับ "change paste word"

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction

<silent> ทำให้มันใช้ไม่ได้สำหรับฉัน ... คิดว่าทำไมถึงเป็นเช่นนั้น? ฉันเป็น n00b ที่การแมปและฟังก์ชัน
Hollister

ปัญหาเดียวคือคุณไม่สามารถเลือกการลงทะเบียนที่จะวางด้วย ... แต่ในกรณีนั้นฉันคิดว่าคุณสามารถ cw และใช้ CTRL + R
Steve Vermeulen

2
อาจมีวิธีที่ดีกว่าในการเพิ่มการตั้งชื่อลงทะเบียน แต่วิธีต่อไปนี้ใช้ได้กับฉัน: nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
Steve Vermeulen

@eventualEntropy ซึ่งใช้งานได้ดีสำหรับการแทนที่เส้นฉันจะทำให้งานนี้เป็นคำแทนเส้นได้อย่างไรฉันยังคงเรียนรู้เป็นกลุ่ม ขอบคุณสำหรับความช่วยเหลือ
Xavitoj Cheema

@XavitojCheema ฉันจำไม่ได้ว่าแสดงความคิดเห็นนั้นด้วยซ้ำฮ่า ๆ แต่ปรากฎว่าฉันได้เขียนปลั๊กอินเพื่อให้ฟังก์ชันนี้ ( github.com/svermeulen/vim-easyclip )
Steve Vermeulen

27

คุณสามารถใช้โหมดภาพของกลุ่มสำหรับสิ่งนี้ เช่นคัดลอกคำ: yeแล้วเขียนทับอีกคำหนึ่งด้วยคำที่คัดลอก:vep


9
วิธีนี้ใช้งานได้ แต่ควรสังเกตด้วยว่าการวางภาพจะเขียนทับบัฟเฟอร์ดึงสำหรับข้อความที่เพิ่งลบไป
ostler.c

24

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

ในทางปฏิบัติเมื่อฉันต้องการแทนที่หนึ่งคำ (ชื่อฟังก์ชัน ฯลฯ ) ด้วยอีกคำฉันจะย้ายไปที่คำหนึ่งเพื่อใช้แทนyiwเพื่อดึงคำภายในไปยังรีจิสเตอร์ที่ไม่มีชื่อจากนั้นย้ายไปที่คำว่า I ' ม. เปลี่ยนและviwpแทนที่ วิธีที่ค่อนข้างรวดเร็วในการแทนที่คำหนึ่งเป็นคำอื่น หากคุณค้นหา ( /) สำหรับคำที่คุณกำลังจะแทนที่เพื่อเข้าถึงคำนั้นคุณสามารถกดnเพื่อไปยังเหตุการณ์ถัดไปที่คุณต้องการแทนที่ เห็นได้ชัดว่าไม่มีการทดแทนการใช้:%s/find/replace/gงาน แต่สำหรับการแทนที่อย่างรวดเร็วสองสามครั้งมันสามารถมีประโยชน์โดยเฉพาะอย่างยิ่งถ้าคุณมีคำใหม่ในทะเบียนแล้ว


4
ฉันแปลกใจว่านี่ไม่ใช่วิธีแก้ปัญหาที่ยอมรับ: ทั้งหมดข้างต้นในขณะที่มีความยืดหยุ่นมากกว่าในบางกรณีขอบมีรายละเอียดมากขึ้นเพียงแค่ 'สลับการลงทะเบียนที่ไม่มีชื่อปัจจุบันในการเลือกที่ใดที่หนึ่ง' ซึ่งเป็นสถานการณ์เดิม ผู้ถามมาที่นี่เพื่อ
ELLIOTTCABLE

1
สิ่งนี้มีประโยชน์และใช้งานง่าย
lacostenycoder

6

หากคุณใช้ชื่อลงทะเบียน (เช่นใช้"ayหรือ"adฯลฯ เพื่อเติมลงทะเบียนวางของคุณ) คุณสามารถทำสิ่งต่างๆเช่น

cw<CTRL-R>a<esc>

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


คุณสามารถใช้การลงทะเบียนเริ่มต้น! ตรวจสอบคำตอบของฉัน
Cascabel

2

คุณหมายถึงบัฟเฟอร์วางระบบหรือรีจิสเตอร์ vi?

หากคุณต้องการใช้บัฟเฟอร์การวางระบบคุณก็ทำได้ดีและสามารถทำได้dw"+P- "เลือกการลงทะเบียนและ"+เป็นบัฟเฟอร์การวางระบบ

มิฉะนั้นให้คัดลอกลงในรีจิสเตอร์ที่ไม่ใช่ค่าเริ่มต้นโดยบอกว่า"ayจะคัดลอกลงในรีจิสเตอร์aจากนั้นแทนที่สิ่งที่ทำdw"aP


ขอบคุณ Hamish ฉันลองแล้ว แต่dwลบช่องว่างต่อท้ายหลังจากสิ่งที่ฉันจะพิจารณา "คำ" ในขณะที่cwเปลี่ยนเฉพาะคำ ด้วยเหตุนี้dwจะไม่ได้ผลสำหรับฉัน
plong

ในกรณีนี้deจะเหมาะกับคุณ - มันจะลบไปที่ท้ายคำนี้ในขณะที่dwจะลบไปที่จุดเริ่มต้นของคำถัดไป
Hamish Downer

1

คุณสามารถใช้ywเพื่อดึงคำจากนั้นคุณสามารถเปลี่ยนคำด้วยคำที่ดึงโดยvipwดึงคำและวางคำที่ดึงก่อนหน้านี้


0

คุณสามารถใช้การลงทะเบียนสำหรับสิ่งนั้น:

ข้อความแทนที่อันดับแรกในการลงทะเบียน <mark some text>"ay

aชื่อทะเบียนอยู่ที่ไหน

จากนั้นคุณสามารถใช้การลงทะเบียนนั้นทดแทนได้

ve"ap


น่าเสียดายที่ฉันไม่สามารถทำซ้ำการดำเนินการวางครั้งสุดท้ายผ่าน.ซึ่งเป็นอีกสิ่งหนึ่งที่ฉันต้องการทำ ขอบคุณแม้ว่า ชื่นชมมาก
plong

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