Bạn chắc chắn có thể thực hiện tất cả điều này với một bản sao / dán (sử dụng lựa chọn chế độ khối), nhưng tôi đoán đó không phải là điều bạn muốn.
Nếu bạn muốn làm điều này chỉ với các lệnh Ex
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/
sẽ biến đổi
work it
make it
do it
makes us
harder
better
faster
stronger
~
vào
work it harder
make it better
do it faster
makes us stronger
~
CẬP NHẬT: Một câu trả lời với nhiều upvote này xứng đáng được giải thích kỹ lưỡng hơn.
Trong Vim, bạn có thể sử dụng ký tự ống dẫn (|
) để xâu chuỗi nhiều lệnh Ex, do đó, ở trên tương đương với
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/
Nhiều lệnh Ex chấp nhận một phạm vi dòng làm đối số tiền tố - trong trường hợp trên là 5,8
trướcdel
và 1,4
trước s///
chỉ định dòng nào hoạt động trên các dòng.
del
xóa các dòng đã cho. Nó có thể lấy một đối số đăng ký, nhưng khi không được đưa ra, nó sẽ chuyển các dòng thành thanh ghi không tên @"
, giống như xóa trong chế độ bình thường. let l=split(@")
sau đó phân tách các dòng đã xóa thành một danh sách, sử dụng dấu phân cách mặc định: khoảng trắng. Để hoạt động chính xác trên đầu vào có khoảng trắng trong các dòng bị xóa, như:
more than
hour
our
never
ever
after
work is
over
~
chúng ta cần chỉ định một dấu phân cách khác nhau, để ngăn "công việc là" bị tách thành hai thành phần danh sách : let l=split(@","\n")
.
Cuối cùng, trong sự thay thế s/$/\=remove(l,0)/
, chúng ta thay thế kết thúc của mỗi dòng ( $
) bằng giá trị của biểu thức remove(l,0)
. remove(l,0)
thay đổi danh sách l
, xóa và trả về phần tử đầu tiên của nó. Điều này cho phép chúng tôi thay thế các dòng đã xóa theo thứ tự mà chúng tôi đọc chúng. Thay vào đó, chúng ta có thể thay thế các dòng đã xóa theo thứ tự ngược lại bằng cách sử dụng remove(l,-1)
.
x
với tham giax+2
?