Bagaimana cara menukar dua baris di vim?

94

Aku punya ini:

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

Dan saya ingin mendapatkan ini:

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

Adakah cara untuk melakukan ini dengan cara cepat menggunakan pintasan keyboard?

Bartłomiej Semańczyk
sumber
Anda dapat mempertimbangkan untuk menggunakan editor yang berbeda jika Anda tidak terbiasa dengan vim. Anda dapat mengkonfigurasi editor untuk git hanya baik menggunakan git config --global core.editor <whatever>, atau untuk banyak hal sekaligus (termasuk git) dengan memasukkan export EDITOR=<whatever>dalam Anda .bashrc.
Sven Marnach

Jawaban:

160

Untuk menukar baris saat ini dengan yang berikutnya, ketik ddpsaat dalam mode perintah.

  • dd - hapus baris (sebenarnya disebut potong di editor lain) dan simpan di register
  • p - tempel baris dari register
Sven Marnach
sumber
3
Pindahkan kursor di baris pertama, lalu ketik ddp. Jika Anda belum berada dalam mode perintah, tekan Escuntuk masuk ke mode perintah.
Sven Marnach
32
ddmenghapus baris saat ini setelah menyalinnya ke "register". pcopy ("put") isi register ke buffer Anda setelah baris saat ini. Demikian pula, Anda dapat menukar dua karakter dengan xp, atau dua kata dengan dwwP.
Keith Thompson
@Keompson sayangnya, tidak semudah itu menukar dua kata.
CS
@ CS Apakah Anda mengacu pada fakta yang dwwPtidak bekerja dengan cara yang sama jika dua kata berada di akhir baris? (Dan menukar kata terakhir pada satu baris dengan kata pertama pada baris berikutnya bahkan lebih rumit.)
Keith Thompson
1
@KeithThompson ya, meskipun saya merasa agak buruk setelah membuat komentar saya karena itu kasus tepi literal;)
CS
52

ddmenghapus baris saat ini, lalu Anda dapat menempelkan baris yang dihapus menggunakan p. Ada cara lain meskipun menggunakan m. Dengan mAnda dapat memindahkan garis sekitar yaitu

:m 1 akan memindahkan baris saat ini setelah baris 1

:m 0 akan memindahkan baris saat ini ke atas

:m $ akan memindahkan baris saat ini ke bawah

Dalam contoh Anda, letakkan kursor di baris dan ketik pertama :m $

Info lebih lanjut: http://vim.wikia.com/wiki/Moving_lines_up_or_down

Tn. Eigenbart
sumber
1
Terima kasih atas penjelasan untuk non vim "pribumi" :-)
Bruno Bieri
1
Ini adalah jawaban yang juga saya cari untuk memperluas pengetahuan saya tentang vim.
Phemelo Khetho
Terima kasih! Inilah jawaban yang selama ini saya cari. Ini bisa menjadi lebih praktis saat menggesek beberapa baris secara bersamaan menggunakan mode visual.
Kareem Jeiroudi
8

Terlepas dari kenyataan bahwa pertanyaan itu cukup lama dan ditandai sebagai terjawab, saya ingin memperluas jawaban dengan mengatakan bahwa Anda dapat menggunakan perintah mode normal, yang disediakan oleh Sven Marnach dengan nnoremapseperti ini:

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

Ini akan memungkinkan Anda untuk memindahkan baris dengan Ctrl+ Updan Ctrl+ Downdalam file Anda. Namun ini akan menimpa @"register, yang menyimpan string / kata / huruf / dll yang terakhir disalin. Jadi dengan menambahkan "(reg) before dddan pperintah kita bisa memperbaiki ini:

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

Di sini kami menambahkan "asebelum menghapus dan menempelkan perintah untuk menyimpan baris kami di @aregister, sehingga register salinan default Anda tidak akan ditimpa. Namun ini mungkin menimpa konten @aregister (siapa tahu, tapi Anda dapat menggunakannya untuk sesuatu yang penting dalam kasus penggunaan Anda, tetapi langkah ini agak paranoid, Anda dapat melewatkannya jika Anda mau), mari perbaiki itu juga:

: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>diperlukan untuk mencegah menggemakan perintah kami ke baris pesan di bagian bawah.)

Sekarang kami memiliki dua pemetaan yang memungkinkan kami untuk memindahkan baris di dalam file dengan pintasan keyboard. Anda dapat mendefinisikan ulang tombol, saya menggunakan Alt+ j/ k, yang akan menjadi <A-j>dan <A-k>untuk perintah tersebut. Namun tidak semua emulator terminal mendukung pemetaan tombol Alt AFAIK.

Andrey Orst
sumber
3

Contoh:

  1. one
> 2. two

dengan :m-2, sakelar (baris saat ini - 2)

> 2. two
  1. one

dengan :m+1saklar (baris saat ini + 1)

  1. one
> 2. two

Anda bisa memetakan ini jika Anda mau.

cjadeveloper
sumber
1
Ini adalah jawaban yang lebih baik daripada jawaban default
Alex Bin Zhao
0

Pemetaan yang diusulkan di halaman wiki Vim sebenarnya adalah cara terbaik untuk memetakan kombinasi tombol yang meniru cara Sublime dan editor lain menerapkan fitur ini.

Ini termasuk tindakan indentasi setelah pindah, yang juga bagus (itu adalah tanda ganda yang sama ==, jika Anda tidak menginginkannya).

Ini juga mendukung mode visual dan penyisipan , sehingga Anda dapat memindahkan garis saat mengedit atau dengan fulblock.

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

Saya pribadi memetakannya ke <D-J>dan <D-K>di Mac saya, alih-alih <A-memetakannya ke Altkunci. Dengan cara itu saya menggunakan Cmd+ Shift+ j/ k, yang terasa lebih alami di ujung jari saya.

ojosilva
sumber