Bagaimana cara menarik garis tertentu tanpa menggerakkan kursor dalam vim?

40

Sebagai contoh

teks alternatif

Bagaimana saya bisa menarik dan menempelkan Baris 4 hanya ke Baris 12 tanpa harus memindahkan kursor ke Baris 4?

teks alternatif

Lazer
sumber
Saya menjawab pertanyaan Anda berdasarkan fakta bahwa "nyentak aku!" ada di baris 4. Di tangkapan layar 2 Anda, muncul di baris 5.
Louis Salin
Terima kasih @Louis untuk jawabannya. Saya telah memperbarui tangkapan layar.
Lazer

Jawaban:

52

Jika kursor sudah di jalur 12, maka sederhana

: 4y
P

melakukannya untuk saya.

luar biasa
sumber
1
Bagus! Apakah ada yang setara untuk x? Ketika saya mencoba, :4xsaya mengerti E140: Use ! to write partial buffer. Terima kasih!
dotancohen
Saya harus mengatakan ini luar biasa: D
nXqd
@dotancohen:4d
n.st
Apakah ada cara yang baik untuk melakukan ini dengan nomor baris relatif?
TrungDQ
Dengan angka relatif cukup gunakan + dan -. Jadi -4 adalah empat baris di atas kursor dan +4 adalah empat baris di bawahnya.
rickythefox
10

Bagaimana dengan ini: Kursor ada di jalur 11, Anda dalam mode "vi".

:4co.<return>

Anda juga bisa melakukannya dengan sebuah pola:

:/^Yank/co.<return>

Anda bisa menggunakan "mo" (pindah) bukan "co" (salin) untuk hanya memindahkan garis, bukan mencabut dan meletakkan.

Bruce Ediger
sumber
1
Bahkan lebih pendek ( t sebagai perintah penyalinan adalah sisa dari ed)::4t.
tarleb
9

Coba ini:

:4,4y  
P
Louis Salin
sumber
8

Mencoba:

:4co11

Anda dapat menggunakan argumen 0untuk menempelkan ke baris 1. Ini juga akan bekerja dengan rentang:

:m,n co k

akan menyalin garis mmelalui ngaris k+1. Selain itu, tidak masalah di mana Anda berada di buffer. The moveperintah, m, bekerja mirip.

gvkv
sumber
2

Ini harus dilakukan:

:4,12y
p
k
Umang
sumber
1
Tidak, itu menarik nomor baris 4 sampai 12.
Lazer
Maksud saya salin dan tempel baris 4, ke baris 12.
Lazer
Diedit. Apakah ini yang anda inginkan?
Umang
2

Yang lain telah menyebutkan metode paling langsung untuk melakukan ini, yaitu :4y , tetapi saya ingin menambahkan dua catatan tentang hal ini yang mungkin berguna:

Satu, jika Anda mengetik :help rangeAnda akan mempelajari semua tentang menggunakan rentang untuk menerapkan perintah Ex style. SANGAT berguna dalam banyak kasus, dan jauh lebih fleksibel daripada menggunakan nomor baris. Misalnya, jika Anda ingin menarik baris pertama dimulai dengan "menarik" setelah awal dokumen (bahkan jika itu ada di baris pertama), gunakan:0/^yank/y . Bagian paling kuat dari rentang adalah kemampuan untuk menggabungkannya, misalnya,:./^Chapter/+50?Pete?d berarti "Temukan baris berikutnya untuk memulai dengan Bab kata (mencari maju dari baris saat ini), kemudian melompat maju 50 baris, dan mencari mundur untuk kata Pete, dan hapus baris pertama yang Anda temukan. " Kecuali bahwa itu tidak benar-benar memindahkan kursor, itu hanya melakukan apa yang kamu katakan.

(Saya telah menggunakan jenis kisaran spesifikasi ini untuk mengotomatiskan pembuatan dokumentasi fiddly yang melibatkan pencarian nama fungsi di bawah kursor, lalu mencari baris berikutnya yang bertuliskan "Deskripsi" dan menariknya ke register tertentu ... dll.)

Tip lainnya, adalah bahwa Anda harus tahu tentang melompat. Ketik :help jump-motionsuntuk mempelajarinya sepenuhnya, tetapi cara berhubungan di sini adalah bahwa Anda dapat melompat ke baris 4, menariknya dan kemudian KEMBALI dengan 4Gyy''(atau menggunakan backticks alih-alih apostrof untuk melompat kembali ke posisi awal yang tepat, daripada hanya LINE yang sama Anda mulai.)

Wildcard
sumber
2

Terpendek:

:1t. menyalin baris pertama di bawah arus.

Dengan rentang: :1,4t.salinan baris 1 hingga 4 (inklusif) di bawah ini.

Juga dimungkinkan dengan nomor garis relatif:

:-1t. menyalin baris sebelumnya di bawah arus.

Dalam contoh Anda, :4t-1salin baris keempat di bawah baris yang diinginkan.

Catatan: :tadalah sinonim untuk :co[py]perintah.

Erwin Rooijakkers
sumber