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,8
sebelum del
dan 1,4
sebelum s///
menentukan baris mana perintah beroperasi.
del
menghapus 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)
.
x
dengan bergabungx+2
?