Você pode pegar ou excluir entre parênteses no vi / vim?

128

Dada esta linha de código em C:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));

Existe uma maneira de excluir ou puxar do primeiro parêntese em negrito para o parêntese correspondente? Pensei em df) , mas isso só o levará logo após o 9.0.

Existe uma maneira semelhante de fazer com que o vim pegue tudo entre chaves, independentemente de novas linhas?

romandas
fonte

Respostas:

167

Vários movimentos:%

O %comando salta para a correspondência do item sob o cursor. Posicione o cursor no ponto de abertura (ou fechamento) e use y%para puxar ou d%excluir tudo, desde o cursor até o ponto correspondente.

Isso funciona porque %é um "comando de movimento", portanto pode ser usado em qualquer lugar que o vim espere esse comando. De :help y:

["x]y{motion}       Yank {motion} text [into register x].  When no
                    characters are to be yanked (e.g., "y0" in column 1),
                    this is an error when 'cpoptions' includes the 'E'
                    flag.

Por padrão, "item" inclui colchetes, chaves, parênteses, comentários no estilo C e várias instruções de pré-compilador ( #ifdef, etc.).

Existe um plugin para "correspondência estendida%" que você pode encontrar na página inicial do Vim .

Você pode ler a documentação %e os comandos de movimento relacionados, entrando :help various-motionsno modo de comando.

seleção de objeto

Há outro conjunto de comandos de movimento que você pode usar no modo Visual para selecionar vários objetos de texto.

Para resolver seu problema específico, faça o seguinte:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                   ^

Digamos que seu cursor esteja posicionado em ^. Digite a seguinte sequência para selecionar a peça que você está procurando:

v2a)

Primeiro ventra no modo Visual, depois você especifica que deseja 2aumentar os níveis de parens. Finalmente, a)seleciona "um bloco". Depois disso, você pode usar dou xexcluir, etc.

Se você não deseja incluir as parênteses externas, pode usar "bloco interno":

v2i)

Veja :help object-selecta lista completa de comandos relacionados.


fonte
Obrigado! Eu sabia sobre% de alternância entre itens correspondentes; não sabia que era útil também dentro de comandos. +1 e aceito.
Romandas 01/01/09
5
Interessante, eu sempre pensei que asignificava "ao redor" e não "a". Parece que complementa melhor "interior". Parece que nem um dia se aprende algo novo sobre o Vim.
Andrew Marshall
217

Que tal dibou di(.

Ele excluirá o bloco interno (...) onde está o cursor.

Eu amo movimentos e seleções de objetos de texto !

CMS
fonte
10
Felizmente, essa pergunta é o primeiro sucesso quando busco no Google - não sei quantas vezes essa resposta me salvou. E eu sempre esquecê-lo ... :-(
Konrad Rudolph
16
É possível excluir incluindo os parênteses? (sim, eu respondi minha própria pergunta: dab=> excluir um bloco (incluindo suas parênteses)
bantic
5
Eu voto. Além disso, se você deseja corrigir a palavra entre parênteses, faça ciw .
Desenvolvedor Marius Žilėnas 13/08/2015
5
+1! Fiquei impressionado quando descobri recentemente movimentos de objetos de texto! Não mais tentando cursor posição no ponto certo para texto puxão: D
verboze
36

Para excluir tudo o que está dentro de um par de parênteses, você sempre pode emitir di(e seus derivados.

Nota :

Como @porglezomb sugeriu em seu comentário, você pode usar a("junto com") em vez de i("dentro") para incluir os parênteses. Portanto, o uso da(exclui tudo dentro (e )inclui (e ).

Excluindo texto dentro do par externo imediato de parênteses:

Então, para esta linha de código

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                ^       ^
                                |       |
                                 \_______\___---> Cursor range

supondo que seu cursor esteja dentro do intervalo mencionado acima, você pode emitir os seguintes comandos:

di(   --> Deletes '5.0/9.0'
ci(   --> Substitutes '5.0/9.0'
yi(   --> Yanks '5.0/9.0'

Excluindo texto dentro do n-ésimo par externo de parênteses:

Para pegar tudo dentro do n-ésimo par externo de parênteses, basta adicionar nantes do comando acima. Portanto, com a mesma posição do cursor acima,

2di(   --> Deletes '(5.0/9.0) * (fahr-32)'
2ci(   --> Substitutes '(5.0/9.0) * (fahr-32)'
2yi(   --> Yanks '(5.0/9.0) * (fahr-32)'

3di(   --> Deletes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3ci(   --> Substitutes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3yi(   --> Yanks '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
Kevin
fonte
3
Você deve adicionar uma nota falando acomo a contraparte i, já que isso provavelmente ajudará muitas pessoas.
porglezomp
@romandas, essa deve ser a pergunta aceita. Eu estava procurando exatamente o mesmo problema hoje e @ Kevin é o único aqui a dar a resposta correta. É claro que eu poderia "usar indevidamente" %esse problema, mas isso leva mais tempo e, na minha opinião, só deve ser usado para cenários mais complexos. A exclusão de algo dentro de um determinado escopo é exatamente para o caso de uso di.
Daniel451
19

Você pode usar d%para excluir e y%puxar.

ahy1
fonte
3
% é o especificador de movimento para "parêntese, colchete ou colchete correspondente". Qualquer especificação de movimento pode ser combinada com d e y (e muitas outras coisas).
caos
10

Coloque o cursor no primeiro parêntese e pressione v%you v%d.

David Norman
fonte
3
Ótimo! % pula para o paren correspondente. Então você pode usar d% e y%.
1
Observe também que 'd%' pode começar no início de um nome de função e excluirá toda a chamada de função. Também funciona para pares '{}', '[]' e até '<>'.
Jonathan Leffler
@ Leffler, obrigado pelas dicas! E é bom saber que o% funciona também no modo visual.
Strager 01/01/09
3

Experimente ci [envolvente de bloco]

No seu caso, coloque o cursor em qualquer lugar entre os 2 parênteses que você destacou e tente as teclas: ci (

Justin Nguyen
fonte
Por pouco. Testando isso, parece que o cursor precisa estar no primeiro parêntese, não entre, e 'c' é o comando change. Com o cursor entre parênteses de abertura, 'di (' exclui o parêntese de fechamento correspondente e 'yi (' puxa.
Richard Neish
O ci funciona para mim o tempo todo. Tudo o que preciso fazer é garantir que o cursor esteja entre os parênteses que cercam o bloco de texto que preciso excluir.
23613 Justin Nguyen
2

Como resposta de David Norman diz,

Coloque o cursor no primeiro parêntese e pressione v%you v%d.

Explicação de http://vimdoc.sourceforge.net/htmldoc/vimindex.html :

tag char note action no modo Normal        
-------------------------------------------------- ----------------------------
| v | v iniciar o modo visual caractere
|% | % 1 encontra o próximo colchete (encaracolado / quadrado) em
                                       nesta linha e vá para a partida ou vá para
                                       colchete de comentário correspondente ou vá para
| d | ["x] d {motion} 2 exclua o texto Nmove [no buffer x]

Isso significa que ele selecionará tudo entre e incluindo os dois colchetes ( %) enquanto mostra a seleção visualmente ( v) e depois a puxa / copia you exclui / corta d. (Para o buffer padrão.)

Você pode colocar / colar com p.

Fiz esta resposta para "me ensinar a pescar" .

n611x007
fonte
nota: vimdoc.sourceforge.net está ligada a partir vim.org que é o site oficial do vim a partir de 2015.
n611x007