Nó thực sự là khá khéo léo. Hãy phá vỡ nó. các ex
lệnh
g/^$/xyzzy
sẽ tìm kiếm tất cả các dòng trống và thực hiện xyzzy
lệnh (một ex
lệnh tùy ý ) trên mỗi dòng. Lưu ý rằng đó xyzzy
không phải là một lệnh thực sự ex
, nó chỉ ở đó với tư cách là một trình giữ chỗ, theo đoạn tiếp theo.
Một mẹo nhỏ ở đây là xyzzy
"lệnh" trong trường hợp của bạn là một lệnh tìm kiếm khác :
,/./-j
Các ,/./-
chỉ định một phạm vi. Đây là hình thức <start>,<end>
và, vì không có gì trước dấu phẩy, nó giả sử dòng hiện tại (dòng mà bạn tìm thấy dòng trống) là bắt đầu.
Sau dấu phẩy /./-
có nghĩa là tìm kiếm ký tự tiếp theo ( .
có nghĩa là bất kỳ ký tự nào), sau đó sao lưu một dòng ( /./-
viết tắt là /./-1
vì nó được ngụ ý nếu không có giá trị nào được đưa ra). Bạn sẽ tìm thấy mẫu đó .
trên dòng không trống đầu tiên theo mẫu bạn đang hoạt động.
Nói cách khác, cuối phạm vi là dòng trống cuối cùng sau hoặc tại điểm bạn đang hoạt động.
Sau đó, bạn thực hiện một tham gia trên phạm vi đó.
Nếu điểm bắt đầu và điểm kết thúc của phạm vi bằng nhau (chỉ có một dòng trống trong phần), tham gia không làm gì cả. Nếu chúng không bằng nhau, tham gia sẽ tham gia tất cả chúng lên.
Đó là cách mà nó kết hợp nhiều dòng trống thành một.
Hãy xem xét một ví dụ (số dòng chỉ để giải thích, chúng không có trong tệp thực tế):
1 Line 1
2
3 Line 3
4 Line 4
5
6
7
8
9 Line 9
Các g/^$/
lệnh sẽ tìm thấy tất cả các dòng sản phẩm nào và thực hiện các hoạt động trên chúng (đây là những dòng 2, 5, 6, 7 và 8).
Đối với dòng 2, ,/./-j
sẽ thiết lập một phạm vi từ 2 đến 2 (tiếp theo .
được tìm thấy trên dòng 3 sau đó trừ 1 để có được 2). Một tham gia trên phạm vi 2,2 không làm gì.
Đối với dòng 5, ,/./-j
sẽ thiết lập một phạm vi từ 5 đến 8 (tiếp theo .
được tìm thấy trên dòng 9 sau đó trừ đi 1). Một tham gia trên phạm vi 5,8 sẽ tham gia tất cả các dòng đó với nhau.
Hoạt động không được thực hiện trên các dòng biến mất như một phần của hoạt động trước đó. Đó là bởi vì sẽ vô nghĩa khi xử lý các dòng đã bị xóa trước đó trong chu kỳ.
Nói cách khác, vì các dòng 6 đến 8 bị xóa (kết hợp với dòng 5), lệnh toàn cầu không hoạt động trên chúng sau đó.
Điều đó dựa trên thực tế là vim
tài liệu nêu một thuật toán hai vượt qua, một để đánh dấu các dòng, một để thực hiện thao tác.