Не думаю, что проблема в ^M
против ^J
. Макросы Vim будут обрабатывать любой из них как допустимый символ конца строки для записанных макросов. Я думаю, что проблема заключается в лишних переводах строки.
В вашем примере после 2j
есть хотя бы одна ложная новая строка, и, если вы не особенно осторожны при копировании фрагмента, возможно, есть еще одна после 10k
. Эти дополнительные новые строки похожи на нажатие <Enter>
в обычном режиме - они перемещают курсор вниз на одну строку.
Вот то, что я думаю, вы хотите, чтобы фрагмент был похож:
:s/foo/bar/g
2j:s/1/2/g
10k
(Даже это немного вводит в заблуждение - вам все равно нужно быть осторожным, чтобы не копировать символ новой строки после 10k
.)
Почему эти дополнительные символы новой строки имеют такое большое значение? Ну, во-первых, они приводят к тому, что вы находитесь на расстоянии не менее одной строки от ожидаемого, что отбрасывает все, что вы хотите сделать в определенной строке (например, выполнить команду :s//
).
Однако, что более важно - и это то, что, как мне кажется, происходит в вашем примере, - это то, что Vim останавливает воспроизведение макроса, если макрос пытается использовать <Enter>
в последней строке буфера. (Я предполагаю, что Vim считает это ошибкой, и любая ошибка приводит к остановке макроса.)
Вот пример. Предположим, у вас есть этот фрагмент, хранящийся в регистре х:
4j
:echo "Done"
(Обратите внимание на новую строку после 4j
.)
Кроме того, предположим, что у вас есть следующие пять строк (и только эти пять строк) в буфере:
line 1
line 2
line 3
line 4
line 5
Если вы сейчас нажмете @x
на line 1
, :echo "Done"
никогда не выполнится. Vim перемещает курсор вниз на 4 строки до line 5
, затем пытается переместить еще одну строку вниз из-за дополнительной новой строки, но не может. Макрос прекращает выполнение в этот момент до того, как команда :echo
получит шанс на выполнение.
Однако, это работает, если вы измените регистр x на этот:
4j:echo "Done"
Итак, вернемся к исходному примеру. Держу пари, что происходит следующее: дополнительный символ новой строки после 2j
пытается переместить курсор туда, куда он не может перейти, и это приводит к остановке макроса. В нижней строке экрана содержится последняя выполненная команда (:s/foo/bar/g
), из-за чего Vim ждет, когда вы нажмете Return.
Наконец, я настоятельно рекомендую использовать другой метод для хранения и выполнения последовательностей команд Vim. Используемая вами техника приемлема для простых случаев, но она хрупкая и плохо масштабируется. Vim имеет полноценный язык сценариев, который включает в себя функции и пользовательские команды, и его можно использовать для выполнения всего, что вы делаете сейчас, но гораздо более надежным способом. Сценарии Vim - это большая тема, но я бы начал здесь:
:help script
Обязательно прочитайте о команде :normal
, которая позволяет вам выполнять команды в обычном режиме (например, 2j
и 10k
) в скриптах.
Удачи!