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