ฉันจะสลับสองบรรทัดเป็นกลุ่มได้อย่างไร


94

ฉันมีสิ่งนี้:

pick 887b66f add 222 Dziewiecsil to flowers new title
pick dc331cb new name of beginning commit

และฉันต้องการรับสิ่งนี้:

pick dc331cb new name of beginning commit
pick 887b66f add 222 Dziewiecsil to flowers new title

มีวิธีทำอย่างรวดเร็วโดยใช้แป้นพิมพ์ลัดหรือไม่?


คุณอาจพิจารณาใช้โปรแกรมแก้ไขอื่นหากคุณไม่คุ้นเคยกับกลุ่ม คุณสามารถกำหนดค่าตัวแก้ไขสำหรับคอมไพล์โดยใช้อย่างใดอย่างหนึ่งgit config --global core.editor <whatever>เท่านั้นหรือหลาย ๆ อย่างพร้อมกัน (รวมถึงคอมไพล์) โดยรวมexport EDITOR=<whatever>ไว้ใน.bashrcไฟล์.
Sven Marnach

คำตอบ:


161

หากต้องการสลับบรรทัดปัจจุบันกับบรรทัดถัดไปให้พิมพ์ddpขณะอยู่ในโหมดคำสั่ง

  • dd - ลบบรรทัด (จริง ๆ แล้วเรียกว่าตัดในโปรแกรมแก้ไขอื่น ๆ ) และบันทึกในการลงทะเบียน
  • p - วางบรรทัดจาก register

3
ddpเลื่อนเคอร์เซอร์บนบรรทัดแรกแล้วพิมพ์ หากคุณยังไม่ได้อยู่ในโหมดคำสั่งให้กดEscเพื่อเข้าสู่โหมดคำสั่ง
Sven Marnach

32
ddลบบรรทัดปัจจุบันหลังจากคัดลอกลงใน "register" pคัดลอก ("puts") เนื้อหาของรีจิสเตอร์ลงในบัฟเฟอร์ของคุณหลังบรรทัดปัจจุบัน ในทำนองเดียวกันคุณสามารถสลับตัวละครทั้งสองด้วยหรือสองคำที่มีxp dwwP
Keith Thompson

@KeithThompson น่าเสียดายที่ไม่ง่ายอย่างนั้นในการสลับสองคำ
CS

@CS คุณกำลังอ้างถึงความจริงที่dwwPไม่ได้ผลเหมือนกันถ้าคำสองคำอยู่ท้ายบรรทัด? (และการสลับคำสุดท้ายในบรรทัดเดียวกับคำแรกในบรรทัดต่อไปนี้จะยุ่งยากกว่า)
Keith Thompson

1
@KeithThompson ใช่แม้ว่าฉันจะรู้สึกแย่หลังจากแสดงความคิดเห็นเพราะนั่นเป็นกรณีที่มีขอบตามตัวอักษร;)
CS

52

ddpลบบรรทัดปัจจุบันแล้วคุณสามารถวางสายที่ถูกนำออกใช้ mไม่มีทางที่แม้ว่าจะใช้ผู้อื่น ด้วยmคุณสามารถย้ายบรรทัดไปรอบ ๆ เช่น

:m 1 จะย้ายบรรทัดปัจจุบันหลังจากบรรทัดที่ 1

:m 0 จะย้ายบรรทัดปัจจุบันไปด้านบน

:m $ จะย้ายบรรทัดปัจจุบันไปที่ด้านล่าง

ในตัวอย่างของคุณวางเคอร์เซอร์ไว้ในบรรทัดแรกแล้วพิมพ์ :m $

ข้อมูลเพิ่มเติม: http://vim.wikia.com/wiki/Moving_lines_up_or_down


1
ขอบคุณสำหรับคำอธิบายสำหรับ "ชาวพื้นเมือง" ที่ไม่ใช่กลุ่ม :-)
Bruno Bieri

1
นี่คือคำตอบที่ฉันกำลังมองหาเพื่อเพิ่มพูนความรู้เกี่ยวกับกลุ่ม
Phemelo Khetho

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

8

แม้จะมีความจริงที่ว่าคำถามที่ค่อนข้างเก่าและทำเครื่องหมายเป็นคำตอบที่ฉันต้องการที่จะขยายคำตอบโดยบอกว่าคุณสามารถใช้คำสั่งโหมดปกติซึ่งมีให้โดยสเวน Marnachด้วยnnoremapเช่นดังนั้น:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp

ซึ่งจะช่วยให้คุณสามารถย้ายบรรทัดด้วยCtrl+ UpและCtrl+ Downภายในไฟล์ของคุณ อย่างไรก็ตามสิ่งนี้จะเขียนทับ@"register ซึ่งเก็บสตริง / word / letter / etc ที่คัดลอกล่าสุดของคุณ ดังนั้นโดยการเพิ่ม "(reg) ก่อนddและpคำสั่งเราสามารถแก้ไขสิ่งนี้ได้:

:nnoremap <C-Up> <Up>"add"ap<Up>
:nnoremap <C-Down> "add"ap

ที่นี่เราเพิ่ม"aก่อนลบและวางคำสั่งเพื่อจัดเก็บบรรทัดของเราใน@aregister ดังนั้น copy register เริ่มต้นของคุณจะไม่ถูกเขียนทับ อย่างไรก็ตามมันอาจเขียนทับเนื้อหาของ@aregister (ใครจะรู้ แต่คุณอาจใช้เพื่อบางอย่างที่สำคัญในกรณีการใช้งานของคุณ แต่ขั้นตอนนี้ค่อนข้างหวาดระแวงคุณสามารถข้ามไปได้หากต้องการ) มาแก้ไขด้วย:

:nnoremap <silent><C-Up> :let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr>
:nnoremap <silent><C-Down> :let save_a=@a<Cr>"add"ap:let @a=save_a<Cr>

( <silent>จำเป็นเพื่อป้องกันไม่ให้สะท้อนคำสั่งของเราไปยังบรรทัดข้อความที่ด้านล่าง)

ตอนนี้เรามีการแมปสองแบบซึ่งช่วยให้เราสามารถย้ายบรรทัดภายในไฟล์ด้วยแป้นพิมพ์ลัด คุณสามารถกำหนดปุ่มใหม่ได้ฉันใช้Alt+ j/ kซึ่งจะเป็น<A-j>และ<A-k>สำหรับคำสั่งเหล่านั้น อย่างไรก็ตามตัวเลียนแบบเทอร์มินัลบางตัวไม่รองรับการแมปคีย์ Alt AFAIK


3

ตัวอย่าง:

  1. one
> 2. two

ด้วย:m-2สวิตช์ (สายปัจจุบัน - 2)

> 2. two
  1. one

พร้อม:m+1สวิตช์ (สายปัจจุบัน + 1)

  1. one
> 2. two

คุณสามารถจับคู่สิ่งนี้ได้หากต้องการ



1
นี่คือคำตอบที่ดีกว่าคำตอบเริ่มต้น
Alex Bin Zhao

0

การแมปที่เสนอในหน้า Vim wikiaเป็นวิธีที่ดีที่สุดในการแมปคีย์ผสมที่เลียนแบบวิธีที่ Sublime และตัวแก้ไขอื่น ๆ ใช้คุณสมบัตินี้

ซึ่งรวมถึงการเยื้องหลังการย้ายซึ่งก็ยอดเยี่ยมเช่นกัน (นั่นคือ==เครื่องหมายเท่ากับสองเท่าในกรณีที่คุณไม่ต้องการ)

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

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

ฉันจับคู่พวกเขากับ<D-J>และ<D-K>บน Mac เป็นการส่วนตัวแทนที่จะ<A-จับคู่กับAltคีย์ ด้วยวิธีนี้ฉันใช้Cmd+ Shift+ j/ kซึ่งให้ความรู้สึกเป็นธรรมชาติกับปลายนิ้วของฉัน

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