Làm thế nào: g / ^ ^ / / / /. / J (giảm nhiều dòng trống thành một ô trống) hoạt động trong vim?


21

Trong bài viết, Vim biểu thức chính quy , Oleg Raisky đưa ra lệnh sau để giảm nhiều dòng trống thành một khoảng trống:

:g/^$/,/./-j

Ai đó có thể vui lòng mô tả làm thế nào điều này hoạt động?

Tôi biết :glệnh và biểu thức chính quy. Nhưng tôi không hiểu phần /,/./-jđó làm gì.

Câu trả lời:


24

Nó thực sự là khá khéo léo. Hãy phá vỡ nó. các exlệnh

g/^$/xyzzy

sẽ tìm kiếm tất cả các dòng trống và thực hiện xyzzylệnh (một exlệnh tùy ý ) trên mỗi dòng. Lưu ý rằng đó xyzzykhô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à /./-1vì 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, ,/./-jsẽ 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, ,/./-jsẽ 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à vimtà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.


2
Lưu ý rằng lệnh này sẽ khiếu nại nếu bạn có bất kỳ dòng trống nào ở cuối tệp của bạn.
tự đại diện
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.