Comment supprimer le contenu en arrière jusqu'à «=» sur la ligne précédente?

9

J'utilise un exemple de code javascript:

1        var a = 1;
2        var b = |{};

Le curseur est à la position de |(sur le caractère "{" lorsque la forme du curseur est un bloc), je découvre que je veux aqu'on lui attribue un objet, donc je veux le modifier comme ci-dessous:

1        var a = {};

Je veux donc savoir quand le curseur est sur "{", comment supprimer rapidement tout le contenu avant "{" jusqu'au blanc après le signe "=" à la ligne 1?

Dans d'autres éditeurs normaux, je vais simplement appuyer sur la touche de retour arrière pour supprimer le code. Mais je ne sais pas comment y parvenir en vim.

Aaron Shen
la source
vous pouvez également appuyer iet utiliser la touche de retour arrière. Aucun corps ne vous tirera dessus pour ça. Je pense.
elyashiv
1
mais le retour arrière ne supprimera pas le caractère de la ligne ci-dessus
Aaron Shen
3
@AaronShen Cela dépend de votre paramètre de «retour arrière». Si elle comprend eolalors backspace va supprimer les sauts de ligne. Vous devrez également startêtre inclus dans le paramètre. (Voir :help backspace). N'utilisez pas cette méthode! Il existe plusieurs méthodes beaucoup plus rapides détaillées dans les réponses ci-dessous.
Rich

Réponses:

20

Je ne sais pas si je comprends parfaitement la question, mais si vous vouliez supprimer jusqu'à ce que vous ayez seulement var a = {};, vous pouvez, à partir de la position du curseur, utiliserd?1Enter

dprend une motion, et vous pouvez lui donner un modèle de recherche avec /pour une recherche en avant ou ?pour une recherche en arrière.

Voici un petit gif démontrant ceci:

entrez la description de l'image ici

akshay
la source
1
Il vaut probablement la peine de mentionner que vous devez frapper Enteraprès avoir tapé d?1.
Rich
@Rich en effet merci, j'ai mis à jour la réponse pour l'inclure.
akshay
1
Quelle police utilise ce shell?
Chris Burt-Brown
@ ChrisBurt-Brown: Terminus
akshay
10

Si vous utilisez vim (et non vi classique), dans votre exemple, vous pouvez le faire vkd(ou vkx).

  • v le mettra en mode «visuel» (sélectionner)
  • k montera d'une ligne pour placer le curseur sur le «1», en sélectionnant la partie que vous souhaitez supprimer
  • dou xsupprimera la sélection
BobH
la source
5

Supprimer vers le haut

Pour cet exemple spécifique, dgkest l'un des moyens les plus rapides de le faire.

La dcommande, comme Akshay l'a expliqué , peut être suivie d'un mouvement, supprimant tous les caractères entre le point de départ du curseur et le point de départ du mouvement.

Dans votre code, vous souhaitez supprimer tout ce qui se trouve entre la position du curseur et la même colonne une ligne plus haut, afin de déplacer le curseur vers le haut avec le gkmouvement (qui, lorsqu'il est utilisé avec un opérateur, n'est pas dans le sens des lignes) atteindra votre objectif.

EDIT: BobH souligne dans les commentaires que cette méthode ne fonctionne que lorsqu'elle 'wrap'est définie. En tant que tel, à moins que vous n'ayez toujours un ensemble d'enveloppement, vous feriez probablement mieux d'utiliser dvkou vkd, comme suggéré par les autres réponses sur cette page.

Supprimer les mots en arrière

Vous pouvez également utiliser: d5bou d4B, qui supprimera respectivement 5 mots ou 4 mots en arrière. ( 1;est un MOT, mais deux mots normaux).

Riches
la source
pourquoi dk supprimera complètement la ligne actuelle et la ligne supérieure
Aaron Shen
@AaronShen Nope. Essayez-le.
Rich
1
@Rich si cela fonctionne pour vous, vous disposez d'un paramètre qui permet ce mouvement de suppression. Je viens de le tester avec vim -u NONE -U NONEet il supprime les deux lignes.
Vitor
@Vitor Vous avez raison. Essayer de déterminer quel paramètre le fait, maintenant.
Rich
1
BTW, il s'avère que l'utilisation en gktant que caractère nécessite apparemment :set wrap(un peu cryptiquement). Je ne pouvais pas comprendre pourquoi cela fonctionnait apparemment pour tout le monde mais pas pour moi, alors que l'aide gksemblait également impliquer que cela devrait fonctionner. Le seul indice était que la signification principale de cela gkavait à voir avec les lignes enveloppées. Une fois que j'ai essayé de mettre le wrap (un peu sur un coup de tête), le tour est joué.
BobH
1

Je ne peux pas encore commenter, je dois donc faire une nouvelle réponse. Les clés d kfournies par Rich ne fonctionnent pas pour moi même lorsque j'utilise l'option nocompatible. Une raison pourrait être que la motion kest considérée ligne par ligne par vim, auquel cas les deux lignes sont supprimées. De :help d:

Une exception pour la commande d {motion}: si le mouvement n'est pas linéaire, le début et la fin du mouvement ne sont pas sur la même ligne, et il n'y a que des blancs avant le début et après la fin du mouvement, la suppression devient ligne par ligne. Cela signifie que la suppression supprime également la ligne de blancs que vous pouvez attendre. Utilisez le | o_v | opérateur pour forcer le mouvement à être caractère

Il montre également le remède: Utilisez dvkpour forcer le mouvement à être caractère. Cela fait l'affaire pour moi.

Je ne connaissais pas o_v auparavant, alors voici :help o_v:

v

Lorsqu'il est utilisé après un opérateur, avant la commande de mouvement: forcez l'opérateur à travailler dans le sens des caractères, également lorsque le mouvement est dans le sens des lignes. Si la motion était linéaire, elle deviendra | exclusive |. Si le mouvement était déjà dans le sens des caractères, basculez inclus / exclusif. Cela peut être utilisé pour rendre une motion exclusive inclusive et une motion inclusive exclusive

PhilippFrank
la source
La chose «non compatible» était un hareng rouge complet. Je me suis trompé quand je testais parce que je suis un idiot.
Rich
Nous pouvons également utiliser dgk, où gk est également exclusif et non linéaire.
MS.Kim