Como faço para excluir um grande bloco de texto sem contar as linhas?


91

No vim, muitas vezes preciso excluir ou puxar / colocar grandes blocos de texto.

Posso contar as linhas do texto e inserir algo como 50ddexcluir 50 linhas.

Mas isso é um pouco de dor. Como posso excluir esse grande bloco de texto sem precisar saber quantas linhas excluir anteriormente?


4
Como você sabe onde está o fim? Se você pode descrever o final, pode excluir para esse ponto. Se você pode descrever como você pode moveaté o fim. A exclusão até o final não é diferente de ir para o final.
Martin York

@Loki, mover para o final geralmente usa apenas a página abaixo e as teclas de seta até chegar lá. Ele pode ser o primeiro ou décima linha em branco, que pode ser a primeira chave de fechamento. Resumindo, varia bastante.

2
verifique também esta resposta: stackoverflow.com/a/16407391/164835
Kent

Respostas:


111

Vá para a linha de partida do seu bloco e digite ma(marque "a", embora você possa, obviamente, usar letras diferentes e até várias letras para marcas diferentes, desde que você possa manter em mente o que cada letra é uma marca) .

Então vá para a última linha e digite d'a(delete para marcar "a") ou y'a(puxe para marcar "a") (a) .

Isso excluirá / arrancará todas as linhas da atual para a marcada (inclusive).

Em seguida, você pode colá-lo em outro lugar com os comandos de colagem normais, como pou P.

É também compatível com vi, bem como vim, sobre a chance de que seu ambiente não é abençoado com o último.


(a) Eu também uso isso para salvar meu lugar no arquivo se precisar procurar em outro lugar algo como, por exemplo, copiar e colar a definição de uma função que desejo chamar.

Simplesmente marque a linha atual da mesma maneira mae depois saio para encontrar o que você está procurando.

Então, uma vez que eu o encontrei e o copiei em um registro, eu apenas entro 'apara voltar para marcar "a", a linha que eu salvei anteriormente, onde posso colá-lo.


9
Também poderia usar o modo visual para isso, certo?
JMC

3
Essa é uma maneira, jmc, mas não tenho certeza se o padrão vi tem um modo visual.

5
Desde que mudei da seleção visual para a marcação e o número relativo de linhas há cerca de um ano, descobri que os comandos do vi motion são muito mais rápidos e eficientes do que a seleção visual. Mesmo que o mais tarde seja mais fácil toda vez que eu aperto a vtecla, pergunto-me: eu realmente preciso disso ou existe uma maneira de movimento melhor?
Sukima

1
Sim, da mesma maneira que é interessante, @Sukima, que me sinto mais eficiente quanto menos uso o mouse, mesmo em uma GUI. Eu me vejo sendo mais rápido se posso ficar no teclado.

3
Se você alguma vez estiver editando algo com linhas realmente longas, a versão final disso também poderá ser muito útil (que se refere ao local dentro da linha, em vez de toda a linha).
msouth

65

No Vim, use o modo de linha visual :

  1. Coloque o cursor na linha superior do bloco de texto / código para remover
  2. Pressione V(é "V" maiúsculo: Shift+ v)
  3. Mova o cursor para baixo na parte inferior do bloco de texto / código para remover
  4. pressione d

Para excluir grandes blocos de texto, isso é preferível ao modo visual simples, porque você não precisa se preocupar com qual coluna o cursor está.


3
Na etapa 3. você pode se mover mais rápido usando movimentos de objeto. Por exemplo, pode ser usado }para selecionar um parágrafo inteiro ou )frases. Há mais, você pode ler sobre eles em:h object-motions
mxlian 14/05

2
Também à procura de uma substring com /something<CR>é um método muito eficiente para chegar ao fim do seu bloco selecção
mxlian

1
Este é o meu método preferido. No entanto, alternativamente, sem ter que pressionar repetidamente jpara mover o cursor para baixo (etapa 3), você pode digitar o número da linha seguido por Gpara selecionar até essa linha. Exemplo:V150Gd
Ranhiru Jude Cooray 5/16/16


39

Você pode excluir facilmente um grande bloco de texto conhecendo sua estrutura.

Se for parágrafo, use: d{(por exemplo, você pode prefixar o número de parágrafos)

Se for um bloco de código entre parênteses, use: d%

Se o texto aparecer até o final do arquivo, use: dG

Se você souber como termina, use: d/e digite o texto final seguido por Enter(você também pode usar expressões regulares, para que as possibilidades sejam infinitas).

Como alternativa, use o modo visual ( V) e use as teclas de movimento para selecionar rapidamente o texto (por exemplo, por {) e removê-lo ( d).

Ou, como sugeriu Lie Ryan, use d/search-string/epara excluir o texto do cursor atual para a string pesquisada.

Veja: :help de :help motionpara mais informações.


2
Também é d/search-string/enecessário excluir do cursor atual até o final da cadeia de pesquisa, incluindo a própria cadeia de pesquisa e c/search-queryentrar no modo de inserção após a exclusão. Usar d/with set incsearché uma combinação elegante, pois permite descobrir interativamente se você está operando no intervalo de texto correto e ajudá-lo a saber quando parar de digitar a consulta de pesquisa para evitar digitar mais do que o necessário.
Lie Ryan

4
Também acho muito útil dcom a(externo) ou i(interno) e um especificador de objeto. Objetos como wpor palavra, ppara parágrafo, (ou bpara (...), [para [...], {ou Bpara {...}etc. documentação para visuais-operadores .
Shahbaz 23/02

22

Você pode usar movimentos e / ou objetos de texto. Por exemplo, você pode excluir tudo do cursor até a próxima linha em branco com d}. Se o cursor estiver dentro de um parágrafo, o parágrafo poderá ser excluído com dipou dap. Se o cursor estiver dentro de uma tag HTML, você poderá excluí-lo com ditou dat.

Boas mnemônicos para estes são " d elete i nside" e " d élete um round" (parágrafo / tag / parênteses).


11

Eu costumo fazer

:<start>,<end>d

que excluirá todas as linhas entre os números de linha inicial e final fornecidos (incluindo as linhas especificadas).

Observe que ambos starte endpodem ser números de linha absolutos, padrões ou deslocamentos de outra posição.

Veja também o comentário da doubleDown sobre a visualização da documentação do intervalo do Vim , e há algumas dicas úteis.

Exemplo:

Digamos que você tenha o seguinte arquivo:

1. The quick brown
2. fox jumps
3. over the
4. lazy dog.

Em seguida, usando o comando :2,3dou :/fox/,/over/dou :/quick/+1,/lazy/-1ou :+1,+2dse você estiver na primeira linha ou :-1,.dna terceira linha, você terminará com:

1. The quick brown
4. lazy dog.

Mas isso significa que você ainda precisa contar as linhas? Ou entendi mal sua resposta?
Martin Tournoij

7
Você não precisa contar as linhas, mas precisa saber os números das linhas.
JMC

Primeiro que :set ruler, em seguida, ir para a parte superior e inferior do texto para encontrar starte endnúmeros de linha, em seguida, fazê:<start>,<end>d
roblogic

1
Você também pode usar números de linha relativos:+12,+24d
rpattabi

2
Na verdade, você pode usar um par de números de linha, um par de padrões, ou um par misto para <start>e <end>para isto. Para referência, consulte :h [range]. Portanto, é realmente um pouco mais flexível do que você imaginou.
doubleDown 27/10/2015

5

Se você estiver lidando com blocos delimitados (por exemplo: código ou tags XML / HTML), poderá posicionar o cursor no início do bloco e usar o modo visual %para selecionar rapidamente blocos inteiros de código e pressionar dpara excluí-los.


5
Alternativamente, você pode usar dappara eliminar um parágrafo, da(, da{, da[, para excluir blocos delimeted por parênteses, chaves ou colchetes. Para html existe dat, o que exclui um tag, e da'e da"eliminar cordas. Há também os dip, di(variantes, etc, que irá apagar tudo dentro dos delimitadores, mas deixam os delimitadores intacta. Como alternativa, você pode usar vap(resp vip) para selecionar todos os parágrafos (resp interno). (E então existe va(e vi(.) Além disso, existe cape cip(ou ca(e ci() para excluir e ir para o modo de inserção (ou seja, "alterar"). E yappara arrancar #
1118

Eu acho que algumas das ligações @jmc descritas em seu comentário anterior são do plugin surround.vim de Tim Pope. É um ótimo plugin que eu recomendaria instalar, mas significa que essas ligações não fazem parte da instalação padrão do vim.
Haegin 02/10/19

5

Além de todos os outros bons conselhos, estou adicionando d+ Shift+ Lpara excluir tudo da posição atual do cursor até a última linha visível na tela. Repetir o comando fará com que você desça relativamente rápido.


5

O plugin numbers.vim é muito útil para isso. É uma maneira aprimorada de preceder cada linha com um número de linha. Como 'number'e 'relativenumber', ambos rolaram em um!

Ele é ativado por padrão após a instalação, você também deseja adicionar set numberao seu vimrc se ainda não o tiver, pois ele se comporta de maneiras estranhas se você não o tiver.

No modo normal , é semelhante a :set relativenumber:

  3 call plug#begin('~/.vim/plugged')
  2 
  1 Plug 'myusuf3/numbers.vim'
7   set number█
  1 
  2 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
  3 Plug 'Yggdroot/indentLine'

Ele mostra os números de linha relativos, exceto a linha em que o cursor está, onde mostra o número absoluto da linha (7 neste caso).

Se mudarmos para o modo de inserção , ele se comportará como se numberestivesse definido, sempre mostrando números de linhas absolutos:

  4 call plug#begin('~/.vim/plugged')
  5 
  6 Plug 'myusuf3/numbers.vim'
  7 set number█
  8   
  9 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
 10 Plug 'Yggdroot/indentLine'

Existem mais opções e alguns comandos (consulte a página inicial), mas os padrões devem funcionar para a maioria das pessoas.


No começo, pensei que essa resposta fosse um pouco fora do tópico, mas depois instalei o plug-in e devo dizer que é uma mudança de jogo para mim. Eu costumava trocar manualmente e o passo mental extra significava que eu evitava usar esses movimentos. Obrigado!
Sukima

1
Isso soa como algo que um autocmd InsertEnter / InsertLeave para alternar a numeração de linha relativa poderia fazer. Estou esquecendo de algo?
Ben

Estou MUITO atrasado para a festa, mas @Ben está certo, são apenas algumas linhas de comando automático. Por exemplo, no meu vimrc eu tenho set number, set relativenumberentão autocmd InsertEnter * :set norelativenumbereautocmd InsertLeave * :set relativenumber
Camada B

4

Outra abordagem é se você estiver tentando excluir um padrão específico, basta digitar d/delimEnter.


2

Você pode usar o procedimento normal de inserir dmais uma moção (como já explicado nas outras respostas). O plug-in EasyMotion fornece novos movimentos que você pode usar para resolver seu problema de maneira rápida e fácil.

Digamos que você queira excluir da posição atual do cursor até o final de qualquer palavra na tela, as teclas de movimento seriam <Leader><Leader>e(semelhantes ao emovimento normal ). Em seguida, digite a (s) letra (s) destacada (s) que aparecem no final da palavra em questão. Há também um movimento de linha para que você possa excluir a linha atual até a linha em questão com <Leader><Leader>j.

Eu tenho minha <Leader>chave definida como ,. Portanto, o comando completo é d<Leader><Leader>e{letra (s) destacada (s)}.

De :help easymotion:

O EasyMotion fornece uma maneira muito mais simples de usar alguns movimentos no vim. Ele leva o <number>fora do <number>w ou <number>f {char}, destacando todas as escolhas possíveis e permitindo que você pressionar uma tecla para saltar diretamente para o alvo.

Quando um dos movimentos disponíveis é acionado, todo o texto visível antes ou depois do cursor é desbotado e os alvos de movimento são destacados.

Editar:

O repositório do github do EasyMotion está em https://github.com/Lokaltog/vim-easymotion .

Este reddit sobre pessoas que usam o easymotion pode ser uma leitura divertida.


1

Existe uma solução simples que pode resolver seu problema.

Coloque o cursor no início do bloco de texto que você deseja remover e faça d50gg.

Isso excluirá todas as linhas da sua posição atual para a 50ª linha do seu texto.

eq: se o cursor estiver na linha 46 , d50ggexcluirá 4 linhas.


1
Eu sugiro usar em Gvez de gg, pois também funciona no vi, e :set numberé claro que sempre é útil para encontrar qual é o número da linha na qual você deseja ir.
Random832

O ponto principal desta pergunta é que você não sabe quantas linhas deseja remover.
200_success

200_success, você não precisa saber quantas linhas deseja remover com a resposta que eu publiquei. Tudo que você tem que saber é "qual a linha que você deseja remover"
Geee

1

Use o modo visual com destaque de linha.

  1. Coloque o cursor na linha superior do bloco de texto / código para remover
  2. Pressione Shift+v
  3. Mova o cursor para baixo na parte inferior do bloco de texto / código para remover
  4. pressione d

Eu prefiro esse método para excluir blocos de código porque ele exclui linhas inteiras em comparação ao simples uso do modo visual, onde você deve posicionar o cursor na coluna da direita para excluir o que deseja.


3
Você basicamente repete a resposta com @ 200_success.
Martin Schröder

1

Como não gosto de usar relativenumbero tempo todo, configurei meu Vim para ativá-lo apenas quando estou no Modo Visual:

" Entering Visual mode
nnoremap <silent>     v :set relativenumber cursorcolumn<CR>v
nnoremap <silent> <C-q> :set relativenumber cursorcolumn<CR><C-q>
nnoremap <silent>    gv :set relativenumber cursorcolumn<CR>gv
nnoremap <silent>     V :set relativenumber<CR>V

" When finished
augroup ClearCursorColumnAndLine
    autocmd!
    autocmd CursorHold * set norelativenumber nocursorcolumn nocursorline
augroup END

Isso facilita sua tarefa:

V49jd

porque depois de bater, Vvocê pode ver a que distância a linha de destino está.

Isso pode ser irritante a longo prazo (o texto muda para a direita e para a esquerda quando o número relativo é ativado / desativado), mas até agora estou gostando bastante.


1
Eu acho que você usa v<Esc>d50j?
Martin Tournoij 26/02

Obrigado, eu realmente o escrevi incorretamente. Na verdade, começo Vse souber que farei uma operação em linha e, em seguida, posso deixar a dúltima, para maior confiança.
Joeytwiddle 26/02

Minha resposta parece ser a aproximação de um pobre homem do plug-in numbers.vim oferecido em outra resposta. ;-)
joeytwiddle

1

O que funcionou muito bem para mim com vi:

  1. :set number para visualizar o número da linha até onde eu queria excluir;

    +1289 idle 
    +1289 idle 
    +1290 # <- I want to delete until here
    +1291 if [[ ! -z "$SFIN" ]]
    
  2. Volte para a linha em que a exclusão teve que começar

  3. Exclusão usada da linha atual, no modo normal> d1290G
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.