Apakah ada cara khusus untuk menggabungkan dua blok teks dengan menyisipkan baris, seperti meneruskan dari ini:
a1
a2
a3
a4
b1
b2
b3
b4
untuk itu:
a1
b1
a2
b2
a3
b3
a4
b4
dalam beberapa perintah?
EDIT : Saya sangat suka solusi Sato Katsura , berikut ini cara saya mengimplementasikannya:
function! Interleave()
" retrieve last selected area position and size
let start = line(".")
execute "normal! gvo\<esc>"
let end = line(".")
let [start, end] = sort([start, end], "n")
let size = (end - start + 1) / 2
" and interleave!
for i in range(size - 1)
execute (start + size + i). 'm' .(start + 2 * i)
endfor
endfunction
" Select your two contiguous, same-sized blocks, and use it to Interleave ;)
vnoremap <pickYourMap> <esc>:call Interleave()<CR>
vimscript
formatting
merge
iago-lito
sumber
sumber
scroll-binding
dua jendela Vim.b1
, kemudian saya menekanvip
untuk memilih seluruh potongan, lalu,it
yang mana adalah<map-I've-Picked>
. Apakah itu tidak bekerja di pihak Anda?Jawaban:
Tidak ada cara khusus untuk melakukan itu (sejauh yang saya tahu), tapi ya, itu bisa dilakukan dengan beberapa perintah:
Anda dapat menjalankannya dengan
:call Interleave(5, 8, 1)
. Parameter pertama adalah baris pertama yang akan dipindahkan, yang kedua adalah baris terakhir, dan yang ketiga tempat untuk memindahkannya. Anda mungkin ingin mengaktifkan nomor baris untuk melihat apa yang Anda lakukan (:set number
).Ini mengasumsikan blok tidak tumpang tindih. Lihat
:help :move
dan:help range()
untuk memahami bagaimana fungsi ini bekerja.Mungkin ada cara yang lebih baik untuk mengambil dua blok. Ada plugin mengambang di sekitar yang seharusnya memungkinkan Anda bertukar dua blok. Saya tidak dapat mengingat nama plugin, tetapi penulis (mungkin Dr. Chip yang terkenal?) Telah lebih memikirkan menemukan antarmuka daripada yang saya lakukan. :)
sumber
start
dansize
. Dengan fungsi homebrew yang mengambil nilai-nilai itu dari pilihan, itu akan menjadi sempurna. Saya sedang mengerjakannya. :)Berikut adalah alternatif lain:
Pertama salin baris yang 4 baris di bawah ini ke setelah baris saat ini (
:h :t
) kemudian hapus berturut-turut b baris (:h :d
)Perintah ini lebih baik lagi:
Yang berarti, untuk setiap baris dimulai dengan cari baris berikutnya dimulai dengan 'b' dan pindahkan ke bawah garis saat ini.
sumber
.+,$d
sebagai gantinya, dan itu berhasil (seperti yang saya lakukan.+,.+4d
)./^\s*b
ke yang lain:range
. misal: pilih blok 1, jalankan'<,'>g/^/'>+1m.
'>+1
menandai awal blok 2.Jika Anda ingin bersenang-senang dengan makro dan tanda, Anda dapat mencoba sesuatu seperti ini:
Pertama menempatkan tanda (di sini
a
) pada baris yang berisia1
denganma
Pergi ke baris yang berisi
b1
dan tandai denganmb
Mulai merekam makro di register yang Anda inginkan (di sini register
q
) denganqq
Masukkan mengikuti di makro Anda:
ddmb'apjma'b
Hentikan merekam makro dengan
q
Mainkan sebanyak yang diperlukan dengan di
X@q
manaX
jumlah waktu untuk memainkannya.Untuk detail makro:
Sunting Seperti yang disebutkan lago-lito dalam komentar, metode ini akan menimpa tanda dan buffer.
Untuk tanda saya tidak berpikir itu masalah nyata: Saya jarang menggunakan semua 26 tanda dalam buffer dan saya pikir sebagian besar waktu akan menemukan 2 tanda gratis.
Untuk buffer dimungkinkan untuk menyimpannya dalam variabel sementara: Sebelum merekam penggunaan makro
:let saveReg=getreg('"')
untuk menyimpan register dan setelah tindakan selesai digunakan:call setreg('"', saveReg)
untuk mendapatkan register kembali ke keadaan sebelumnya.Lagi pula saya harus mengakui bahwa solusi ini hanya solusi cepat dan tidak optimal: Menurut pendapat saya jawaban Christan adalah yang terbaik dan harus diterima karena tidak mengacaukan buffer dan tanda, tidak memaksa pengguna untuk membuat fungsi dan menunjukkan kekuatan perintah global.
sumber
getreg()
dansetreg()
untuk menyimpan buffer Anda. Tetapi saya setuju bahwa ini bukan solusi optimal :-)Saya baru saja melihat pertanyaan serupa lainnya dan solusinya terdiri dari:
Lompat ke tengah plus satu:
Dan lari:
sumber