ฉันจะย้ายเส้นได้อย่างง่ายดายได้อย่างไร?


47

คำสั่ง (หรือทางลัด) เพื่อย้ายบรรทัดขึ้นหรือลงในกลุ่มคืออะไร? เวิร์กโฟลว์ปัจจุบันของฉันคือการดึง (คัดลอก) บรรทัดและกว่าลบบรรทัดนั้นและแทนที่จะวาง (วาง) บรรทัดนั้น


8
เนื่องจากการลบการตัดจริงคุณสามารถข้ามการดึง: การddkPเลื่อนลงทำได้ง่ายขึ้น: ddp.
muru

ดูเพิ่มเติมที่: vi.stackexchange.com/questions/598/…
Rich

คำตอบ:


52

ขั้นแรกคุณไม่จำเป็นต้องดึงและลบ; หลังจะใส่เนื้อหาที่ถูกลบในการลงทะเบียน (เริ่มต้นหรือที่ระบุ) ดังนั้นddp/ ddkPเป็นคำสั่งทั่วไปในการย้ายหนึ่งบรรทัดขึ้น / ลง

หรือคุณสามารถใช้:moveคำสั่งเช่น:move +1/ :move -2; สิ่งนี้จะไม่ขัดขวางการลงทะเบียนและคุณสามารถย้ายช่วงทั้งหมดได้ คุณสามารถกำหนดการแมปกุญแจได้อย่างง่ายดายเพื่อย่อให้สั้นลง

หากคุณไม่คำนึงถึงปลั๊กอิน (และความสะดวกสบายเพิ่มเติมที่มักจะมาพร้อมกับพวกเขา) ทั้งปลั๊กอินที่ไม่มีการควบคุมของTim Pope และปลั๊กอิน LineJugglerของฉันจะให้]e/ [eการแมปเพื่อย้ายเส้น (และอื่น ๆ อีกมากมาย; บรรทัด (s))


36

วิธีที่ง่ายที่สุดคือ: :m+หรือ:m-2คำย่อใด:moveตามที่แนะนำโดย Ingo

หรือใช้โหมดภาพ ( V) โดยการตัดบรรทัด ( d/ x) แล้ววาง ( p- เคอร์เซอร์ด้านล่างเคอร์เซอร์Pด้านบน) หลังจากที่คุณเลื่อนเคอร์เซอร์ไปยังตำแหน่งที่ถูกต้องก่อนที่จะวาง (ดังนั้นโดยสรุปคือVxp/ Vdp)

เมื่อย้ายหลายบรรทัดในโหมดภาพคุณต้องใช้:m '>+1(เพื่อเลื่อนหนึ่งบรรทัดลง) หรือ:m '<-2(เพื่อเลื่อนหนึ่งบรรทัดขึ้นไป)


นี่คือตัวอย่างการแม็พที่มีประโยชน์ ( Shift+ ↑/ Shift+↓):

nnoremap <S-Up> :m-2<CR>
nnoremap <S-Down> :m+<CR>
inoremap <S-Up> <Esc>:m-2<CR>
inoremap <S-Down> <Esc>:m+<CR>

ซึ่งคล้ายกับ Sublime Text ( Win / OSX )

นี่คือบางส่วนที่แนะนำที่vim wikia :

nnoremap <A-j> :m .+1<CR>==
nnoremap <A-k> :m .-2<CR>==
inoremap <A-j> <Esc>:m .+1<CR>==gi
inoremap <A-k> <Esc>:m .-2<CR>==gi
vnoremap <A-j> :m '>+1<CR>gv=gv
vnoremap <A-k> :m '<-2<CR>gv=gv

ในโหมดปกติหรือในโหมดแทรกให้กด Alt-j เพื่อย้ายบรรทัดปัจจุบันลงหรือกด Alt-k เพื่อเลื่อนบรรทัดปัจจุบันขึ้น

หลังจากเลือกบล็อกของเส้นสายตา (ตัวอย่างเช่นโดยการกด V จากนั้นเลื่อนเคอร์เซอร์ลง), กด Alt-j เพื่อเลื่อนทั้งบล็อกลงหรือกด Alt-k เพื่อเลื่อนบล็อกขึ้น

ดูสิ่งนี้ด้วย:


2
+1 สำหรับลิงก์ Vim wikia เรียนรู้บางสิ่งที่นั่น
Gonçalo Ribeiro

ไม่ทราบสาเหตุ แต่ทำงานได้ดีใน Gvim แต่ไม่ทำงานอย่างที่คาดไว้ใน terminal vim (ดูเหมือนว่าเป็นปัญหาของ tmux)
CodyChan

11

หากฉันต้องการสลับหนึ่งบรรทัดด้วยบรรทัดด้านบนฉันมักจะทำสิ่งต่อไปนี้

ddkP

คำอธิบาย

  • dd จะลบบรรทัดและเพิ่มลงในการลงทะเบียนเริ่มต้น
  • k จะเลื่อนขึ้นบรรทัด (j จะเลื่อนลงบรรทัด)
  • P จะวางเหนือบรรทัดปัจจุบัน

3
หากต้องการย้ายบรรทัดปัจจุบันลงให้ใช้ddp
Qinjie

4

FWIW นี่คือสิ่งที่ฉันใช้มานานหลายปี มันเลื่อนบรรทัดปัจจุบันขึ้นและลงในโหมดปกติหรือการเลือกในโหมดภาพในขณะที่ปรับการเยื้องโดยอัตโนมัติ

nnoremap ,<Up>   :<C-u>silent! move-2<CR>==
nnoremap ,<Down> :<C-u>silent! move+<CR>==
xnoremap ,<Up>   :<C-u>silent! '<,'>move-2<CR>gv=gv
xnoremap ,<Down> :<C-u>silent! '<,'>move'>+<CR>gv=gv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.