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?

Justin Ethier
fonte
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.

Esteira
fonte
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.

paxdiablo
fonte
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                  
M'vy
fonte
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
daviewales
fonte
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.

Jim Mitchener
fonte
10

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

René Nyffenegger
fonte
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
Tom Regner
fonte
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

Rumple Stiltskin
fonte
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.

Juiz Maygarden
fonte
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.

ZyX
fonte
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.

John P
fonte
1

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

Rohit Pruthi
fonte
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
Jon Nadal
fonte