энергия - работающий dd располагается команда с помощью командной строки

Для удаления диапазона строк я знаю, что мы можем использовать:3,15d, и это работает. Но если мы пытаемся выполнить ту же команду с помощью нормальной команды (:3,15 нормальных dd), она ведет себя ошибочная и удаляет некоторые случайные блоки/строки в 3,15 диапазонах. Кто-либо мог объяснить, является ли это ошибкой?

Лучше всего, RG

1
задан 15 January 2020 в 18:40

1 ответ

:norm выполняет итерации по строкам с определенными адресами, не по строкам с определенными метками.

Предположим, что у Вас есть этот файл:

line 1
line 2
line 3
line 4
line 5
line 6

И Вы выполняетесь :2,4norm! dd. Вы, вероятно, ожидаете получать этот файл:

line 1
line 5
line 6

Но в действительности, Вы получите этот файл:

line 1
line 3
line 5

Во-первых, :norm выполняется dd команда на строке, адрес которой 2; в той точке файл содержит:

line 1
line 3
line 4
line 5
line 6

Затем :norm выполняется dd команда на строке, адрес которой 3. Но с тех пор :norm удалил строку на предыдущем шаге, все адреса строк ниже удаленной строки уменьшились на 1. Так строка адреса 3 не тот, содержащий текст line 3 больше, но тот, содержащий текст line 4; и :norm удаляет последнего; в той точке файл содержит:

line 1
line 3
line 5
line 6

Наконец, :norm выполняется dd команда на строке, адрес которой 4. Но снова, с тех пор :norm удалил 2 строки на предыдущих шагах, все адреса последующих строк уменьшились на 2; и строка адреса 4 не тот, содержащий текст line 4 больше, но тот, содержащий текст line 6; :norm удаляет последнего, и файл наконец содержит:

line 1
line 3
line 5

Если по некоторым причинам, Вы действительно хотите использовать :norm! dd, объедините его с :g который вопреки :norm действительно отмечает строки, на которые это воздействует прежде, чем выполнить его аргумент команды:

:3,15g/^/norm! dd

Или попытайтесь инвертировать порядок удалений:

:call map(reverse(range(3, 15)), {_,v -> execute(v.'norm! dd')})

Всегда добавляйте удар к :norm, если Вы действительно не хотите, чтобы Ваши пользовательские отображения были приняты во внимание.


Если Ваш файл свернут, удостоверьтесь, свернувшись, временно недоступно; выполниться :setl nofen перед удалениями, затем :setl fen позже.

0
ответ дан 19 January 2020 в 09:13

Другие вопросы по тегам:

Похожие вопросы: