Para entender o que está acontecendo nesse nível de detalhe, acho que você precisa alcançar o código-fonte. Então, citando vim-7.1.314/src/ex_cmds.c
(comentário na cabeça da definição de ex_global()
):
This is implemented in two passes: first we scan the file for the pattern and set a mark for each line that (not) matches. secondly we execute the command for each line that has a mark. This is required because after deleting lines we do not know where to search for the next match.
Assim, se você excluir uma linha no comando :g
'ed, a marca dessa linha também desaparecerá. Se você criar uma linha no comando :g
'ed, ela não será marcada, portanto, o comando não será executado nela. No seu exemplo, a linha 3 é unida à linha 2, então a marca na linha 3 desaparece, e a próxima marca após a linha 2 é a originalmente colocada na linha 4.
Além disso, ex_global
define a variável global_busy
, o que faz com que alguns comandos, incluindo :s
, tenham um comportamento um pouco diferente. Eu não acho que a diferença seja relevante aqui.