Subversive มีการเคลื่อนไหวของตัวดำเนินการใหม่ 2 แบบเพื่อให้ง่ายต่อการเปลี่ยนตัวอย่างรวดเร็ว ไม่มีการแมปเริ่มต้นและจะไม่มีผลจนกว่าคุณจะเพิ่มแผนที่ของคุณเองลงไป
โปรดดูที่นี่หากคุณต้องการชมวิดีโอคำอธิบายของปลั๊กอินนี้แทนข้อความด้านล่าง
การกำหนดค่าตัวอย่าง:
" s for substitute
nmap s <plug> (SubversiveSubstitute)
nmap ss <plug> (SubversiveSubstituteLine)
nmap S <plug> (SubversiveSubstituteToEndOfLine)
โปรดทราบว่าในกรณีนี้ คุณจะต้องแชโดว์คีย์อักขระการเปลี่ยนแปลง s
ดังนั้นคุณจะต้องใช้รูปแบบที่ยาวกว่า cl
หลังจากเพิ่มแผนที่เหล่านี้แล้ว คุณสามารถดำเนินการ s<motion>
เพื่อแทนที่วัตถุข้อความที่ได้รับจากการเคลื่อนไหวด้วยเนื้อหาของรีจิสเตอร์เริ่มต้น (หรือรีจิสเตอร์ที่ชัดเจน หากมีให้) ตัวอย่างเช่น คุณสามารถดำเนินการ siw
เพื่อแทนที่คำปัจจุบันใต้เคอร์เซอร์ด้วย yank ปัจจุบัน หรือ sip
เพื่อแทนที่ย่อหน้า เป็นต้น
โอเปอเรเตอร์ที่น่าสนใจอีกตัวหนึ่งจาก Subversive ช่วยให้ระบุทั้งข้อความที่จะแทนที่และช่วงบรรทัดที่จะใช้การเปลี่ยนแปลงโดยใช้การเคลื่อนไหวต่อเนื่องกันหลายครั้ง
การกำหนดค่าตัวอย่าง:
nmap <leader> s <plug> (SubversiveSubstituteRange)
xmap <leader> s <plug> (SubversiveSubstituteRange)
nmap <leader> ss <plug> (SubversiveSubstituteWordRange)
หลังจากเพิ่มแผนที่นี้ หากคุณดำเนินการ <leader>s<motion1><motion2>
ให้ป้อนข้อความบางส่วนลงในพรอมต์ในแถบสถานะ จากนั้นข้อความที่กำหนดโดย motion1
ควรถูกแทนที่ด้วยข้อความที่เราป้อนในพรอมต์สำหรับแต่ละบรรทัด จัดทำโดย motion2
หรืออีกทางหนึ่ง เรายังสามารถเลือก motion1
ในโหมดภาพ จากนั้นกด <leader>s<motion2>
เพื่อให้ได้เอฟเฟกต์เดียวกัน
สิ่งนี้มีพลังมาก ตัวอย่างเช่น คุณสามารถดำเนินการ <leader>siwip
เพื่อแทนที่อินสแตนซ์ทั้งหมดของคำปัจจุบันภายใต้เคอร์เซอร์ที่มีอยู่ภายในย่อหน้าใต้เคอร์เซอร์ หรือ <leader>sl_
เพื่อแทนที่อินสแตนซ์ทั้งหมดของอักขระใต้เคอร์เซอร์บนบรรทัดปัจจุบัน
การแมป <leader>ss
ใช้เป็นทางลัดเพื่อแทนที่คำปัจจุบันใต้เคอร์เซอร์ ซึ่งจะทำให้คุณสามารถดำเนินการ <leader>ssip
เพื่อแทนที่คำที่อยู่ใต้เคอร์เซอร์ในย่อหน้าปัจจุบันได้ โปรดทราบว่าสิ่งนี้ตรงกับคำ ที่สมบูรณ์ ดังนั้นจึงแตกต่างจาก <leader>siwip
(ซึ่งไม่จำเป็นต้องมีขอบเขตคำในแต่ละการแข่งขัน)
มาดูกันในทางปฏิบัติ:
ใน gif นี้ ก่อนอื่นเราจะเปลี่ยนชื่อพารามิเตอร์ foo
ในเครื่องโดยดำเนินการ <leader>ssom
จากนั้นป้อน bar
ในพรอมต์ (โปรดทราบว่า om
เป็นการเคลื่อนไหวแบบกำหนดเองที่ย่อมาจาก 'outer c# method' และไม่ได้มาจากปลั๊กอินนี้) โปรดทราบว่าเนื่องจากเราใช้ <leader>ss
ข้อความ _foos
จึงไม่ได้รับผลกระทบเนื่องจากไม่ตรงกับคำทั้งหมด มันมีประโยชน์ในกรณีนี้เพราะเราต้องการเปลี่ยนชื่อพารามิเตอร์ภายในฟังก์ชันเท่านั้น
หลังจากนั้นเราสลับไปที่โหมดภาพและเลือก foo
part _foos
จากนั้นดำเนินการ <leader>sie
และเข้าสู่ bar
อีกครั้งในพรอมต์ ie
คือเป็นการเคลื่อนไหวแบบกำหนดเองอีกครั้งซึ่งหมายถึง entire buffer
(ดูรายละเอียดในส่วนถัดไป)
หลังจากนั้นเราย้ายไปที่ส่วน Foo
ของ AddFoo
และดำเนินการ <leader>seie
และเข้าสู่ Bar
อีกครั้ง จากนั้นในที่สุดก็ทำเช่นเดียวกันกับ FOOS
ที่เป็นตัวพิมพ์ใหญ่ทั้งหมด
โปรดทราบว่าหากคุณใช้ neovim คุณสามารถเปิดใช้งานตัวเลือก inccommand
เพื่อดูตัวอย่างการแทนที่แบบเรียลไทม์ในขณะที่คุณกำลังพิมพ์ (เทียบเท่ากับการตั้งค่า g:subversivePromptWithActualCommand
เป็น 1
)
โปรดทราบว่าการเคลื่อนไหวนี้สามารถทำซ้ำได้ หากคุณเรียกใช้ <leader>siwip
ในย่อหน้าหนึ่ง ให้ไปที่ย่อหน้าอื่น จากนั้น .
จากนั้นการทดแทนแบบเดียวกันจะนำไปใช้กับย่อหน้าใหม่ใต้เคอร์เซอร์
โปรดทราบว่าหากต้องการใช้ประโยชน์จากการแมปเหล่านี้จริงๆ การเพิ่มออบเจ็กต์ข้อความแบบกำหนดเองนอกเหนือจากเฉพาะออบเจ็กต์ที่มีอยู่แล้วภายใน เช่น ย่อหน้าปัจจุบัน ( ip
) ประโยคปัจจุบัน ( is
) หรือบรรทัดปัจจุบัน ( _
) จะเป็นประโยชน์ ออบเจ็กต์ข้อความแบบกำหนดเอง เช่น ระดับการเยื้องปัจจุบัน วิธีการปัจจุบัน คลาสปัจจุบัน บัฟเฟอร์ทั้งหมด หน้าเลื่อนปัจจุบัน ฯลฯ ทั้งหมดนี้สามารถช่วยได้มากที่นี่
ตัวอย่างเช่น การเคลื่อนไหวง่ายๆ สองสามอย่างที่มีประโยชน์สำหรับการโค่นล้ม ได้แก่:
" ie = inner entire buffer
onoremap ie :exec "normal! ggVG" <cr>
" iv = current viewable text in the buffer
onoremap iv :exec "normal! HVL" <cr>
นอกจากนี้ยังมีปลั๊กอินอื่น ๆ ที่มีออบเจ็กต์ข้อความแบบกำหนดเองมากมายที่ฉันอยากจะแนะนำให้ลองดู
สำหรับการแทนที่หลายๆ ครั้ง คุณสามารถใช้การแสดงตัวอย่างไฮไลต์เพื่อทำความเข้าใจสิ่งที่กำลังถูกแทนที่ได้ แต่หากคุณทำการแทนที่ที่มีขนาดใหญ่กว่าทั่วทั้งไฟล์ คุณอาจต้องการยืนยันแต่ละไฟล์ คุณสามารถทำได้ด้วยแผนที่ต่อไปนี้:
nmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
xmap <leader> cs <plug> (SubversiveSubstituteRangeConfirm)
nmap <leader> css <plug> (SubversiveSubstituteWordRangeConfirm)
สิ่งเหล่านี้ทำงานเหมือนกับแผนที่ <leader>s
ด้านบน ยกเว้นจะผ่านการแทนที่ทีละรายการ
หากคุณระบุการลงทะเบียนอย่างชัดเจนให้กับการเคลื่อนไหวทดแทนใดๆ ข้างต้น จะไม่แจ้งเตือนและจะใช้เนื้อหาของการลงทะเบียนที่กำหนดแทน ตัวอย่างเช่น "a<leader>siwip
จะแทนที่อินสแตนซ์ทั้งหมดของคำปัจจุบันภายใต้เคอร์เซอร์ทันทีด้วยเนื้อหาของ register a
ที่มีอยู่ภายในย่อหน้าปัจจุบัน
หากยังไม่เพียงพอ คุณสามารถใช้ปลั๊กต่อไปนี้แทนได้:
nmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
xmap <leader> s <plug> (SubversiveSubstituteRangeNoPrompt)
nmap <leader> ss <plug> (SubversiveSubstituteWordRangeNoPrompt)
ซึ่งจะทำงานเหมือนกับปลั๊กรุ่นก่อนๆ ยกเว้นว่าแทนที่จะแจ้งให้ทราบจะใช้รีจิสเตอร์เริ่มต้น
คุณสามารถทำได้โดยส่งการลงทะเบียนหลุมดำไปยังคำสั่งทดแทนช่วงหนึ่ง ตัวอย่างเช่น: "_<leader>siwip
หรือ "_<leader>csiwip
หากคุณต้องการยืนยันการลบแต่ละครั้ง
น่าเสียดายที่คุณไม่สามารถป้อนค่าว่างลงในพรอมต์ได้เนื่องจากไม่มีวิธีแยกแยะอินพุตนี้จากการยกเลิกผ่านการหลบหนี (เว้นแต่คุณจะตั้ง g:subversivePromptWithActualCommand
เป็น 1
ซึ่งในกรณีนี้จะทำงานได้ดี)
g:subversivePromptWithCurrent
- เมื่อตั้งค่าเป็น 1
พรอมต์จะรวมข้อความที่ถูกแทนที่ สิ่งนี้มีประโยชน์หากคุณต้องการเพียงแค่แก้ไขมัน ค่าเริ่มต้น: 0
g:subversiveCurrentTextRegister
- เมื่อตั้งค่า การลงทะเบียนที่กำหนดจะถูกเติมด้วยข้อความที่ถูกแทนที่ สิ่งนี้มีประโยชน์เป็นทางเลือกแทน g:subversivePromptWithCurrent
เพื่อให้คุณสามารถกด <cr>r
ในพรอมต์ (สมมติว่าคุณตั้งค่าเป็น 'r'
) เมื่อคุณต้องการแก้ไขหรือพิมพ์โดยตรงเมื่อคุณต้องการทำ การแทนที่แบบเต็มg:subversivePromptWithActualCommand
- เมื่อตั้งค่าเป็น 1
แทนที่จะแสดงเฉพาะข้อความแทนที่ แต่จะพร้อมต์ด้วยคำสั่งการแทนที่ vim ดั้งเดิม ผู้ใช้กลุ่มทหารผ่านศึกอาจชอบสิ่งนี้เพื่อให้สามารถปรับแฟล็กการทดแทนต่างๆ ได้ด้วยตนเอง ค่าเริ่มต้น: 0
g:subversivePreserveCursorPosition
- เมื่อตั้งค่าเป็น 1
เคอร์เซอร์จะไม่เคลื่อนที่เมื่อมีการใช้การแทนที่ ค่าเริ่มต้นคือ 0
เพื่อให้ตรงกับพฤติกรรมเป็นกลุ่มปกติ หากคุณได้ติดตั้ง vim-abolish ไว้ด้วย คุณอาจลองเพิ่มสิ่งที่คล้ายกับการแมปต่อไปนี้ด้วย:
nmap <leader> <leader> s <plug> (SubversiveSubvertRange)
xmap <leader> <leader> s <plug> (SubversiveSubvertRange)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRange)
สิ่งนี้จะทำงานเหมือนกับ <leader>s
ยกเว้นว่าจะทำการยกเลิก 'subvert' แทนที่จะใช้คำสั่งทดแทนในตัวของ vim การดำเนินการนี้จะใช้การทดแทนและคงไว้ซึ่งกรณีใดๆ ก็ตามที่คำเดิมมีอยู่ ตัวอย่างเช่น:
ในกรณีนี้ เราเลื่อนเคอร์เซอร์ไปไว้เหนือ foo
แล้วดำเนินการ <leader><leader>seie
จากนั้นป้อน bar
ซึ่งจะแทนที่อินสแตนซ์ทั้งหมดของ foo
โดยไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่
นี่อาจเป็นวิธีที่สะดวกมากในการเปลี่ยนชื่ออย่างรวดเร็ว
ตามที่คุณคาดหวัง การแมป <leader><leader>ss
ทำงานในลักษณะเดียวกัน ยกเว้นเฉพาะการจับคู่คำที่สมบูรณ์ซึ่งมีขอบเขตคำเท่านั้น
และอีกครั้งหนึ่งยังมีปลั๊กอื่น ๆ ที่จะใช้การลงทะเบียนเริ่มต้นแทนพรอมต์หากคุณต้องการ:
nmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
xmap <leader> <leader> s <plug> (SubversiveSubvertRangeNoPrompt)
nmap <leader> <leader> ss <plug> (SubversiveSubvertWordRangeNoPrompt)
โปรดทราบว่าหากคุณติดตั้ง vim-yoink ควบคู่ไปกับ vim-subversive คุณลักษณะการสลับ yoink หลังการวางจะทำงานโดยอัตโนมัติด้วยการแทนที่แบบโค่นล้ม (การเคลื่อนไหวครั้งเดียว) เช่นกัน กล่าวอีกนัยหนึ่ง สมมติว่าเป็นการแมปเริ่มต้น คุณสามารถดำเนินการ siw
จากนั้นกด <cn>
/ <cp>
เพื่อสลับระหว่างการดึงที่แตกต่างจากประวัติ yoink
Subversive ยังมีปลั๊กสำหรับแทนที่การวางโหมดภาพเพื่อให้มีการสลับโพสต์ที่นั่นเช่นกัน:
xmap s <plug> (SubversiveSubstitute)
xmap p <plug> (SubversiveSubstitute)
xmap P <plug> (SubversiveSubstitute)
ตอนนี้ ถ้าคุณกด p
ขณะอยู่ในโหมดภาพ คุณสามารถสลับระหว่างการดึงได้เหมือนกับเมื่อวางในโหมดปกติ