Hiểu sự khác biệt tham chiếu dòng thông qua: g / ^ / Norm và thông qua:% Norm


8

Hãy nói rằng tôi có tập tin rất đơn giản sau đây

a
b
c
d
e

và tôi đã quyết định rằng tôi muốn thêm các dòng trống sau mỗi dòng. Một số phương pháp khác nhau ngay lập tức nhảy vào tâm trí của tôi. Chúng tôi có thể làm điều đó (và do đó nắm lấy thất bại). Chúng tôi có thể ghi lại một macro như thế qqo<ESC>jqvà lặp lại nó nhiều lần.

Hai phương pháp khác dường như rõ ràng hơn với tôi vào thời điểm đó.

Đầu tiên, tôi nghĩ rằng tôi sẽ phát :normlệnh otrên mỗi dòng. Thế là tôi chạy :%norm o. Nhưng điều thực sự xảy ra là chúng ta nhận được 5 dòng trống, tiếp theo là các dòng không tách rời như trên. Tôi giải thích điều này có nghĩa là %norm, vim thực sự chọn ra thông báo đưa ra lệnh bình thường sau trên năm dòng đầu tiên của tệp năm dòng này . Các olệnh tạo ra một dòng sản phẩm mới và vim là "câm" theo nghĩa là nó tham chiếu bởi số dòng và không thực sự bởi một số nhận dạng khác.

Chà, tôi đã xấu hổ. Chắc chắn rồi. Tôi đã thử một vài thứ khác để xem liệu tôi có thể làm cho phương pháp trên hoạt động được không, nhưng than ôi, tôi không thể. Vì tò mò, tôi đã thử phương pháp áp dụng đại chúng yêu thích khác của mình. Điều này dẫn tôi đến thử :g/^/norm o. Thật ngạc nhiên, điều này chỉ hoạt động tốt! Vì vậy, trong mắt tôi, dường như vim không "câm" ở đây theo cùng một cách như trên và các dòng tham chiếu không chỉ là số dòng.

Chính xác thì điều gì đang xảy ra vậy?


2
Trên một lưu ý phụ: bạn cũng có thể làm như thế này : :%s/$/\r/, hoặc như thế này : :%s/\n/\r\r/. Điều đáng nói là các dòng mới có thể được khớp với \n, nhưng phải được viết như \rtrong các giá trị thay thế.
lcd047

Câu trả lời:


9

Vâng, %là viết tắt cho 1,$(một phạm vi từ dòng đầu tiên đến cuối cùng). Từ :he :%:

Line numbers may be specified with:             :range E14 {address}
        {number}        an absolute line number
        .               the current line                          :.
        $               the last line in the file                 :$
        %               equal to 1,$ (the entire file)            :%

Và cho :global:

The global commands work by first scanning through the [range] lines and
marking each line where a match occurs (for a multi-line pattern, only the
start of the match matters).
In a second scan the [cmd] is executed for each marked line with its line
number prepended.  For ":v" and ":g!" the command is executed for each not
marked line.  If a line is deleted its mark disappears.

Vì vậy, trường hợp đầu tiên giống như duyệt qua một danh sách trong khi sửa đổi nó, vì vậy một bộ đếm trên các thành phần danh sách trở nên không hợp lệ. Trong trường hợp thứ hai, chúng tôi đánh dấu các yếu tố mà chúng tôi muốn nhắm mục tiêu trong một lần qua, do đó ngay cả khi danh sách được sửa đổi trong lần chuyển thứ hai, chúng tôi vẫn biết những yếu tố nào chúng tôi muốn làm việc.


Ah, nó thậm chí còn trong tập tin trợ giúp toàn cầu. Tôi thật ngớ ngẩn. Cảm ơn bạn
davidlowryduda

người đàn ông - g là quá mức cần thiết điên rồ hữu ích. tôi phải dành nhiều thời gian hơn để chuyển từ người dùng vi trung bình sang người dùng có quyền lực
javadba
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.