Eu quero criar um script básico do Vim que simplesmente exclua n linhas, pule 1 linha e repita até o final do documento. Não ligo para correspondências específicas, só quero excluir a linha. Por exemplo; Então, eu quero repetir o comando 3ddj
para todo o documento.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Então parece que ...
Text I want to keep.
Text I want to keep.
Text I want to keep.
Obrigado.
regular-expression
normal-mode
repeated-commands
Max Copley
fonte
fonte
regular-expression
na sua pergunta, mas a pergunta parece não especificar um motivo para fazer isso com expressões regulares. Se você está realmente procurando algo que use expressões regulares, stackoverflow.com/questions/17735289/… pode ser interessante. Essa pergunta era sobre o Notepad ++, mas a resposta não usa nada além de um pcre regex. (Disclaimer: Eu escrevi essa resposta.)Respostas:
Abordagem muito simples:
qa3ddjq
A etapa três repetirá a macro mil vezes ou até que um erro seja encontrado. Atingir o final do arquivo (portanto, nenhuma linha a ser excluída) produz um erro e a repetição da macro é cancelada.
Veja
:help recording
.fonte
q
(no modo de comando e no vim ou em outras versões alternativas recentes [neovim, etc], mas não no vi original) significa "iniciar a gravação e colocá-lo no buffer da 'próxima letra'". portanto:qa
significa "iniciar a gravação no buffer 'a'". Em seguida, todas as teclas digitadas após isso (até a próximaq
no modo de comando) são gravadas (você pode até gravar: entrar no modo de edição, digitar algo, Escapar para o modo de comando, etc). Em seguida12@a
, repetiria quaisquer ações gravadas no buffer "a" 12 vezes.1000@q
no final, é possível criar uma macro recursiva:,qa3ddj@aq@a
embora seja necessárioqaq
primeiro fazer isso para garantir que ele"a
comece vazio.A solução mais fácil para mim seria:
Isso é:
%
: para cada linhanorm
: execute as seguintes teclas como se estivesse no modo normalj3dd
: desça na linha e exclua 3 linhasEntão, da primeira linha, desça para a segunda e exclua as próximas 3 linhas. O segundo
Text I want to keep.
está agora na segunda linha. Desça uma linha, exclua 3. Enxágue e repita.Nota: se você não quiser processar o arquivo inteiro, poderá substituí-lo
%norm
por, por exemplo,5,$norm
para processar da 5ª linha até o final do arquivo.fonte
Você já tem ótimas soluções disponíveis. Aqui está outro:
Primeiro, executamos uma ação em todas as linhas (
:g
correspondendo ao^
(início da linha)) e, para cada número de linha, executamos o resultado delinenumber % 4
. Se o resultado for desigual1
, adicionamosDELETE ME
no início da linha, marcando as linhas a serem excluídas pelo próximo comando.O próximo comando é um comando regular (
:g
), que corresponde a todas as linhas que começam comDELETE ME
e o fazem.Observe que você não pode excluir imediatamente a linha usando o primeiro
:g
comando, pois isso alteraria o cálculo do módulo resultante e, como tal, precisamos primeiro marcar as linhas e, em uma segunda etapa, excluí-la.fonte
Eu sei que este é o
vi
canal, mas para mim isso é umsed
problema.Assim, você pode agrupá-lo em uma
vi
solução:fonte
Uma alternativa (suponho que começamos na linha 1 e excluímos as linhas 2-4, 6-8 e assim por diante, conforme um exemplo de texto):
Se preferir fazer isso de maneira interativa, você pode usar o "registro de linha de comando". Ou seja, pressione
:+1del 3<CR>
e depois1000@:
fonte
uma alternativa: você deseja manter qualquer linha: 1, 4, etc. Você pode usar:
Outra alternativa: se você conhece as linhas que deseja, corresponde a um padrão único:
fonte