จะวางในบรรทัดใหม่ด้วย vim ได้อย่างไร?


149

ฉันมักจะต้องวางบางสิ่งในบรรทัดใหม่เป็นกลุ่ม สิ่งที่ฉันมักทำคือ:

o<Esc>p

ซึ่งแทรกบรรทัดใหม่และทำให้ฉันอยู่ในโหมดแทรกแทนที่จะออกจากโหมดแทรกและสุดท้ายก็วาง

การกดแป้นพิมพ์สามครั้ง ไม่ค่อยมีประสิทธิภาพ มีความคิดที่ดีกว่านี้ไหม


9
การกดแป้นพิมพ์ 3 ครั้งไม่มีประสิทธิภาพ?
gtd

62
1 หรือ 2 จะดีกว่า :) ทำไมต้องใช้ vim ถ้าไม่ใช่เพื่อประสิทธิภาพสูงสุด?
static_rtti

2
นอกจากนี้ยังส่งผลให้เกิดการขึ้นบรรทัดใหม่เพิ่มเติมหากเนื้อหาที่คัดลอกลงท้ายด้วยการขึ้นบรรทัดใหม่
Jonathan W.

2
@gtd ตัวแก้ไขปกติทำงานร่วมกับ <Enter> <CV> การกดแป้นพิมพ์สองครั้ง
user4052054

2
@ user4052054 ไม่นั่นไม่ได้ทำสิ่งเดียวกัน o / O ทำงานได้ทุกที่ในบรรทัดในโปรแกรมแก้ไขปกติคุณต้องไปที่จุดเริ่มต้นหรือจุดสิ้นสุดของบรรทัดก่อน นอกจากนี้หากคุณกำลังคัดลอกทั้งบรรทัดสิ่งทั้งหมดจะกลายเป็นเพียงการกดแป้นพิมพ์ครั้งเดียวเพื่อแทรกบรรทัดซึ่งเป็นโจทย์ทั่วไปในการเขียนโค้ด
GTD

คำตอบ:


73

ไม่นานหลังจาก: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>

2
ฉันรู้และฉันใช้มัน แต่ไม่ใช่สิ่งที่ฉันขอเพราะบางครั้งสิ่งที่คุณกำลังคัดลอกก็ไม่มี LF อยู่ในนั้น หากมีคำสั่ง "วางลงในบรรทัดใหม่" คำสั่งนี้จะใช้งานได้ไม่ว่าคุณกำลังจะวางเนื้อหาใดก็ตามดังนั้นคุณจะไม่ต้องคิดมาก
static_rtti

5
เอาล่ะ:pu[t]จะใส่ข้อความในบรรทัดใหม่หลังบรรทัดปัจจุบัน:pu[t]!จะใส่ข้อความในบรรทัดใหม่ก่อนบรรทัดปัจจุบัน ฉันจะแก้ไขคำตอบของฉันตามนั้น (ไชโยสำหรับ:help p.)
Bombe

2
ไม่ได้ดีไปกว่าโซลูชันปัจจุบันของฉัน แต่ฉันคิดว่ามันเป็นคำตอบที่ดีที่สุดสำหรับคำถามของฉัน
static_rtti

4
ในขณะที่จำนวนการกดแป้นพิมพ์เท่าเดิมฉันคิดว่ามันมีประสิทธิภาพมากกว่า o <Esc> p รู้สึกอึดอัด แต่ก็ไม่เป็นเช่นนั้น
Mark Story

2
คุณสามารถแมปคำสั่งกับคีย์ใดก็ได้รวมถึง p เอง: :nmap p :pu<CR>ใส่ไว้ในไฟล์. vimrc ของคุณและปิดคุณไป :)
Capi Etheriel

56

ตัวเลือก:

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

2
ฉันเดาว่าฉันจะทำแผนที่ ฉันแค่หวังว่าอาจมีโซลูชันมาตรฐาน: - / ขอบคุณสำหรับคำตอบของคุณ!
static_rtti

2
@AI: การใช้ ', p' (',' ถูกแมปเป็น <Leader> ของฉัน) เป็นทางออกที่ดีที่สุดในความคิดของฉัน YOu ยังมีฟังก์ชันที่ใช้งานง่าย :) สุดยอด!
ยังมีใครใช้ MS-DOS คุณใน

31

คุณสามารถวางบัฟเฟอร์ในโหมดแทรกโดยใช้<C-R>ตามด้วยชื่อของบัฟเฟอร์ที่จะวาง บัฟเฟอร์เริ่มต้นคือ"ดังนั้นคุณจะทำ

o<C-R>"

ฉันพบว่าฉันใช้<C-R>"บ่อยมากและผูกไว้กับ<C-F>vimrc ของฉัน:

inoremap <C-F> <C-R>"

2
วิธีนี้ดีมากเพราะจะทำให้การเยื้องถูกต้องหากไม่ได้เยื้องบรรทัดที่คัดลอก
CornSmith

24

สิ่งนี้ยังคงใช้การกดแป้นพิมพ์สามครั้ง แต่ฉันพบว่ามันง่ายกว่า Esc:

o<Alt-p>

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


2
วิธีที่มีประโยชน์มากเมื่อคุณลองใช้วิธีดึงที่คุณตัดภายในเส้นด้วย "d $" ในบรรทัดใหม่
Serhat Cevikel

ขออภัย แต่สิ่งนี้ไม่ได้เก็บการเยื้องไว้ แต่จะวางที่จุดเริ่มต้นของบรรทัดแทน
Michael Goldshteyn

ใครสามารถอธิบายวิธีนี้สำหรับ mac (ไม่มี alt) ได้อย่างละเอียด?
Li haonan

@Lihaonan คำถามของคุณมาจากเมื่อ 8 เดือนที่แล้วหวังว่าคุณจะเห็นstackoverflow.com/q/7501092/5407634
m_mlvx

14

การใช้ปลั๊กอินนี้: https://github.com/tpope/vim-unimpaired

]pวางบนบรรทัดด้านล่าง

[pวางบนบรรทัดด้านบน

ข้อดี:

  • ใช้งานได้กับข้อความที่ดึงออกมาทั้งหมด (คำบรรทัดอักขระ ฯลฯ )
  • เยื้องข้อความที่วางเพื่อให้ตรงกับการเยื้องของข้อความรอบ ๆ
  • การกดแป้น 2 ครั้งแทนที่จะเป็น 3 จังหวะและ "ง่ายกว่า" มาก
  • เร็ว

1
ของโปรดด้วย. อาจจะคุ้มค่าที่จะกล่าวถึงว่าคุณต้องการtpope/vim-unimpairedสิ่งนี้เพื่อให้ได้ผล😉
alextes

1
ฉันติดตั้งนานแล้วฉันลืมมันไปแล้ว ขอบคุณสำหรับการแจ้งเตือน!
crogers

9

โดยส่วนตัวแล้วฉันได้ตั้งชื่อEnter (CR) ไว้ดังนี้:

nmap <CR> o<Esc>k

... บนพื้นฐานนี้บทความที่เป็นกลุ่ม Wikia

ด้วยวิธีนี้ฉันสามารถสร้างบรรทัดใหม่ได้โดยตรงจากโหมดปกติและเมื่อรวมสิ่งนี้เข้ากับการต้องการวางลงในบรรทัดใหม่ด้านล่างฉันจะทำ:

<CR>jp

คุณสามารถข้ามkใน nmap ด้านบนได้โดยขึ้นอยู่กับฟังก์ชันที่คุณต้องการจากEnterดังนั้นมันก็จะเป็น<CR>pเช่นนั้น

ฉันได้เลียนแบบ jj เป็นEscด้วยซึ่งจะช่วยในกรณีนี้ด้วย Escอยู่ห่างจากแถวบ้านมากเกินไปสำหรับความสำคัญของมันในกลุ่ม

ไม่สั้นกว่าโซลูชันอื่น ๆ แต่ฉันคิดว่ามันให้ความรู้สึกอึดอัดน้อยกว่าบางส่วนและมีประโยชน์อื่น ๆ ด้วย


5

หากคุณกำลังคัดลอกทั้งบรรทัดจากนั้นวางทั้งบรรทัดให้ใช้Yเพื่อดึงเส้นหรือเส้นรวมทั้งตัวแบ่งบรรทัดในตอนแรกและpเพื่อวาง คุณยังสามารถใช้Vซึ่งเป็นโหมดเส้นภาพตรงกันข้ามกับvโหมดธรรมดาสำหรับโหมดภาพ


3
ปัญหาคือบางครั้งคุณไม่ต้องการคัดลอกทั้งบรรทัด ... ฉันต้องการวิธีแก้ปัญหาที่ได้ผลไม่ว่าฉันจะคัดลอกสิบบรรทัดหรือสองคำ
static_rtti

3

inoremap jj <ESC>ฉันมีการทำแผนที่ ดังนั้นมันจึงเป็นเรื่องง่ายที่จะแทรกบรรทัดใหม่ด้วยojjและแล้วOjjp

ดังนั้นojjpวางขึ้นบรรทัดใหม่ มันมีจังหวะอีกครั้งo<esc>pแต่ojjpมันง่ายสำหรับฉัน


2

ฉันพบวิธีแก้ปัญหาที่สวยงามสำหรับเรื่องนี้ หากคุณใส่ลงทะเบียน yank ในคลิปบอร์ดของระบบปฏิบัติการ (ซึ่งก็ยอดเยี่ยมอยู่ดี) ด้วย

set clipboard+=unnamed

o<Ctl-v>กว่าที่คุณสามารถทำได้

นอกจากจำนวนสโตรกที่น้อยลงแล้วสิ่งนี้ยังช่วยปรับปรุงทั้งสองอย่างo<Esc>pและ:puเนื่องจากมันรักษาการเยื้องไว้: ทั้งสองตัวเลือกอื่น ๆ เริ่มต้นที่ศูนย์อักขระในบรรทัดใหม่

ข้อแม้คือสิ่งนี้อาจขึ้นอยู่กับระบบปฏิบัติการหรือไม่ก็ได้ สิ่งที่ฉันรู้ก็คือมันใช้งานได้กับ OS X เวอร์ชันล่าสุด แต่คลิปบอร์ดเป็นเพียงหนึ่งในหลาย ๆ วิธีในการดึงข้อมูลในคลิปบอร์ดของระบบปฏิบัติการ


1

CTRL-R "หากคุณยังต้องการที่จะจบในโหมดแทรกมันเป็นไปได้ที่จะวางอยู่ในโหมดแทรกใช้ https://stackoverflow.com/a/2861909/461834

ยังคงมีการกดแป้นพิมพ์สามครั้ง แต่ไม่มีการหลบหนีและคุณจะบันทึกการกดแป้นพิมพ์หากคุณต้องการสิ้นสุดการแทรก


1

ฉันใช้การแมปต่อไปนี้ในการกำหนดค่า 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


1

หากคุณต้องการอยู่ในโหมดแทรกคุณสามารถทำได้ o ctrl+o p

  • o - แทรกโหมดและไปที่บรรทัดใหม่
  • ctrl+o - เรียกใช้คำสั่งเดียวเหมือนในโหมดปกติ
  • p - วาง

มันเป็นการกดแป้นพิมพ์สามครั้ง แต่คุณยังคงอยู่ในโหมดแทรกและยังo ctrl+oค่อนข้างเร็วดังนั้นฉันจึงถือว่าเป็นการกดแป้น 2.5


0

วิธีนี้ดูเหมือนจะใช้ได้เฉพาะเมื่อบล็อกของข้อความที่คัดลอกเริ่มต้นในบรรทัดใหม่ (ตรงข้ามกับการจับตัวอย่างข้อความที่ใดที่หนึ่งภายในบรรทัด) แต่คุณสามารถเริ่มคัดลอกด้วยอักขระสุดท้ายที่คุณต้องการจับได้จากนั้นนำทาง ไปยังอักขระสุดท้ายที่ท้ายบรรทัดก่อนเริ่มบล็อกการคัดลอกที่คุณต้องการ จากนั้นเมื่อคุณต้องการวางให้วางเคอร์เซอร์ที่ท้ายบรรทัดซึ่งคุณต้องการวางข้อความของคุณแล้วกด p หากฉันยังไม่เข้าใจคำอธิบายผิดพลาดสิ่งนี้ควรให้ผลที่คุณกำลังมองหา


0

หากคุณต้องการวางในnew lineและยังคงเยื้องให้สร้างการจับคู่นี้:

nnoremap <leader>p oq<BS><Esc>p

สิ่งที่ต้องมีก่อน: คุณได้แมปผู้นำและคุณมีset autoindentใน.vimrcไฟล์.

คำอธิบาย: บรรทัดใหม่ถูกสร้างขึ้นโดยพิมพ์ 'o', 'q' แล้วเว้นระยะห่าง (เพื่อให้การเยื้อง) และ 'esc' จะนำคุณกลับสู่โหมดปกติซึ่งคุณจะวางในที่สุด

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