Anda tentu dapat melakukan semua ini dengan satu salin / tempel (menggunakan pemilihan blok-mode), tapi saya rasa bukan itu yang Anda inginkan.
Jika Anda ingin melakukan ini hanya dengan perintah Ex
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/
akan berubah
work it
make it
do it
makes us
harder
better
faster
stronger
~
ke
work it harder
make it better
do it faster
makes us stronger
~
UPDATE: Sebuah jawaban dengan banyak upvotes ini layak mendapat penjelasan yang lebih menyeluruh.
Di Vim, Anda bisa menggunakan karakter pipa ( |) untuk mengaitkan beberapa perintah Ex, sehingga di atas sama dengan
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/
Banyak perintah Ex menerima rentang baris sebagai argumen awalan - dalam kasus di atas 5,8sebelum deldan 1,4sebelum s///menentukan baris mana perintah beroperasi.
delmenghapus garis yang diberikan. Itu dapat mengambil argumen register, tetapi ketika seseorang tidak diberikan, ia membuang baris ke register yang tidak disebutkan namanya @",, seperti menghapus dalam mode normal. let l=split(@")kemudian memecah baris yang dihapus menjadi daftar, menggunakan pembatas default: whitespace. Untuk bekerja dengan baik pada input yang memiliki spasi putih di baris yang dihapus, seperti:
more than
hour
our
never
ever
after
work is
over
~
kami perlu menentukan pembatas yang berbeda, untuk mencegah "pekerjaan" dari terbelah menjadi dua daftar elemen: let l=split(@","\n").
Akhirnya, dalam substitusi s/$/\=remove(l,0)/, kami mengganti akhir setiap baris ( $) dengan nilai ekspresi remove(l,0). remove(l,0)mengubah daftar l, menghapus dan mengembalikan elemen pertamanya. Ini memungkinkan kita mengganti baris yang dihapus sesuai urutan kita membacanya. Kami malah bisa mengganti baris yang dihapus dalam urutan terbalik dengan menggunakan remove(l,-1).
xdengan bergabungx+2?