ฉันมักจะพบว่าตัวเองพิมพ์คำสั่งเช่นgg"+yG
หรือggdG
ต้องการวิธีที่มีประสิทธิภาพมากขึ้นโดยไม่ต้องเลื่อนเคอร์เซอร์สองครั้ง มีคำสั่งใดบ้างที่ฉันสามารถใช้เช่นy[movement]
เพื่อคัดลอกบัฟเฟอร์ทั้งหมดโดยไม่ย้ายเคอร์เซอร์?
ฉันมักจะพบว่าตัวเองพิมพ์คำสั่งเช่นgg"+yG
หรือggdG
ต้องการวิธีที่มีประสิทธิภาพมากขึ้นโดยไม่ต้องเลื่อนเคอร์เซอร์สองครั้ง มีคำสั่งใดบ้างที่ฉันสามารถใช้เช่นy[movement]
เพื่อคัดลอกบัฟเฟอร์ทั้งหมดโดยไม่ย้ายเคอร์เซอร์?
คำตอบ:
เนื่องจาก vim ใช้เครื่องหมายเปอร์เซ็นต์เพื่ออ้างอิงบัฟเฟอร์ปัจจุบันคุณสามารถใช้เพื่อรับทุกสิ่งได้อย่างรวดเร็ว
:%y
จะดึงบัฟเฟอร์ทั้งหมด
:%y+
จะดึงมันไปยัง+
รีจิสเตอร์ (และน่าจะเป็นคลิปบอร์ดหากมีการรวบรวมกลุ่มที่มีตัวเลือกที่เหมาะสม)
:%d
และ:%d+
จะทำเช่นเดียวกันสำหรับการลบ
ในแต่ละกรณีเคอร์เซอร์จะยังคงอยู่
C-o
สองครั้งเพื่อย้อนกลับ
ทางออกก็คือการใช้ปลั๊กอินที่เรียกว่าเป็นกลุ่ม-textobj-ทั้งหมด ตามค่าเริ่มต้นปลั๊กอินนี้จะให้วัตถุข้อความae
สำหรับบัฟเฟอร์ทั้งหมดie
สำหรับบัฟเฟอร์ทั้งหมดยกเว้นนำหน้าและต่อท้ายบรรทัดว่าง
ปลั๊กอินนี้ขึ้นอยู่กับvim-textobj-userโดยผู้เขียนคนเดียวกันซึ่งช่วยให้ผู้ใช้สามารถกำหนดวัตถุข้อความใด ๆ ได้อย่างสะดวกสบาย มีปลั๊กอินมากมายที่ใช้ประโยชน์ได้ดี
ไม่มีวัตถุข้อความสำหรับไฟล์ทั้งหมดโดยค่าเริ่มต้นเป็น omap
แต่มันก็เป็นไปได้ที่จะสร้างพวกเขาใช้ ในกรณีนี้มันจะมีลักษณะดังนี้:
onoremap f :<c-u>normal! mzggVG<cr>`z
นี่คือรายละเอียดของการทำงาน:
onoremap f " make 'f' the text object name
:<c-u> " use <c-u> to prevent vim from inserting visual selection marker at the beginning of the command automatically.
normal! " use normal to make key presses ignoring any user mappings
mzggVG<cr>`z " make a marker in register z, select the entire file in visual line mode and enter the normal command, and go back to the z marker
หมายเหตุ:
Ctrluสามารถใช้ในโหมดบรรทัดคำสั่งเพื่อลบทุกอย่างทางด้านซ้ายของตำแหน่งเคอร์เซอร์ เหตุผลที่ทำเช่นนี้เพราะถ้าคุณป้อนบรรทัดคำสั่งตรงจากโหมดภาพมันจะแทรกโดยอัตโนมัติ'<,'>
ในบรรทัดคำสั่งและนั่นไม่ใช่สิ่งที่เราต้องการ ฉันขอแนะนำให้คุณใช้สิ่งอื่นที่ไม่ใช่f
เพราะf
ปกติแล้วจะใช้เพื่อย้ายไปยังอักขระที่ค้นหาถัดไปในบรรทัด ตัวอย่างเช่นfi
จะไปi
ที่บรรทัดถัดไปในบรรทัดปัจจุบัน
หัวข้อความช่วยเหลือที่เกี่ยวข้อง:
:help omap-info
:help :normal
:help c_CTRL-U
:help v_:
``
ไปยังจุดสิ้นสุดจะทำให้เคอร์เซอร์กลับไปยังตำแหน่งก่อนหน้า
นี่คือการแม็พสกปรกอย่างรวดเร็วเพื่อทำภารกิจให้สำเร็จ:
nnoremap yY :%yank <c-r>=v:register<cr><cr>
nnoremap dD :%delete <c-r>=v:register<cr><cr>
ตอนนี้คุณสามารถใช้yY
และdD
เพื่อดึง / ลบตามลำดับ มันไม่ดีเท่าการใช้วัตถุข้อความแบบเต็มเป่า แต่บางครั้งวิธีที่ง่ายที่สุดดีที่สุด
สำหรับความช่วยเหลือเพิ่มเติมดู:
:h :y
:h :d
:h [range]
:h v:register
:h c_ctrl-r
:h @=
mmgg"+yG`m
และไม่เคยคิดถึงสิ่งนี้ ขอบคุณสิ่งนี้กำลังดำเนินอยู่ใน. vimrc