vim - Como excluir um grande bloco de texto sem contar as linhas?


193

No vim, geralmente me pego excluindo (ou copiando) grandes blocos de texto. Pode-se contar as linhas do texto e dizer (por exemplo) 50ddpara excluir 50 linhas.

Mas como excluir um grande bloco de texto sem precisar saber quantas linhas excluir?


1
Se a janela for grande o suficiente, a numeração relativa das linhas é útil aqui. Coloque o cursor na parte superior da janela, encontre o número da linha relativa da última linha a ser excluída (digamos, n), adicione um, digite um número e digite dd. Por exemplo, se n = 50, então 51dd. Como alternativa, use um comando de movimento -50d<down arrow>
— BallpointBen

"Encontre o número da linha relativa" - ou use :set rnue o Vim fará isso instantaneamente! A linha em que você está ainda será numerada absolutamente, mas as linhas acima e abaixo do cursor serão numeradas simetricamente 1, 2, ... (e atualizadas com o movimento do cursor, eventos no nível do arquivo, etc.)
— John P

Respostas:


287

Não sou guru do vim, mas o que uso nessa circunstância é "modo visual". No modo de comando, digite V(capital). Em seguida, mova para cima / para baixo para destacar o bloco que você deseja excluir (todos os comandos de movimento habituais funcionam). Em seguida, remova-o com xou d.


2
Estranho. Eu sei que ele funciona para mim (tm) aqui no Linux (vim 7.3.50) e com o gVim no Windows. E, a julgar pelas outras respostas, funciona para outras pessoas. Talvez algumas configurações no seu .vimrcestão fazendo funcionar?
— Mat

OK, por algum motivo, eu não sabia que era possível entrar no modo de linha visual usando Shift- v... Eu estava tentando usar a CTRLtecla também. Portanto, isso funciona e é provavelmente a maneira mais conveniente.
— 23711 Justin Ethier

7
Você pode esclarecer que existem dois modos visuais - Linha Visual ( CTRL- v) e Bloco Visual ( Shift- v).
— 23611 Justin Ethier

2
Eu faço muito isso. Mas eu sempre considero trapaça e vim menos que o ideal.
— Jim Mitchener

9
Na verdade, existem três modos visuais: Modo Visual (com base em caracteres {v}), Modo de Linha Visual (com base em linha {Sv}) e Modo de Bloco Visual (Permite a seleção de blocos {Cv})
— Tom Regner

293

Vá para a linha de partida e digite ma(marque "a"). Então vá para a última linha e insira d'a(delete para marcar "a").

Isso excluirá todas as linhas da atual para a marcada (inclusive). Também é compatível com vi, bem como vim, sobre a chance de que seu ambiente não é abençoado com o último.


3
Isso é demais! Odeio quanto tempo faço alguma coisa (como contar linhas) antes de procurar uma solução melhor. Obrigado!
— Ryanjdillon

1
realmente incrível eu sempre uso o modo visual para excluir o bloco, mas desta maneira é melhor +1
— hish

4
Achei isso mais útil do que o modo visual para apagar 500k linhas +
— Michael - Onde está Clay Shirky

Resposta realmente prática. Eu o uso para excluir os e-mails no meu servidor do arquivo /var/mail/usernameem massa e deixar os últimos e-mails intactos. Faço uma marca, depois digito, por exemplo, 50000seguido da gglinha 50.000 e excluo todas as linhas intermediárias. Funciona como um encanto!
— otmezger

1
@horta, eu provavelmente não estaria usando vimcomo uma ferramenta para edição de arquivos de gigabytes - Eu tendem a optar por ferramentas de processamento de texto, como awke seus irmãos :-)
— paxdiablo

46

Você pode usar o modo visual também (alguns comandos são utilizáveis com a opção de exclusão também) vip vappara selecionar parágrafo, v2appara selecionar dois parágrafos dapobras, d2aptambém. Você pode apagar dentro de blocos de [ ]comoda[

Para referência: os tipos de objetos. Na documentação do vim: seção 4. http://vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a word (with white space)           
iw  inner word                  
aW  a WORD (with white space)           
iW  inner WORD                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  

1
da [, da {, da "tudo útil para programadores
— Rene Wooller 28/04

1
obrigado! dapé muito fácil de lembrar como "excluir um parágrafo"
— Tropilio 18/12/18

38

Existem muitas respostas melhores aqui, mas, para completar, mencionarei o método que costumava usar antes de ler algumas das ótimas respostas mencionadas acima.

Suponha que você queira excluir das linhas 24-39. Você pode usar o comando ex

:24,39d

Você também pode puxar as linhas usando

:24,39y

E encontre e substitua apenas as linhas 24-39 usando

:24,39s/find/replace/g

11

Se você ativar os números de linha, set numberpoderá simplesmente dNNGexcluir a linha NN da posição atual. Assim, você pode navegar para o início da linha que deseja excluir e simplesmente d50Gassumindo que essa é a última linha que deseja excluir.


10

Depende do que esse bloco grande é. Talvez você queira apenas excluir um parágrafo; nesse caso, um dipfaria.


Obrigado pela dica. Infelizmente, estou trabalhando com código aqui e, geralmente, preciso de um controle mais refinado do que isso.
— 23611 Justin Ethier

1
Também estou trabalhando com código e separo os blocos lógicos por uma linha vazia. Essa dica acabou de fazer o meu dia. Agora posso excluir grandes blocos de lógica com três pressionamentos de tecla.
— miniml

ele funciona porque significa 'd' apagar 'p' neste meio contexto parágrafo
— user98761

7

Existem várias possibilidades, o melhor depende do texto em que você trabalha.

Duas possibilidades vêm à mente:

  • alternar para o modo visual ( V,S-V ...), selecione o texto com o movimento do cursor e pressioned
  • exclua um parágrafo inteiro com: dap

Eu uso o dap com muita frequência agora que eu sei sobre ele e prefiro que ele desapareça, mas ele sempre exclui um bloco e a linha em branco que vem depois do bloco, mas é uma maneira de excluir o bloco e a linha em branco que vem antes dele?
— Funkodebat

No meio de um texto com parágrafos, não há diferença sintática no resultado, existe? Se houver, sugiro que escreva o que deseja, com exemplos, em uma nova pergunta.
— Tom Regner

6

Se o bloco inteiro estiver visível na tela, você poderá usar a configuração do número relativo. Veja: help relativenumber. Disponível em 7.3


Eu não percebi o quão útil: se rnu foi até que eu comecei a usá-lo - grande para saber a 50dd, bem como navegação, 50J
— rshdev

3

Você pode colocar o cursor no início ou no final do bloco e entrar no modo visual (shift-v). Em seguida, basta mover para cima ou para baixo até que o bloco desejado seja destacado. Por fim, copie o texto pressionando y ou recorte o texto pressionando d.


talvez estranho, mas a partir disso eu descobri como selecionar o texto de algum ponto médio desejado em uma linha e selecionar várias linhas abaixo no mesmo ponto até o final de cada linha. Exatamente o que eu estava procurando.
— nanker

3

Juntamente com outros movimentos que já são mencionados aqui, também há /{pattern}<CR>movimento. Portanto, se você souber que deseja excluir a linha que contém foo, façadV/foo<CR> . Vestá aqui para forçar o movimento a ser linha porque, por padrão, /é caractere.


3

Contar linhas é muito tedioso para mim, mas contar 'parágrafos' não é tão ruim. '{' e '}' movem o cursor para a primeira linha vazia antes e depois do cursor, respectivamente. As operações de movimentação do cursor podem ser combinadas com a exclusão e várias outras respostas usaram uma abordagem semelhante (dd para uma linha, dG para o final do documento, etc.)
Por exemplo:

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

Se o cursor iniciar acima do bloco de comentários, 'd}' exclui o bloco de comentários e 'd2}' exclui o bloco de comentários e o bloco de código. Se o cursor iniciar abaixo do bloco de código, 'd {' exclui o código e 'd2 {' exclui os dois. Obviamente, você pode pular um bloco movendo o cursor primeiro: '{d {' ou '} d}'.

Se você é consistente com seu espaço em branco ou pode contar os parágrafos rapidamente, isso deve funcionar. O arquivo de ajuda do Vim possui mais truques de cursor, se você estiver interessado.


1

Você também pode inserir um número muito grande e pressionar ddse desejar excluir todas as linhas abaixo do cursor.


Pode ser ainda mais fácil de usar dG, o que exclui o final do documento, pois o Gpadrão é ir para a última linha.
— precisa saber é o seguinte

1

Excluindo um bloco de texto

Supondo que seu cursor esteja no início do bloco:

V/^$<CR>d (where <CR> is the enter/return key)

Explicação

  • Entre no modo "visualmente linear": V
  • Destaque até a próxima linha vazia: /^$<CR>
  • Excluir: d

Ligação de chave

Uma solução mais robusta:

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

Explicação

  • Desativar quebra da pesquisa: :set nowrapscan
  • Remapeie a Dchave (para os seguintes comandos)::nnoremap D
  • Entre no modo "visualmente linear": V
  • Destaque até a próxima linha em branco / espaço em branco ou EOF: /^\s*$\\|\%$<CR>
  • Excluir: d
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.