เป็นกลุ่ม - ฉันจะทำ 'เปลี่ยนคำ' โดยใช้บัฟเฟอร์การวางปัจจุบันได้อย่างไร


86

ฉันมีข้อความในบัฟเฟอร์การวางของฉันเช่นฉันทำyw(คำว่างัด) และตอนนี้ฉันมี 'foo' ในบัฟเฟอร์ของฉัน

ตอนนี้ฉันไปที่คำว่า 'บาร์' และฉันต้องการแทนที่ด้วยบัฟเฟอร์การวางของฉัน

หากต้องการแทนที่ข้อความด้วยตนเองฉันสามารถทำได้cwแล้วพิมพ์คำใหม่

ฉันจะ 'เปลี่ยนคำ' แต่ใช้เนื้อหาของบัฟเฟอร์การวางของฉันแทนการพิมพ์คำที่แทนที่ด้วยตนเองได้อย่างไร

ตัวเลือกที่ดีที่สุดที่ฉันมีตอนนี้คือไปที่จุดเริ่มต้นของคำที่ฉันต้องการแทนที่และทำdw(ลบคำ) จากนั้นไปที่อื่นและทำyw(คำพูดงัด) จากนั้นกลับไปที่พื้นที่ทดแทนและทำp(วาง) ซึ่งค่อนข้างงุ่มง่ามโดยเฉพาะอย่างยิ่งหากพวกเขาไม่ได้อยู่บนหน้าจอเดียวกัน

คำตอบ:


120

ตัวเลือกที่ 1

คุณสามารถใช้รีจิสเตอร์เพื่อทำและทำ keybinding สำหรับกระบวนการ

ywงัดคำที่คุณต้องการที่จะเปลี่ยนด้วย

คำกระชากอยู่ในทะเบียนที่คุณสามารถดูโดยการออก0:registers

cwไปที่คำที่คุณต้องการเพื่อทดแทนและทำ ทำCtrl+ rตามด้วย0เพื่อวางการ0ลงทะเบียน

แผนที่สำหรับที่จะมีลักษณะเช่นนี้ (สมมติว่าCtrl+ jเป็นคำสั่งผสมที่สำคัญของเรา):

:map <C-j> cw<C-r>0<ESC>

ตัวเลือก 2 (ง่ายกว่า)

viwpด้วยคำพูดของคุณกระชากเคอร์เซอร์กว่าคำที่คุณต้องการเพื่อทดแทนและทำ ซึ่งเป็นภาพที่เลือกคำและวางภายใน

ได้รับความอนุเคราะห์จาก @tlo ในความคิดเห็น: คุณสามารถทำได้เช่นvepกัน ถ่านหนึ่งตัวสั้นลง ข้อเสียต้องวางเคอร์เซอร์ในตำแหน่งเริ่มต้นของคำและ (เช่นเดียวกับฉัน) เปลี่ยนบัฟเฟอร์

ความคิดเห็น (จาก Michael):

ดีจัง. หมายเหตุพิเศษ: วิธีที่สองนั้นง่ายกว่า แต่ตามจริงแล้วใช้ได้กับการแทนที่หนึ่งครั้งเท่านั้นเพราะหลังจากการแทนที่แต่ละครั้งบัฟเฟอร์จะได้รับการเปลี่ยนเป็นฟิลด์ที่ถูกแทนที่ (ข้อความเก่า) วิธีแรกนั้นยากกว่านิดหน่อยในการใช้ BUT ซึ่งมีข้อดีคือบัฟเฟอร์ 0 ยังคงอยู่เหมือนเดิมดังนั้นคุณสามารถใช้วิธีการนั้นแทนการแทนที่ข้อความเดิมได้มากกว่า 1 อัน


14
ตัวเลือกที่ 3 (ได้ง่าย): vepด้วยคำพูดของคุณกระชากเคอร์เซอร์มากกว่าตัวอักษรตัวแรกของคำที่คุณต้องการแทนที่และทำ
tlo

ฉันชอบตัวเลือก 3 เมื่อมีเพียง 1 คำที่จะเปลี่ยน หากมีคำเดียวกันมากกว่าหนึ่งคำที่จะเปลี่ยนตัวเลือก 1 ให้ฉันใช้ ตัวดำเนินการเพื่อทำซ้ำ ..
typelogic

3
ve"0pจะทำงานเพื่อให้คุณทำซ้ำการเปลี่ยนแปลงของคุณ
JKillian

หากคุณกำลังจะแผนที่ไปยังบางสิ่งบางอย่างมันอาจจะดีกว่าที่จะใช้: เพื่อให้มันไม่สำคัญว่าจากการที่ในคำที่คุณกดmap <C-j> ciw<C-r>0<ESC> ^j
พอลปาร์คเกอร์

ทุกคนที่ต้องการจะรู้ว่าทำไม CTRL-R ไม่ได้วิเศษ: :help insertแล้วค้นหา /CTRL-RCTRL-R สำหรับวิธีการve"0pทำงานให้ดู:help registers
Paul Parker

12

ywเพื่อดึงคำของคุณจากนั้นเลื่อนเคอร์เซอร์ไปยังคำที่คุณต้องการแทนที่และใช้"_dwเพื่อลบมันส่งข้อความไปยังการลงทะเบียนเป็นโมฆะ (ดังนั้นจึงไม่เขียนทับเนื้อหาของการ"ลงทะเบียน ) pและจากนั้นก็วางกับ

คุณสามารถใช้การแมปต่อไปนี้เพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้น:

nnoremap <leader>d "_d

... ดังนั้นในโหมดปกติคุณสามารถใช้\dwเพื่อลบคำได้โดยไม่กระทบต่อการ"ลงทะเบียน


3

ในการทำวิธี VIM นี้คุณใช้ yank, delete และ register อื่น ๆ โดยเจตนา

การลงทะเบียน"0คือการลงทะเบียนกระชาก สิ่งที่คุณจะได้รับการงัดใส่ที่นี่ "0แต่ไม่เคยได้สัมผัสลบลงทะเบียน

ในตัวอย่างของคุณคุณเพิ่งกระชากคำหนึ่งคำ เพื่อแทนที่คำด้วยสิ่งที่คุณเพิ่งดึงคุณใช้ประโยชน์จากการลบที่ไม่เคยสัมผัสทะเบียน yank ดังนั้นย้ายไปที่คำเป้าหมายลบด้วยdwแล้ววางจาก yank-register ของคุณด้วย"0pหรือดีกว่ายังcwจากนั้น^R0(ซึ่งสามารถทำซ้ำได้)

"-ตรงข้ามใกล้กับทะเบียนงัดเป็นลบขนาดเล็กลงทะเบียน เล็ก ๆ ลบหรือเปลี่ยนแปลงการกำจัดจะใส่ที่นี่ แต่ Yanks "-ไม่เคยได้สัมผัส การลบจะนับว่ามีขนาดเล็กถ้าน้อยกว่าเต็มบรรทัด

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

สำหรับการดำเนินการใด ๆ ""ที่มีการเปลี่ยนแปลงการลงทะเบียนสำเนายังวางอยู่เสมอในการเริ่มต้นการลงทะเบียนชื่ออาคา นี่คือการลงทะเบียนที่ใช้เมื่อคุณไม่ได้ระบุชื่อการลงทะเบียนไว้อย่างชัดเจน

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

การลงทะเบียนหลุมดำ"_ช่วยให้คุณทำสิ่งต่าง ๆ เช่นการลบขนาดเล็กครั้งแรกจากนั้นการลบอื่น ๆ จำนวนหนึ่ง"_โดยไม่ต้องเปลี่ยนการลงทะเบียนการลบขนาดเล็กของคุณ"-จากนั้นวางการลบขนาดเล็กครั้งแรกของคุณ

ลงทะเบียนอื่น ๆ ที่มีการลงทะเบียนที่ผ่านมาแทรก".ลงทะเบียนชื่อไฟล์"%และ"#การลงทะเบียนคำสั่ง":ลงทะเบียนการค้นหาและการแสดงออกทะเบียน"/"=

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


2

ฉันต้องการนี้จึงมักจะผมเขียนปลั๊กอินเพื่อลดความซับซ้อนและช่วยให้ความเร็วสูงสุด: ReplaceWithRegister

ปลั๊กอินนี้เสนอgrคำสั่งแบบสองในหนึ่งเดียวที่แทนที่ข้อความที่ครอบคลุมโดย {motion} / วัตถุข้อความทั้งบรรทัด (s) หรือเลือกปัจจุบันด้วยเนื้อหาของการลงทะเบียน; ข้อความเก่าจะถูกลบในการลงทะเบียนหลุมดำนั่นคือมันหายไป มันจัดการกรณีมุมอย่างโปร่งใสและอนุญาตให้ทำซ้ำอย่างรวดเร็วผ่าน.คำสั่งมาตรฐาน หากคุณไม่ชอบหน้านี้มีลิงก์ไปยังทางเลือกอื่น


2

ในการทำซ้ำ paste ให้ใช้คำสั่ง change

cw ^R0ESC (^ R = Control + R; 0 สำหรับการลงทะเบียน 0)

จะแทนที่คำด้วยเนื้อหาจาก reg 0 และให้คุณทำซ้ำด้วย.

สิ่งนี้เป็นสิ่งที่ดีสำหรับcgn(VIM 7.4) เพื่อแทนที่รูปแบบการค้นหา:

  • ค้นหาครั้งแรกด้วย/หรือ*
  • cgn ^R0ESC
  • .เพื่อเล่นซ้ำในนัดถัดไปหรือnข้าม

1

เนื่องจากยังไม่รวมคุณจึงมักจะแทนที่สตริงด้วย:%s/.../.../และคุณสามารถทำได้ด้วยคำที่อยู่ใต้เคอร์เซอร์ของคุณเช่นกัน

  1. คุณป้อนส่วนแรกของคำสั่งสิ่งที่คุณกำลังค้นหา: :s/find/
  2. จากนั้นคุณคลิก<ctrl-r>และเลือกด้วยเคอร์เซอร์คำที่คุณต้องการแทนที่ด้วย
  3. จากนั้นคุณคลิก<ctrl-w>(คำว่า "เล็ก") หรือ<ctrl-a>(คำใหญ่ ") เพื่อวางคำใต้เคอร์เซอร์ลงในบรรทัดคำสั่ง
  4. จากนั้นคุณเสร็จสิ้นคำสั่ง

ดูการเชื่อมโยงเกี่ยวกับวิธีการใช้สิ่งที่เคอร์เซอร์ในบรรทัดคำสั่ง


1

ฉันมักจะใช้นี้ywที่จะดึงเอาfooแล้วลบbarด้วยdwและเป็นขั้นตอนสุดท้ายใส่fooจากการลงทะเบียนซึ่งถือข้อความกระชากใช้0 "0pทำซ้ำโดยใส่เครื่องหมายจุด ( .) ตามต้องการ

นอกจากนี้แทนที่จะใช้ywและdwคุณสามารถใช้yiwและdiw(สังเกตสิ่งพิเศษi- หมายถึงข้างใน ) ด้วยการที่คุณสามารถดึงหรือลบคำจากตำแหน่งใด ๆภายในไม่เพียงแค่เริ่มต้นของคำ


0

ฉันใช้ปลั๊กอินนี้เพื่อขยายขอบเขตการเลือก: https://github.com/terryma/vim-expand-region

ดังนั้นการรวมกันของฉันสำหรับการเปลี่ยนคำจะเป็น: vvpในสถานที่ใด ๆ ของคำ

ฉันยังมีแฮ็คเพื่อบันทึกเนื้อหาการลงทะเบียนชื่อหลังจากวางเพื่อให้ฉันสามารถทำซ้ำนี้

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(คลิปบอร์ดของฉันเลือกอัตโนมัติ)


0

ฉันใช้การจับคู่คีย์ด้านล่างเพื่อแทนที่คำปัจจุบันด้วยคำที่คัดลอก
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwคัดลอกคำ นำทางไปยังคำ ,rrแทนที่คำ ที่สำคัญผู้นำคือแผนที่จะ
,


,rwจะทำให้รู้สึกมากขึ้นและใน QWERTY น่าจะเป็น smidgen ง่ายขึ้นและเร็วขึ้นเพื่อเข็มขัดออก ใน DVORAK ฉันเลือก,rcซึ่งแม้ว่ามันจะไม่สมเหตุสมผลเลย แต่ก็ง่ายและเร็วกว่าพวกเขาทั้งหมด ใน DVORAK ,rwเป็นการแสดงสยองขวัญ;)
Paul Parker

0

ขั้นแรกนำทางไปยังจุดเริ่มต้นของคำที่คุณต้องการดึง หากคุณอยู่กลางคำให้ทำbย้อนกลับไปที่จุดเริ่มต้น จากนั้นทำyeเพื่อดึงคำทั้งหมดโดยไม่มีช่องว่างท้าย ( yank ถึงend) สุดท้ายไปที่คำที่คุณต้องการแทนที่ - โดยทำwสองสามครั้ง - และทำvepเพื่อเข้าสู่vโหมดการเลือกแบบ isual เลือกeที่คำที่ต้องการและเติมpเนื้อหาที่ดึงออกล่าสุด

(หากใครต้องการรู้ว่าทำไมฉันไม่เพียงแค่แสดงความคิดเห็นเกี่ยวกับคำตอบที่ยอมรับสำหรับการดัดแปลงเล็ก ๆ ของการใช้yeมากกว่าywนั้นเป็นเพราะชื่อเสียงของฉันในสแต็กนี้ยังต่ำเกินไป)


0
  1. ใช้ywเพื่อดึงโลกไปสู่โลกที่คุณต้องการเปลี่ยน
  2. ใช้vเพื่อเลือกโลกveหรือvwขึ้นอยู่กับสถานการณ์ของคุณ
  3. เข้าสู่ppaster โลกที่คุณคัดลอกเพื่อแทนที่บล็อกที่เลือก

0

เพิ่มไปยังคำตอบที่ดีกว่าอื่น ๆ ชัดเจนเกินไป แต่คุณสามารถวางก่อนที่จะลบได้ 'yw' จากนั้นไปที่คำที่คุณต้องการแทนที่, 'pldw' (วาง, เลื่อนตัวละครหนึ่งตัวไปทางขวา, ลบคำ

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