Excluir até a extremidade direita do bloco interno atual

21

Digamos que eu tenho um código como este ( |representa a posição do cursor ):

func1(x|, func2(), y); 

Eu gostaria de obter:

func1(x|);

Existe uma maneira de excluir o código da posição do cursor para a posição anterior à extremidade direita do bloco interno atual ?

Eu sei que posso seguir em frente, dt).mas me pergunto se existe uma maneira de misturá-lo com o que di)faz.

Mateusz Piotrowski
fonte
1
Estou interessado em saber se existe uma maneira fácil de "excluir a metade esquerda / direita do bloco interno / externo", como você pediu. Mas como uma nota lateral, eu provavelmente faria C);neste caso em particular.
precisa
1
Às vezes, o %movimento pode fazer o que você está procurando (ie d%).
Alxndr #

Respostas:

29

eu usaria

d])

o que significa excluir ( d) para o próximo ')' ( ])) sem correspondência.

Veja :help ]).

Ryuichiro
fonte
5

Os movimentos vão apenas em uma direção, enquanto os objetos de texto vão apenas em duas direções.

Isso significa que você não pode ter metade de um objeto de texto, a menos que crie um operador personalizado com pendência de movimento que use esse objeto de texto sob o capô ou imite seu comportamento.

No seu exemplo, o texto abordado i)é bastante fácil de visualizar:

func1(x, func2(), y);
      ^^^^^^^^^^^^^

mas como você diria ao Vim para operar do cursor até o final desse texto? Seria necessário criar operadores personalizados como obi)e oei)(exemplos semi-aleatórios).

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>
romainl
fonte
4
Seria interessante criar um movimento genérico que reutilize todos os objetos de texto já definidos, combinados com a posição atual do cursor; por exemplo, em vez de ib, imbpara a direita e iMbpara a esquerda, e assim por diante (automaticamente).
VanLaser
3

Para este caso específico, eu dfy

Para o caso geral:

  • dT( excluir do cursor até o início do bloco
  • vib selecione o restante do bloco interno
  • p substitua o bloco interno pelo que você acabou de excluir

Você pode transformá-lo em um mapeamento.

 :map K dt(vibp
Nathan Wilson
fonte
3

As outras respostas existentes dependem da definição do vim e da detecção de um bloco. Minha estratégia para esse tipo de exclusão é usar o ccomando combinado com o fmovimento e o caractere real para parar. Na verdade, isso excluirá o caractere de parada, mas como também foi a última tecla pressionada, repeti-lo duas vezes tem custo quase zero, e isso será inserido novamente, pois cmuda para o modo de inserção.


Para explicar com exemplos, por

func1(x|, func2(), y); 

o comando c2f))dará

func1(x)|;

que pode parecer menos elegante do que algumas das outras respostas, no entanto, observe que essa estratégia é universal e não depende de nenhuma definição de bloco.


Por exemplo, com

<div| class="some-class">text</div>

o comando cf>>dará

<div>|text</div>

Ou ao editar arquivos csv como

2016-11-29,question,vi|.stackexchange.com,10435

o comando cf,,dará

2016-11-29,question,vi,|10435

Freqüentemente eu uso isso para excluir o restante de uma string, de

printf("Hello world| - a boring example\n");

para

printf("Hello world\|n");

com cf\\

ou de

print("Hello world| - a boring example");

para

print("Hello world"|);

com cf"".


Isso altera a posição atual para um local ligeiramente diferente do solicitado e também muda para o modo de inserção. Mas eu queria compartilhar minha solução para excluir o resto de qualquer coisa.

hlovdal
fonte
1
O problema com a cfsolução é que eu tenho que especificar o caractere onde quero parar de excluir. As perguntas perguntam o que fazer se você não puder simplesmente fazer, cf)porque existe outro )antes do que )você realmente deseja alcançar (por exemplo, quando você deseja mudar func(x|, g(x, x), x, x, g(x, x))para func(x)). Basicamente, eu queria saber se posso evitar pressionar .depois cf).
Mateusz Piotrowski 29/11
Observe que você também pode usar em tvez de fexcluir até, mas não incluindo, o caractere fornecido. Portanto, no seu primeiro exemplo ( func1(x|, func2(), y);), você pode simplesmente usar d2t). Como o @MateuszPiotrowski menciona, porém, não é uma solução geral e exige que você saiba para qual caractere deseja excluir. Como você geralmente sabe qual personagem termina o bloco em que está em um determinado idioma, isso não é tão ruim.
Haegin 07/12/16
3

O plugin vim-ninja-feet pode ser o que você está procurando. Pelo que entendi, ele cria d[e d]entra em "excluir do cursor para o início / fim do objeto de texto", portanto d]i)deve ser "excluir até o final dos parênteses".

Caagr98
fonte