Supprimer jusqu'à l'extrémité droite du bloc interne actuel


21

Disons que j'ai un code comme celui-ci ( |représente la position du curseur ):

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

Je voudrais obtenir:

func1(x|);

Existe-t-il un moyen de supprimer le code de la position du curseur à la position précédant l'extrémité droite du bloc interne actuel ?

Je sais que je peux y aller dt).mais je me demande s'il y a un moyen de le mélanger avec ce qui di)fait.


1
Je souhaite savoir s'il existe un moyen simple de "supprimer la moitié gauche / droite du bloc intérieur / extérieur", comme vous l'avez demandé. Mais comme note de côté, je le ferais probablement C);dans ce cas particulier.
Shahbaz

1
Parfois, la %motion peut faire ce que vous recherchez (c. d%-à-d.).
alxndr

Réponses:


29

j'utiliserais

d])

ce qui signifie supprimer ( d) au prochain ')' ( ])) inégalé .

Tu vois :help ]).


5

Les mouvements ne vont que dans une direction tandis que les objets texte ne vont que dans deux directions.

Cela signifie que vous ne pouvez pas avoir la moitié d'un objet texte sauf si vous créez un opérateur personnalisé en attente de mouvement qui utilise cet objet texte sous le capot ou imite son comportement.

Dans votre exemple, le texte couvert par i)est assez facile à visualiser:

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

mais comment diriez-vous à Vim d'opérer du curseur jusqu'à la fin de ce texte? Il faudrait créer des opérateurs personnalisés comme obi)et oei)(exemples semi-aléatoires).

" ()
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>

4
Il serait intéressant de créer un mouvement générique qui réutilise tous les objets texte déjà définis, combinés avec la position actuelle du curseur; par exemple, au lieu de ib, imbà droite et iMbà gauche, et ainsi de suite (automatiquement).
VanLaser

3

Pour ce cas spécifique, je dfy

Pour le cas général:

  • dT( supprimer du curseur au début du bloc
  • vib sélectionnez le reste du bloc intérieur
  • p remplacer le bloc intérieur par ce que vous venez de supprimer

Vous pouvez en faire un mappage.

 :map K dt(vibp

3

Les autres réponses existantes dépendent toutes de la définition et de la détection d'un bloc par vim. Ma stratégie pour ce type de suppressions est d'utiliser la ccommande combinée avec le fmouvement et le personnage réel pour s'arrêter. Cela supprimera alors réellement le caractère d'arrêt, mais comme il s'agissait également de la dernière touche que vous avez appuyée en le répétant deux fois, son coût est presque nul, et cela le réinsérera depuis le passage cau mode d'insertion.


Pour expliquer avec des exemples, par

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

la commande c2f))donnera

func1(x)|;

qui peut à première vue sembler moins élégant que certaines des autres réponses, notez cependant que cette stratégie est universelle et ne dépend d'aucune définition de bloc.


Par exemple avec

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

la commande cf>>donnera

<div>|text</div>

Ou lors de l'édition de fichiers csv comme

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

la commande cf,,donnera

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

Souvent, je l'utilise pour supprimer le reste d'une chaîne, de

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

à

printf("Hello world\|n");

avec cf\\

ou de

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

à

print("Hello world"|);

avec cf"".


Cela change la position actuelle à un endroit légèrement différent de celui demandé, et passe également en mode d'insertion. Mais je voulais partager ma solution pour supprimer le reste de quoi que ce soit.


1
Le problème avec la cfsolution est que je dois spécifier le caractère où je veux arrêter de supprimer. La question demande ce que vous devez faire si vous ne pouvez pas le faire simplement cf)parce qu'il y en a un autre )avant que )vous ne souhaitiez réellement atteindre (par exemple lorsque vous souhaitez passer func(x|, g(x, x), x, x, g(x, x))à func(x)). Fondamentalement, je voulais savoir si je pouvais éviter d'appuyer sur .après cf).
Mateusz Piotrowski

Notez que vous pouvez également utiliser tau lieu de fsupprimer jusqu'à mais sans inclure le caractère donné, donc pour votre premier exemple ( func1(x|, func2(), y);), vous pouvez simplement utiliser d2t). Comme @MateuszPiotrowski le mentionne cependant, ce n'est pas une solution générale et vous oblige à savoir vers quel personnage vous souhaitez supprimer. Comme vous savez généralement quel personnage termine le bloc dans lequel vous vous trouvez pour une langue donnée, ce n'est pas si mal.
Haegin

3

Le plugin vim-ninja-feet pourrait être ce que vous recherchez. D'après ce que je comprends, cela fait d[et d]en "supprimer du curseur pour le début / fin de l'objet texte", d]i)devrait donc être "supprimer jusqu'à la fin des parenthèses environnantes".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.