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.
cursor-movement
cursor-motions
Mateusz Piotrowski
la source
la source
C);
dans ce cas particulier.%
motion peut faire ce que vous recherchez (c.d%
-à-d.).Réponses:
j'utiliserais
ce qui signifie supprimer (
d
) au prochain ')' (])
) inégalé .Tu vois
:help ])
.la source
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: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)
etoei)
(exemples semi-aléatoires).la source
ib
,imb
à droite etiMb
à gauche, et ainsi de suite (automatiquement).Pour ce cas spécifique, je
dfy
Pour le cas général:
dT(
supprimer du curseur au début du blocvib
sélectionnez le reste du bloc intérieurp
remplacer le bloc intérieur par ce que vous venez de supprimerVous pouvez en faire un mappage.
la source
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
c
commande combinée avec lef
mouvement 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 passagec
au mode d'insertion.Pour expliquer avec des exemples, par
la commande
c2f))
donneraqui 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
la commande
cf>>
donneraOu lors de l'édition de fichiers csv comme
la commande
cf,,
donneraSouvent, je l'utilise pour supprimer le reste d'une chaîne, de
à
avec
cf\\
ou de
à
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.
la source
cf
solution 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 simplementcf)
parce qu'il y en a un autre)
avant que)
vous ne souhaitiez réellement atteindre (par exemple lorsque vous souhaitez passerfunc(x|, g(x, x), x, x, g(x, x))
àfunc(x)
). Fondamentalement, je voulais savoir si je pouvais éviter d'appuyer sur.
aprèscf)
.t
au lieu def
supprimer jusqu'à mais sans inclure le caractère donné, donc pour votre premier exemple (func1(x|, func2(), y);
), vous pouvez simplement utiliserd2t)
. 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.Le plugin vim-ninja-feet pourrait être ce que vous recherchez. D'après ce que je comprends, cela fait
d[
etd]
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".la source