Bagaimana saya bisa dengan mudah memindahkan garis?

47

Apa perintah (atau pintasan) untuk memindahkan garis ke atas atau ke bawah di vim? Alur kerja saya saat ini adalah untuk menarik (menyalin) baris dan daripada menghapus garis itu dan daripada untuk menempatkan (menempel) garis itu.

Vader
sumber
8
Sejak menghapus sebenarnya pemotongan, Anda dapat melewatkan yank yang: ddkP, bergerak turun lebih mudah: ddp.
muru

Jawaban:

52

Pertama, Anda tidak perlu menarik dan menghapus; yang terakhir juga akan memasukkan konten yang dihapus ke dalam register (default atau ditentukan). Oleh karena itu, ddp/ ddkPadalah perintah umum untuk memindahkan satu baris ke bawah / atas.

Atau, Anda dapat menggunakan :moveperintah, yaitu :move +1/ :move -2; ini tidak merusak register, dan Anda juga dapat memindahkan seluruh rentang. Anda dapat dengan mudah menentukan pemetaan kunci untuk mempersingkat ini.

Jika Anda tidak keberatan dengan plugin (dan kenyamanan tambahan yang sering menyertainya), baik plugin Tim Pope yang tidak rusak dan plugin LineJuggler saya menyediakan ]e/ [ememetakan untuk memindahkan garis (dan beberapa lainnya; Tim untuk berbagai penggunaan, tambang fokus pada penanganan baris)

Ingo Karkat
sumber
36

Yang termudah adalah: :m+atau :m-2yang merupakan singkatan :moveseperti yang disarankan Ingo.

Atau menggunakan mode visual ( V) dengan memotong garis ( d/ x) lalu menempelkannya ( p- kursor di bawah, di Patas kursor) setelah Anda memindahkan kursor ke tempat yang tepat sebelum menempel (jadi dalam ringkasan itu Vxp/ Vdp).

Saat memindahkan beberapa baris dalam mode visual, maka Anda harus menggunakan :m '>+1(untuk memindahkan satu baris ke bawah) atau :m '<-2(untuk memindahkan satu baris ke atas).


Berikut adalah contoh pemetaan bermanfaat ( 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>

yang mirip dengan Sublime Text ( Win / OSX ).

Berikut adalah beberapa yang disarankan di 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

Dalam mode normal atau dalam mode insert, tekan Alt-j untuk memindahkan garis saat ini ke bawah, atau tekan Alt-k untuk memindahkan garis saat ini ke atas.

Setelah secara visual memilih blok garis (misalnya, dengan menekan V lalu menggerakkan kursor ke bawah), tekan Alt-j untuk memindahkan seluruh blok ke bawah, atau tekan Alt-k untuk memindahkan blok ke atas.

Lihat juga:

kenorb
sumber
2
+1 untuk tautan wikia Vim. Belajar beberapa hal di sana.
Gonçalo Ribeiro
Tidak tahu mengapa, tetapi mereka bekerja sangat baik di Gvim, tetapi tidak berfungsi seperti yang diharapkan dalam terminal vim. (Tampaknya ini adalah masalah tmux)
CodyChan
11

Jika saya ingin menukar satu baris dengan baris di atas, saya biasanya melakukan hal berikut

ddkP

Penjelasan

  • dd akan menghapus baris dan menambahkannya ke register default.
  • k akan bergerak ke atas garis (j akan pindah ke bawah garis)
  • P akan menempel di atas garis saat ini
venkatvb
sumber
3
Untuk memindahkan garis saat ini ke bawah, gunakanddp
Qinjie
4

FWIW, inilah yang saya gunakan selama bertahun-tahun. Ini memindahkan garis saat ini ke atas dan ke bawah dalam mode normal atau pemilihan dalam mode visual, sambil menyesuaikan lekukan secara otomatis.

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
romainl
sumber