ฉันมักจะต้องวางบางสิ่งในบรรทัดใหม่เป็นกลุ่ม สิ่งที่ฉันมักทำคือ:
o<Esc>p
ซึ่งแทรกบรรทัดใหม่และทำให้ฉันอยู่ในโหมดแทรกแทนที่จะออกจากโหมดแทรกและสุดท้ายก็วาง
การกดแป้นพิมพ์สามครั้ง ไม่ค่อยมีประสิทธิภาพ มีความคิดที่ดีกว่านี้ไหม
ฉันมักจะต้องวางบางสิ่งในบรรทัดใหม่เป็นกลุ่ม สิ่งที่ฉันมักทำคือ:
o<Esc>p
ซึ่งแทรกบรรทัดใหม่และทำให้ฉันอยู่ในโหมดแทรกแทนที่จะออกจากโหมดแทรกและสุดท้ายก็วาง
การกดแป้นพิมพ์สามครั้ง ไม่ค่อยมีประสิทธิภาพ มีความคิดที่ดีกว่านี้ไหม
คำตอบ:
ไม่นานหลังจาก:help p
นั้นกล่าวว่า:
:[line]pu[t] [x] Put the text [from register x] after [line] (default
current line). This always works |linewise|, thus
this command can be used to put a yanked block as
new lines.
:[line]pu[t]! [x] Put the text [from register x] before [line]
(default current line).
น่าเสียดายที่มันไม่ได้สั้นกว่าโซลูชันปัจจุบันของคุณเว้นแต่คุณจะรวมเข้ากับแผนที่แป้นพิมพ์ตามที่แนะนำในคำตอบอื่น ตัวอย่างเช่นคุณสามารถจับคู่คีย์ใดก็ได้ (คู่p
):
:nmap p :pu<CR>
:pu[t]
จะใส่ข้อความในบรรทัดใหม่หลังบรรทัดปัจจุบัน:pu[t]!
จะใส่ข้อความในบรรทัดใหม่ก่อนบรรทัดปัจจุบัน ฉันจะแก้ไขคำตอบของฉันตามนั้น (ไชโยสำหรับ:help p
.)
:nmap p :pu<CR>
ใส่ไว้ในไฟล์. vimrc ของคุณและปิดคุณไป :)
ตัวเลือก:
1) ใช้yy
เพื่อดึงทั้งบรรทัด (รวมทั้งอักขระท้ายบรรทัด) p
จากนั้นจะวางบรรทัดบนบรรทัดใหม่หลังบรรทัดปัจจุบันและP
( Shift- P) จะวางเหนือบรรทัดปัจจุบัน
2) ทำการแมป: จากนั้นเป็นเพียงหนึ่งหรือสองปุ่ม:
:nmap ,p o<ESC>p
:nmap <F4> o<ESC>p
3) เวอร์ชันฟังก์ชันของการทำแผนที่ (ไม่จำเป็นจริงๆ แต่เพื่อความสมบูรณ์):
:nmap <F4> :call append(line('.'), @")<CR>
" This one may be a little better (strip the ending new-line before pasting)
:nmap <F4> :call append(line('.'), substitute(@", '\n$', '', ''))<CR>
:help let-register
:help :call
:help append()
:help line()
:help nmap
คุณสามารถวางบัฟเฟอร์ในโหมดแทรกโดยใช้<C-R>
ตามด้วยชื่อของบัฟเฟอร์ที่จะวาง บัฟเฟอร์เริ่มต้นคือ"
ดังนั้นคุณจะทำ
o<C-R>"
ฉันพบว่าฉันใช้<C-R>"
บ่อยมากและผูกไว้กับ<C-F>
vimrc ของฉัน:
inoremap <C-F> <C-R>"
สิ่งนี้ยังคงใช้การกดแป้นพิมพ์สามครั้ง แต่ฉันพบว่ามันง่ายกว่า Esc:
o<Alt-p>
เนื่องจากคุณอยู่ในโหมดแทรกหลังจากกดปุ่ม o ตัวปรับแต่ง Alt จะอนุญาตให้คุณใช้คำสั่งราวกับว่าคุณไม่
การใช้ปลั๊กอินนี้: https://github.com/tpope/vim-unimpaired
]p
วางบนบรรทัดด้านล่าง
[p
วางบนบรรทัดด้านบน
ข้อดี:
tpope/vim-unimpaired
สิ่งนี้เพื่อให้ได้ผล😉
โดยส่วนตัวแล้วฉันได้ตั้งชื่อEnter (CR) ไว้ดังนี้:
nmap <CR> o<Esc>k
... บนพื้นฐานนี้บทความที่เป็นกลุ่ม Wikia
ด้วยวิธีนี้ฉันสามารถสร้างบรรทัดใหม่ได้โดยตรงจากโหมดปกติและเมื่อรวมสิ่งนี้เข้ากับการต้องการวางลงในบรรทัดใหม่ด้านล่างฉันจะทำ:
<CR>jp
คุณสามารถข้ามkใน nmap ด้านบนได้โดยขึ้นอยู่กับฟังก์ชันที่คุณต้องการจากEnterดังนั้นมันก็จะเป็น<CR>p
เช่นนั้น
ฉันได้เลียนแบบ jj เป็นEscด้วยซึ่งจะช่วยในกรณีนี้ด้วย Escอยู่ห่างจากแถวบ้านมากเกินไปสำหรับความสำคัญของมันในกลุ่ม
ไม่สั้นกว่าโซลูชันอื่น ๆ แต่ฉันคิดว่ามันให้ความรู้สึกอึดอัดน้อยกว่าบางส่วนและมีประโยชน์อื่น ๆ ด้วย
หากคุณกำลังคัดลอกทั้งบรรทัดจากนั้นวางทั้งบรรทัดให้ใช้Y
เพื่อดึงเส้นหรือเส้นรวมทั้งตัวแบ่งบรรทัดในตอนแรกและp
เพื่อวาง คุณยังสามารถใช้V
ซึ่งเป็นโหมดเส้นภาพตรงกันข้ามกับv
โหมดธรรมดาสำหรับโหมดภาพ
inoremap jj <ESC>
ฉันมีการทำแผนที่ ดังนั้นมันจึงเป็นเรื่องง่ายที่จะแทรกบรรทัดใหม่ด้วยojj
และแล้วOjj
p
ดังนั้นojjp
วางขึ้นบรรทัดใหม่ มันมีจังหวะอีกครั้งo<esc>p
แต่ojjp
มันง่ายสำหรับฉัน
ฉันพบวิธีแก้ปัญหาที่สวยงามสำหรับเรื่องนี้ หากคุณใส่ลงทะเบียน yank ในคลิปบอร์ดของระบบปฏิบัติการ (ซึ่งก็ยอดเยี่ยมอยู่ดี) ด้วย
set clipboard+=unnamed
o<Ctl-v>
กว่าที่คุณสามารถทำได้
นอกจากจำนวนสโตรกที่น้อยลงแล้วสิ่งนี้ยังช่วยปรับปรุงทั้งสองอย่างo<Esc>p
และ:pu
เนื่องจากมันรักษาการเยื้องไว้: ทั้งสองตัวเลือกอื่น ๆ เริ่มต้นที่ศูนย์อักขระในบรรทัดใหม่
ข้อแม้คือสิ่งนี้อาจขึ้นอยู่กับระบบปฏิบัติการหรือไม่ก็ได้ สิ่งที่ฉันรู้ก็คือมันใช้งานได้กับ OS X เวอร์ชันล่าสุด แต่คลิปบอร์ดเป็นเพียงหนึ่งในหลาย ๆ วิธีในการดึงข้อมูลในคลิปบอร์ดของระบบปฏิบัติการ
CTRL-R "
หากคุณยังต้องการที่จะจบในโหมดแทรกมันเป็นไปได้ที่จะวางอยู่ในโหมดแทรกใช้ https://stackoverflow.com/a/2861909/461834
ยังคงมีการกดแป้นพิมพ์สามครั้ง แต่ไม่มีการหลบหนีและคุณจะบันทึกการกดแป้นพิมพ์หากคุณต้องการสิ้นสุดการแทรก
ฉันใช้การแมปต่อไปนี้ในการกำหนดค่า Neovim ของฉัน:
nnoremap <leader>p m`o<ESC>p``
nnoremap <leader>P m`O<ESC>p``
คำอธิบายเล็กน้อย:
m`
: กำหนดเครื่องหมายในตำแหน่งเคอร์เซอร์ปัจจุบันo<Esc>p
: สร้างบรรทัดใหม่ด้านล่างและวางข้อความในบรรทัดนี้O<Esc>P
: สร้างบรรทัดใหม่ด้านบนและวางข้อความในบรรทัดนี้``
: วางเคอร์เซอร์ในตำแหน่งเดิมดู:h mark
ข้อมูลเพิ่มเติมเกี่ยวกับเครื่องหมายใน Vim
หากคุณต้องการอยู่ในโหมดแทรกคุณสามารถทำได้ o ctrl+o p
o
- แทรกโหมดและไปที่บรรทัดใหม่ctrl+o
- เรียกใช้คำสั่งเดียวเหมือนในโหมดปกติp
- วางมันเป็นการกดแป้นพิมพ์สามครั้ง แต่คุณยังคงอยู่ในโหมดแทรกและยังo ctrl+o
ค่อนข้างเร็วดังนั้นฉันจึงถือว่าเป็นการกดแป้น 2.5
วิธีนี้ดูเหมือนจะใช้ได้เฉพาะเมื่อบล็อกของข้อความที่คัดลอกเริ่มต้นในบรรทัดใหม่ (ตรงข้ามกับการจับตัวอย่างข้อความที่ใดที่หนึ่งภายในบรรทัด) แต่คุณสามารถเริ่มคัดลอกด้วยอักขระสุดท้ายที่คุณต้องการจับได้จากนั้นนำทาง ไปยังอักขระสุดท้ายที่ท้ายบรรทัดก่อนเริ่มบล็อกการคัดลอกที่คุณต้องการ จากนั้นเมื่อคุณต้องการวางให้วางเคอร์เซอร์ที่ท้ายบรรทัดซึ่งคุณต้องการวางข้อความของคุณแล้วกด p หากฉันยังไม่เข้าใจคำอธิบายผิดพลาดสิ่งนี้ควรให้ผลที่คุณกำลังมองหา
หากคุณต้องการวางในnew line
และยังคงเยื้องให้สร้างการจับคู่นี้:
nnoremap <leader>p oq<BS><Esc>p
สิ่งที่ต้องมีก่อน: คุณได้แมปผู้นำและคุณมีset autoindent
ใน.vimrc
ไฟล์.
คำอธิบาย: บรรทัดใหม่ถูกสร้างขึ้นโดยพิมพ์ 'o', 'q' แล้วเว้นระยะห่าง (เพื่อให้การเยื้อง) และ 'esc' จะนำคุณกลับสู่โหมดปกติซึ่งคุณจะวางในที่สุด