Eu finalmente cheguei à solução aceita. Agradecemos a @B Layer pela cooperação (por exemplo, mencionar que o comando w
apenas grava linhas inteiras em um arquivo). Eu inventei sua resposta.
:let i=1
:1000 | exec 'normal! )hvggd' | exec 'if i<10 | let num="0" . i | else | let num=i | endif' | call writefile(split(@@, "\n", 1), '/tmp/test' . num . '.txt') | let i=i+1
Depois disso, repita o comando pressionando @:
se o último bloco for menor que 1000 linhas e você receberá um erro. Apenas salve o resto manualmente.
Após 5 execuções, tive como esperado:
$ wc -l /tmp/test*.txt
1001 /tmp/test01.txt
1000 /tmp/test02.txt
1001 /tmp/test03.txt
1006 /tmp/test04.txt
1001 /tmp/test05.txt
Para aqueles que querem usá-lo, explicarei em breve os principais passos:
:1000
Mover para a linha 1000 (os pedaços devem ter pelo menos 1000 linhas de comprimento)
exec 'normal! )hvggd'
Mude para o início da próxima frase e um caractere de volta para que o primeiro caractere da próxima sentença não seja excluído posteriormente. Para funcionar corretamente em frases que estão espalhadas em várias linhas whichwrap=h,l
deve ser definido, o que não é padrão, tanto quanto eu sei. Selecione tudo, desde a posição atual do cursor até o início e exclua-o. O conteúdo excluído será salvo no registro.
call writefile(split(@@, "\n", 1), '/tmp/test' . num . '.txt')
Escreva o conteúdo do registro (o pedaço) em um arquivo
Eu parti da suposição de que não haveria mais de 99 partes. Se precisar de mais, ajuste a parte relacionada ao preenchimento conforme necessário.