มีวัตถุข้อความสำหรับบัฟเฟอร์ทั้งหมดหรือไม่


28

ฉันมักจะพบว่าตัวเองพิมพ์คำสั่งเช่นgg"+yGหรือggdGต้องการวิธีที่มีประสิทธิภาพมากขึ้นโดยไม่ต้องเลื่อนเคอร์เซอร์สองครั้ง มีคำสั่งใดบ้างที่ฉันสามารถใช้เช่นy[movement]เพื่อคัดลอกบัฟเฟอร์ทั้งหมดโดยไม่ย้ายเคอร์เซอร์?

คำตอบ:


36

เนื่องจาก vim ใช้เครื่องหมายเปอร์เซ็นต์เพื่ออ้างอิงบัฟเฟอร์ปัจจุบันคุณสามารถใช้เพื่อรับทุกสิ่งได้อย่างรวดเร็ว

:%yจะดึงบัฟเฟอร์ทั้งหมด :%y+จะดึงมันไปยัง+รีจิสเตอร์ (และน่าจะเป็นคลิปบอร์ดหากมีการรวบรวมกลุ่มที่มีตัวเลือกที่เหมาะสม)

:%dและ:%d+จะทำเช่นเดียวกันสำหรับการลบ

ในแต่ละกรณีเคอร์เซอร์จะยังคงอยู่


ว้าวตลอดเวลาที่ฉันใช้อยู่mmgg"+yG`mและไม่เคยคิดถึงสิ่งนี้ ขอบคุณสิ่งนี้กำลังดำเนินอยู่ใน. vimrc
Doorknob

@ Doorknob แทนการตั้งค่าและใช้เครื่องหมายคุณสามารถใช้C-oสองครั้งเพื่อย้อนกลับ
Ruslan

10

ทางออกก็คือการใช้ปลั๊กอินที่เรียกว่าเป็นกลุ่ม-textobj-ทั้งหมด ตามค่าเริ่มต้นปลั๊กอินนี้จะให้วัตถุข้อความaeสำหรับบัฟเฟอร์ทั้งหมดieสำหรับบัฟเฟอร์ทั้งหมดยกเว้นนำหน้าและต่อท้ายบรรทัดว่าง

ปลั๊กอินนี้ขึ้นอยู่กับvim-textobj-userโดยผู้เขียนคนเดียวกันซึ่งช่วยให้ผู้ใช้สามารถกำหนดวัตถุข้อความใด ๆ ได้อย่างสะดวกสบาย มีปลั๊กอินมากมายที่ใช้ประโยชน์ได้ดี


8

ไม่มีวัตถุข้อความสำหรับไฟล์ทั้งหมดโดยค่าเริ่มต้นเป็น 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_:

มีวิธีทำเช่นนี้ในขณะที่ปล่อยเคอร์เซอร์ไว้คนเดียวหรือไม่?
Random832

@ Random832 การเพิ่ม a ``ไปยังจุดสิ้นสุดจะทำให้เคอร์เซอร์กลับไปยังตำแหน่งก่อนหน้า
SnoringFrog

ฉันกังวลว่าสิ่งนี้จะไม่ใช้การเลือกกับคำสั่ง yank ฉันจะทดลองวันนี้
Random832

1
ฉันเพิ่มคำสั่งเครื่องหมายไปที่การแมปมันควรปล่อยเคอร์เซอร์ไว้ที่ตำแหน่งนี้
EvergreenTree

2

นี่คือการแม็พสกปรกอย่างรวดเร็วเพื่อทำภารกิจให้สำเร็จ:

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