Cara lebih cepat untuk memindahkan blok teks

25

Inilah cara saya biasanya menyalin blok teks atau kode:

  1. Pilih blok dengan mode Visual ( V) dan hapus dengan d; atau jika hanya satu baris, gunakan saja dd.
  2. Pergi ke tempat yang saya inginkan teksnya, saya terlalu bodoh untuk mengingat perbedaan antara pdan P, jadi saya mendapatkan ini dengan benar sekitar 50% dari waktu. (jika saya salah: batalkan coba lagi).
  3. Kadang-kadang, lekukan perlu disesuaikan, jadi saya kembali ke mode Visual Vdan memilih kembali blok yang sama, dan menggunakan >atau <untuk memperbaikinya.

Apakah ada cara yang lebih mudah? Dalam beberapa editor saya telah melihat bahwa Anda dapat "mengambil" satu blok teks, seolah-olah, dan memindahkannya; inilah contoh dari Emacs (tapi saya juga pernah melihat ini di editor lain):

Emacs

Atau mungkin ada cara lain (bahkan lebih baik)?

Martin Tournoij
sumber
Tentang masalah lekukan, Anda dapat menyelesaikannya dengan menempelkan ]patau [pbukan patau P. Dengan cara ini blok yang Anda tempel akan diindentifikasi secara otomatis.
Gonçalo Ribeiro
Anda mungkin ingin menonton screencast oleh Drew Neil Bubbling Text yang merekomendasikan untuk menggunakan vim-unimpaired .
Hotschke

Jawaban:

13

Ada plugin untuk itu: dragvisuals.vim .

Ini tidak mengikat tombol apa pun secara default, jadi Anda harus melakukannya sendiri. Saya suka memetakannya ke Control+ Arrow key:

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')

Itu juga dilengkapi dengan kunci bonus untuk menduplikasi pilihan saat ini:

xmap <expr> D DVB_Duplicate()

Keuntungan dari plugin ini dibanding jawaban lain:

  • Tidak menghilangkan teks apa pun jika Anda mencoba untuk bergerak lebih jauh dari baris pertama.
  • Ini akan memperluas file jika Anda bergerak di bawah baris terakhir.
  • Pindah ke kiri / kanan bekerja sedikit lebih baik.

Trik lain yang berguna untuk melengkapi ini, adalah keybinds ini:

xnoremap > >gv
xnoremap < <gv

Ini akan memilih kembali pemilihan visual terakhir setelah Anda gunakan >saat dalam mode Visual, sehingga Anda dapat menyesuaikan penyelarasan lebih mudah (Anda juga dapat menggunakan tombol panah, tetapi ini akan memindahkannya dengan satu karakter, dan bukan satu shiftwidth).

Jay Thompson
sumber
1
Ada plugin lain untuk ini yang oleh penulis plugin saya yang disarankan menggambarkan sebagai "pengerjaan ulang yang lebih baik dari dragvisuals.vim saya sendiri": github.com/zirrostig/vim-schlepp
Jay Thompson
8

Untuk langkah 3, Anda dapat menggunakan gv=sebagai gantinya ( =berarti indentasi, dan gvberarti "pilih kembali pemilihan visual terakhir").

Untuk perilaku Emacs, akan sangat mudah untuk menambahkan beberapa pemetaan di .vimrc Anda:

vnoremap <down> dpV`]
vnoremap <up> dkPV`]

Anda kemudian dapat menggunakan tombol panah atas dan bawah untuk bergerak di sekitar pilihan garis visual. (Tentu saja, Anda dapat memetakan ke tombol yang berbeda juga jika Anda membenci panah.)

(Anda bisa melakukan ini dengan pilihan visual normal dan memindahkannya ke kiri dan kanan juga: vnoremap <left> dhPgvhohodan vnoremap <right> dpgvlolo.)

Gagang pintu
sumber
gvpergi ke pemilihan visual terakhir, yang dalam hal ini akan menjadi paragraf yang telah dihapus. Apa yang saya lewatkan?
Robert Smith
4

Anda dapat memetakan kembali beberapa tombol untuk memindahkan garis. Misalnya, panah ke atas dan ke bawah jika Anda terbiasa bergerak hjkl.

Misalnya pada .vimrc

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:m, perintah normal untuk memindahkan satu baris

+1atau -2untuk menunjukkan garis naik atau turun (-1 menjaga garis di tempat yang sama)

gvuntuk memilih lagi teks yang sama dalam VISUALmode

Solusi ini tidak mengganggu register, sehingga setiap teks yang disalin masih akan tersedia, serta memformat ulang kode untuk mengatur lekukan yang tepat, dll.

Khelben
sumber
Ini bagus, tetapi tidak untuk saya, karena saya tidak suka menggunakan =(sering mengubah format yang tidak berhubungan terlalu banyak untuk saya).
Martin Tournoij
3

Ada beberapa plugin untuk ini tetapi saya lebih suka vim- unimpaired Tim Pope ( github ) (Ingo Karkat LineJuggler serupa).

Anda secara visual memilih blok teks Anda kemudian lakukan ]e(e untuk pertukaran) untuk memindahkan blok ke bawah ( [euntuk arah lain). Gunakan .untuk mengulangi tindakan (Anda sudah menginstal repeat.vim, bukan). Jika Anda melangkah terlalu jauh maka batalkan saja melalui u.

Sekarang secara pribadi saya berpikir pdan Pmerupakan perintah umum sehingga akan lebih baik untuk mempelajarinya sebelum menciptakan kebiasaan buruk. Maka Anda bisa menggunakan ]puntuk menempel pada indentasi yang sama. Jika Anda menggunakan yang tidak rusak, Anda dapat melakukan >puntuk menempelkan level indensi lebih dalam atau =puntuk menempel dan memformat ulang.

Jika Anda kesulitan mengingat pdan Pkemudian mungkin membantu Anda untuk memikirkan mereka dalam hal odan Operintah yang merupakan semacam simetri.

Seperti yang telah dicatat orang lain, Anda dapat menggunakan gvuntuk memilih kembali pilihan visual. Namun jika Anda hanya meletakkan / menempelkan teks Anda akan kehilangan pilihan visual Anda. Jangan khawatir karena setiap perubahan (dan yank!) Akan mengatur '[dan di ']sekitar area yang diubah. Jadi Anda dapat membuat indentasi melalui >'](baca: bergeser ke kanan hingga akhir dari perubahan terakhir) dan gunakan .untuk mengulangi indentasi hingga Anda memiliki teks di tempat yang tepat.

Untuk bantuan lebih lanjut lihat:

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv
Peter Rincker
sumber
2

Jika Anda tahu nomor baris yang ingin Anda pindahkan blok teks, maka Anda dapat menggunakan rentang atau pemilihan visual dengan :moveperintah untuk memindahkan blok ke sana.

Misalnya, jika saya memiliki file berikut:

1 aaa
2 bbb
3 ccc
4 ddd

dan saya ingin memindahkan garis a ke setelah garis c, saya meletakkan kursor pada garis a dan masuk :m3, dan garis tersebut kemudian digeser.

Ini juga berfungsi dengan +/- offset. Pada contoh di atas, hasil yang sama dapat dicapai dengan :m+2memindahkan garis 2 ke bawah.

Untuk blok teks, satu-satunya perbedaan adalah menambahkan dalam rentang atau pilihan. Untuk memindahkan garis aaa dan bbb ke akhir file, gunakan perintah seperti :1,2m$($ = baris terakhir) atau pilih secara visual baris dan :m$.

Buang air besar
sumber
1
Untuk tips lebih lanjut tentang :movelihat juga vim.wikia.com/wiki/Moving_lines_up_or_down atau Tip 29 Gandakan atau Pindahkan Baris Menggunakan ': t' dan ': m' Perintah dalam Buku Praktis Vim oleh D. Neil.
Hotschke