Розуміння різниць відліку між лініями через: g / ^ / норма та через:% норма


8

Скажімо, у мене є такий дуже простий файл

a
b
c
d
e

і я вирішив, що хочу додавати порожні рядки після кожного рядка. Кілька різних методів одразу прискакують мені на думку. Ми можемо просто зробити це (і, таким чином, сприйняти невдачу). Ми можемо записати подібний макрос qqo<ESC>jqі повторити його кілька разів.

Два інші методи мені здавались більш очевидними.

По-перше, я думав, що видаю :normкоманду oв кожному рядку. Так я бігаю :%norm o. Але насправді відбувається те, що ми отримуємо 5 порожніх рядків, за якими слідують нерозділені рядки, як зазначено вище. Я інтерпретую це так, що %norm, vim, фактично приймає повідомлення про наступну звичайну команду в перших п'яти рядках цього п'яти рядкового файлу . oКоманда створює новий рядок і ВІМ є «німий» в тому сенсі , що він посилається на номер рядка , а не на самому ділі яким - або іншим ідентифікатором.

Ну, я збентежився. Звичайно. Я спробував кілька інших речей, щоб побачити, чи зможу я змусити описаний вище метод, але, на жаль, не зміг. З цікавості я спробував свій інший улюблений метод масового застосування. Це змусило мене спробувати :g/^/norm o. На мій подив, це працює просто чудово! Отже, на мої очі, здається, що vim тут не "тупий" так само, як вище, і посилається на рядки більше ніж просто номер рядка.

Що саме відбувається?


2
На стороні записки ви також можете зробити це в такий спосіб : :%s/$/\r/або так: :%s/\n/\r\r/. Виведення полягає в тому, що нові рядки можуть бути узгоджені \n, але повинні бути записані, як \rу замінних значеннях.
lcd047

Відповіді:


9

Ну, %це скорочення для 1,$(діапазон від першого рядка до останнього). Від :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)            :%

І для :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.

Отже, перший випадок - це як пройти список під час його модифікації, тому лічильник елементів списку стає недійсним. У другому випадку ми помічаємо елементи, на які хочемо націлитись одним проходом, так що навіть якщо список буде змінено у другому проході, ми все одно знаємо, над якими елементами ми хочемо працювати.


Ах, це навіть у довідковому файлі для глобальних. Як я дурний. Дякую
davidlowryduda

людина - g це непосильне божевільне корисне. мені доведеться витратити більше часу, щоб перейти від середнього користувача до енергокористувача
javadba
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.