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?
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.
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.
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)
vipvappara selecionar parágrafo, v2appara selecionar dois parágrafos
dapobras, d2aptambém. Você pode apagar dentro de blocos de []comoda[
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
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
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.
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
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.
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.
51dd
. Como alternativa, use um comando de movimento -50d<down arrow>
:set rnu
e 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.)Respostas:
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 comx
oud
.fonte
.vimrc
estão fazendo funcionar?Shift
-v
... Eu estava tentando usar aCTRL
tecla também. Portanto, isso funciona e é provavelmente a maneira mais conveniente.CTRL
-v
) e Bloco Visual (Shift
-v
).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 comovim
, sobre a chance de que seu ambiente não é abençoado com o último.fonte
/var/mail/username
em massa e deixar os últimos e-mails intactos. Faço uma marca, depois digito, por exemplo,50000
seguido dagg
linha 50.000 e excluo todas as linhas intermediárias. Funciona como um encanto!vim
como uma ferramenta para edição de arquivos de gigabytes - Eu tendem a optar por ferramentas de processamento de texto, comoawk
e seus irmãos :-)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
fonte
dap
é muito fácil de lembrar como "excluir um parágrafo"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
Você também pode puxar as linhas usando
E encontre e substitua apenas as linhas 24-39 usando
fonte
Se você ativar os números de linha,
set number
poderá simplesmentedNNG
excluir a linha NN da posição atual. Assim, você pode navegar para o início da linha que deseja excluir e simplesmented50G
assumindo que essa é a última linha que deseja excluir.fonte
Depende do que esse bloco grande é. Talvez você queira apenas excluir um parágrafo; nesse caso, um dipfaria.
fonte
Existem várias possibilidades, o melhor depende do texto em que você trabalha.
Duas possibilidades vêm à mente:
V
,S-V
...), selecione o texto com o movimento do cursor e pressioned
dap
fonte
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
fonte
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.
fonte
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>
.V
está aqui para forçar o movimento a ser linha porque, por padrão,/
é caractere.fonte
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:
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.
fonte
Você também pode inserir um número muito grande e pressionar
dd
se desejar excluir todas as linhas abaixo do cursor.fonte
dG
, o que exclui o final do documento, pois oG
padrão é ir para a última linha.Excluindo um bloco de texto
Supondo que seu cursor esteja no início do bloco:
Explicação
V
/^$<CR>
d
Ligação de chave
Uma solução mais robusta:
Explicação
:set nowrapscan
D
chave (para os seguintes comandos)::nnoremap D
V
/^\s*$\\|\%$<CR>
d
fonte