Bagaimana cara menduplikasi seluruh baris di Vim at Eclipse?

1624

Bagaimana cara menduplikasi seluruh baris dalam Vim dengan cara yang mirip dengan Ctrl+ Ddi IntelliJ IDEA / Resharper atau Ctrl+ Alt+ / di Eclipse ?

Sumek
sumber
49
Apakah orang tidak menjalankan vimtutor lagi? Ini mungkin dalam lima menit pertama belajar cara menggunakan Vim.
dash-tom-bang
131
Apakah Anda ingin menduplikasi baris ini? Yadalah Psewa. :)
Stavr00
3
FWIW Saya telah melakukan vimtutor sekitar belasan kali dalam 2 bulan terakhir dan konsep ini tidak tercakup. Ini memberitahu cara melakukan "dd" dan "v - navigasikan - y" diikuti oleh "p". Ia tidak memberi tahu cara menyalin satu baris tanpa menghapusnya seperti yang diminta di sini.
danielson317

Jawaban:

2768

yyatau Yuntuk menyalin baris (mnemonic: y ank )
atau
ddke d elete garis (salinan Vim apa yang Anda dihapus menjadi clipboard-seperti "mendaftar", seperti cut operasi)

kemudian

puntuk p Aste disalin atau dihapus teks setelah baris saat ini
atau
Puntuk p Aste teks disalin atau dihapus sebelum baris saat ini

Mark Biek
sumber
129
Poin yang sangat bagus. Untuk beberapa alasan, saya menemukan bahwa memukul y dua kali lebih cepat bagi saya daripada SHIFT-y
Mark Biek
25
@camflan Saya pikir Y harus "menyalin dari kursor ke akhir"
Dzung Nguyen
42
dan 2yy dapat digunakan untuk menyalin 2 baris (dan untuk n lainnya)
Amir Ali Akbari
5
@nXqd: Ya, persentase besar pengguna peta Yuntuk y$. (Konsisten dengan Ddan C; (tetapi tidak kompatibel dengan Vi (tidak ada yang peduli.))) Itu bahkan diusulkan dalam :help Y.
Aaron Thoma
11
Untuk menyalin dua baris, itu lebih cepat hanya untuk pergi yjatau yk, terutama karena Anda tidak menggandakan pada satu karakter. Plus, ykadalah versi mundur yang 2yytidak dapat dilakukan, dan Anda dapat menempatkan jumlah garis untuk mencapai mundur dalam y9jatau y2k, dll. Satu-satunya perbedaan adalah bahwa hitungan Anda harus n-1untuk total ngaris, tetapi kepala Anda dapat mengetahui bahwa bagaimanapun.
zelk
406

Mode normal: lihat jawaban lain.

Cara Ex :

  • :t. akan menduplikasi baris,
  • :t 7 akan menyalinnya setelah baris 7,
  • :,+t0akan menyalin baris saat ini dan selanjutnya di awal file ( ,+adalah sinonim untuk kisaran .,.+1),
  • :1,t$akan menyalin garis dari awal hingga posisi kursor hingga akhir ( 1,adalah sinonim untuk rentang 1,.).

Jika Anda perlu memindahkan alih-alih menyalin, gunakan :malih-alih :t.

Ini bisa sangat kuat jika Anda menggabungkannya dengan :gatau :v:

  • :v/foo/m$ akan memindahkan semua baris yang tidak cocok dengan pola "foo" ke akhir file.
  • :+,$g/^\s*class\s\+\i\+/t.akan menyalin semua baris berikutnya dari formulir class xxxtepat setelah kursor.

Referensi: :help range, :help :t, :help :g, :help :mdan:help :v

Benoit
sumber
1
Ketika Anda menekan :dalam mode visual, itu ditransformasikan menjadi '<,'>sehingga pra-memilih rentang garis seleksi visual yang terbentang. Jadi, dalam mode visual, :t0akan menyalin garis di awal.
Benoit
1
Sebagai catatan: ketika Anda mengetik titik dua (:) Anda masuk ke mode baris perintah di mana Anda dapat memasukkan perintah Ex. vimdoc.sourceforge.net/htmldoc/cmdline.html Perintah ex bisa sangat kuat dan singkat. Solusi yyp adalah perintah "Mode normal". Jika Anda ingin menyalin / memindahkan / menghapus garis yang jauh atau rentang garis, perintah Ex bisa jauh lebih cepat.
Niels Bom
7
Diturunkan bukan karena masalah dengan jawaban seperti itu (walaupun itu tidak akan berhasil untuk situasi saya, saya tidak tahu nomor baris yang ingin saya duplikat) tetapi karena BENAR-BENAR tidak boleh menjadi jawaban teratas / diterima untuk ini pertanyaan yang sering dicari.
mjaggard
9
@ mjaggard: jawaban yang diterima selalu di atas, terlepas dari skor mereka. Ya saya menambahkan jawaban itu sebagai pelengkap, dan sepertinya cocok dengan OP.
Benoit
7
:t.adalah jawaban tepat untuk pertanyaan itu.
Burak Erdem
294

YPatau Ypatau yyp.

Linulin
sumber
Ybiasanya dipetakan kembali ke y$(yank (copy) sampai akhir baris (dari posisi kursor saat ini, bukan awal baris)) sekalipun. Dengan baris ini di .vimrc::nnoremap Y y$
Aaron Thoma
1
Jangan lupa tua yang malangyyP
icc97
253

salin dan tempel dalam vim

Tidak ada yang lebih sederhana dari ini! Dari mode normal:

yy

kemudian pindah ke baris yang ingin Anda tempelkan di dan

p
Adam
sumber
34
Apa yang Anda gunakan untuk membuat gif?
Zoltán
4
@ Zoltán Anda dapat menggunakan LiceCap, yang berukuran kecil
onmyway133
53

yy

akan menarik garis saat ini tanpa menghapusnya

dd

akan menghapus baris saat ini

p

akankah putsebuah garis diraih oleh salah satu metode sebelumnya

pjz
sumber
3
Yang ini didahulukan tetapi duplikatnya diterima: stackoverflow.com/a/73357/1438029
Geoffrey Hale
44

Melakukan hal ini:

Pertama, yymenyalin garis saat ini, dan kemudian pmenempel.

Eric Z Beard
sumber
20
Jangan ketik spasi.
Niels Bom
1
Ya, jika kursor berada di ujung garis dan Anda mengetik spasi seperti yang ditunjukkan, Anda akan menduplikasi garis yang Anda tarik 2 baris di bawah garis yang Anda tarik.
44

Jika Anda menginginkan cara lain:

"ayy: Ini akan menyimpan baris dalam buffer a.

"ap: Ini akan menempatkan isi buffer apada kursor.

Ada banyak variasi dalam hal ini.

"a5yy: Ini akan menyimpan 5 baris dalam buffer a.

Lihat " File bantuan Vim untuk lebih banyak kesenangan.

Kwondri
sumber
Terima kasih, saya menggunakan ini sebagai bind: map <Leader> d "ayy" ap
frbl
39

yyp - ingat itu dengan "yippee!"

Beberapa baris dengan angka di antaranya:

y7yp

theschmitzer
sumber
17
7yy setara dengan y7y dan mungkin lebih mudah diingat bagaimana melakukannya.
graywh
10
y7yp (atau 7yyp) jarang bermanfaat; kursor tetap berada pada baris pertama yang disalin sehingga p menempel garis yang disalin antara baris pertama dan kedua dari sumber. Untuk menduplikasi satu blok baris gunakan 7yyP
Nefrubyr
@Nefrubyr atau :.,.+7 copy .+7: P
DarkWiiPlayer
23

yyp - tempel setelah

yyP - tempel sebelumnya

yemu
sumber
6
Karena garis diduplikasi, hasil akhir dari konten adalah sama
Acumenus
4
@ ABB Namun, ada perbedaan miniatur di sini - baris apa yang akan digunakan kursor Anda.
Mikk
12

Saya suka: Shift+ v(untuk memilih seluruh baris segera dan membiarkan Anda memilih jalur lain jika Anda mau), y, hlm

Xavier Guihot
sumber
11

Anda juga dapat mencoba <Cx> <Cl> yang akan mengulangi baris terakhir dari mode penyisipan dan memberi Anda jendela penyelesaian dengan semua baris. Ini berfungsi hampir seperti <Cp>


sumber
Ini sangat berguna, tetapi untuk menghindari harus menekan banyak tombol saya telah memetakannya hanya CTRL-L, ini adalah peta saya: inoremap ^ L ^ X ^ L
Jorge Gajon
11

Opsi lain adalah dengan:

nmap <C-d> mzyyp`z

memberi Anda keuntungan mempertahankan posisi kursor.

Benteng
sumber
10

Untuk seseorang yang tidak tahu vi, beberapa jawaban dari atas mungkin menyesatkannya dengan frasa seperti "tempel ... setelah / sebelum baris saat ini ".
Ini sebenarnya "tempel ... setelah / sebelum kursor ".

yyatau Yuntuk menyalin garis
atau
dduntuk menghapus garis

kemudian

puntuk menyisipkan teks disalin atau dihapus setelah itu kursor
atau
Puntuk menyisipkan teks disalin atau dihapus sebelum yang kursor


Untuk pengikatan kunci lainnya, Anda dapat mengunjungi situs ini: vi Daftar Binding Kunci Lengkap

Michael
sumber
3

1 gotcha: ketika Anda menggunakan "p" untuk meletakkan garis, itu meletakkannya setelah garis kursor Anda aktif, jadi jika Anda ingin menambahkan garis setelah garis yang Anda tarik, jangan gerakkan kursor ke bawah garis sebelum meletakkan baris baru.

cori
sumber
4
atau gunakan modal P - taruh sebelum
Ghoti
3

Defaultnya adalah yyp, tapi saya sudah menggunakan rebinding ini selama setahun atau lebih dan menyukainya:

" set Y to duplicate lines, works in visual mode as well. nnoremap Y yyp vnoremap Y y`>pgv

Chris Penner
sumber
3

Aku tahu aku terlambat ke pesta, tapi apalah; Saya memilikinya di .vimrc saya:

nnoremap <C-d> :copy .<CR>
vnoremap <C-d> :copy '><CR>

yang :copyperintah hanya salinan garis yang dipilih atau kisaran (selalu seluruh baris) di bawah nomor baris yang diberikan sebagai argumen.

Dalam mode normal yang dilakukan adalah copy . menyalin baris ini tepat di bawah baris ini .

Dan dalam mode visual itu berubah menjadi '<,'> copy '> salinan dari awal seleksi ke akhir seleksi ke baris di bawah akhir seleksi .

DarkWiiPlayer
sumber
1
↑↑ jawaban terbaik di sini!
2

Bagi mereka yang mulai belajar vi, berikut adalah pengantar vi yang baik dengan mendaftar perintah berdampingan vi untuk gerakan kursor Windows GUI Editor dan tombol pintas khas. Ini mencantumkan semua perintah dasar termasuk yy(salin baris) dan p(tempel setelah) atau P(tempel sebelumnya).

vi (Vim) untuk Pengguna Windows

ap-osd
sumber
1

Jika Anda ingin menduplikasi baris dan menempelkannya langsung di bawah seperti saat ini, seperti di Sublime Ctrl+ Shift+ D, maka Anda dapat menambahkan ini ke .vimrcfile Anda .

nmap <S-C-d> <Esc>Yp

Atau, untuk mode Sisipkan:

imap <S-C-d> <Esc>Ypa

jedi
sumber
Ini menyisakan mode menyisipkan, dan hanya menambahkan isampai akhir untuk memasukkannya kembali rusak undo, sehingga solusi untuk menduplikasi garis dalam mode menyisipkan tidak sepele seperti yang terlihat.
DarkWiiPlayer
Ini berfungsi dengan baik bagi saya: imap <S-C-d> <Esc>Ypi mode insert dan nmap <S-C-d> <Esc>Ypdalam mode normal
jedi
0

Saya suka menggunakan pemetaan ini:

:nnoremap yp Yp

karena itu membuatnya konsisten untuk digunakan bersama YPperintah asli .

yolenoyer
sumber