Parfois, je veux modifier un certain bloc visuel de texte sur plusieurs lignes.
Par exemple, je prendrais un texte qui ressemble à ceci:
name
comment
phone
email
Et fais comme ça
vendor_name
vendor_comment
vendor_phone
vendor_email
Actuellement, la façon dont je le ferais maintenant est ...
- Sélectionnez les 4 lignes d'un bloc en appuyant sur Vpuis sur jquatre fois.
- Retrait avec >.
- Remontez une lettre avec h.
- Passez en mode visuel bloqué avec Ctrlv.
- Sélectionnez quatre lignes vers le bas en appuyant jquatre fois. À ce stade, vous avez sélectionné un bloc visuel 4x1 d'espaces blancs (quatre lignes et une colonne).
- Appuyez sur C. Remarquez ceci à peu près en retrait à gauche d'une colonne.
- Tapez un
" vendor_"
sans le devis. Remarquez l'espace supplémentaire que nous avons dû remettre. - Appuyez sur Esc. C'est l'une des rares fois que j'utilise Escpour sortir du mode d'insertion. Ctrlcne modifierait que la première ligne.
- Répétez l'étape 1.
- Retrait dans l'autre sens avec <.
Je n'ai pas besoin de mettre en retrait s'il y a au moins une colonne d'espace avant les mots. Je n'aurais pas besoin de l'espace blanc si je n'avais pas à effacer le bloc visuel avec c.
Mais si je dois effacer, existe-t-il un moyen de faire ce que j'ai effectué ci-dessus sans créer les espaces nécessaires avec indentation?
Aussi pourquoi l'édition de plusieurs lignes à la fois ne fonctionne-t-elle qu'en quittant le mode d'insertion avec Escover Ctrlc?
Voici un exemple plus compliqué:
name = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone = models.CharField( max_length = 135, blank = True )
email = models.EmailField( blank = True )
à
name = models.whatever.CharField( max_length = 135 )
comment = models.whatever.TextField( blank = True )
phone = models.whatever.CharField( max_length = 135, blank = True )
email = models.whatever.EmailField( blank = True )
Dans cet exemple, je voudrais effectuer le bloc visuel vertical sur le .
, puis le réinsérer en mode insertion, c'est-à-dire taper .whatever.
. J'espère que vous pouvez maintenant voir l'inconvénient de cette méthode. Je me limite à sélectionner uniquement une colonne de texte qui sont toutes identiques en position verticale .
:s/models\./\0whatever./
\0
par&
.Réponses:
n
enname
.I
(majuscule i).vendor_
. Remarque: Il ne mettra à jour l'écran que dans la première ligne - jusqu'à ce que vous Escappuyiez sur (6.), auquel point toutes les lignes seront mises à jour.Une majuscule
I
doit être utilisée plutôt qu'une minusculei
, car la minusculei
est interprétée comme le début d'un objet texte , ce qui est plutôt utile en soi, par exemple pour sélectionner à l'intérieur d'un bloc de balises (it
):la source
j
ou^L
. Vous devriez voir que Vim n'était pas occupé après tout; c'était juste en attente. Deuxièmement, essayez de passer'timeout'
à une valeur inférieure, comme80
(plutôt que par défaut1000
) et observez qu'elle expire plus rapidement.timeoutlen
ne le soit pastimeout
.A
plutôt queI
, qui s'insérera après le bloc sélectionné plutôt qu'avant. Si vos lignes sont de longueurs différentes, cela ne fonctionnera pas; J'aime utiliser une substitution correspondant à la fin de chaque ligne pour cela, par exemple en sélectionnant certaines lignes et en utilisant:s/$/inserted/
.Une autre approche consiste à utiliser la commande .(
dot
) en combinaison avec I.vendor_
)Je trouve que cette technique est souvent plus rapide que le mode de blocage visuel pour un petit nombre d'ajouts et présente l'avantage supplémentaire que si vous n'avez pas besoin d'insérer le texte sur chaque ligne d'une plage, vous pouvez facilement les ignorer en appuyant sur les touches supplémentaires j. .
Notez que pour un grand nombre d'ajouts contigus, l'approche par bloc ou la macro sera probablement supérieure.
la source
Presse:
Tapez le nouveau texte.
la source
Esc
pour les noobs VIM comme moi - il m'a fallu un certain temps pour comprendre que les changements se propagent "plus tard"!v
? Je peux le faire avecCtrl+V --> A
, mais fairev
pour sélectionner le texte ne fonctionne pas -A
ne s'ajoute qu'à cette ligne. N'est-ce pas tous les deux une sélection? Aussi, très étrange -A
ne s'ajoute qu'à la fin de la ligne SI j'étends le bloc visuel jusqu'à la fin de la ligne; sinon, il s'ajoute à la fin du bloc visuel pour chaque ligne. C'est comme s'il ne reconnaissait pas la différence entrea
etA
.c
place deC
, mais cela fonctionnait parfaitement bien. MerciJ'utiliserais une macro pour enregistrer mes actions, puis je la répéterais.
Vous avez maintenant une belle macro.
Tapez 3@qpour exécuter votre macro trois fois pour effectuer le reste des lignes.
la source
ou est-ce que je manque quelque chose?
la source
vender_
préfixe n'est pas souhaité.1,4s/^/vendor_/
V
et le type:
. Il préfixera l'expression ed avec:'<,'>
laquelle faire ed ne s'applique qu'à la sélection avec:'<,'>s/^/vendor_/
Mise à jour janvier 2016
Bien que la réponse acceptée soit une excellente solution, il s'agit en fait d'un nombre légèrement moins élevé de touches et d'une meilleure échelle - en principe en fonction de la réponse acceptée.
n
enname
.I
.vendor_
.Notez que cela a moins de touches que la réponse acceptée fournie (comparez l'étape 3). Nous comptons simplement le nombre d'actions j à effectuer.
Si vous avez activé les numéros de ligne (comme illustré ci-dessus) et connaissez le numéro de ligne vers lequel vous souhaitez vous déplacer, l'étape 3 peut être remplacée par #G lequel où # est le numéro de ligne souhaité.
Dans notre exemple ci-dessus, ce serait 4G. Cependant, lorsqu'il s'agit de quelques numéros de ligne, un décompte explicite fonctionne bien.
la source
Je voulais commenter beaucoup de lignes dans un fichier de configuration sur un serveur qui n'avait que vi (pas de nano), donc la méthode visuelle était également lourde. Voici comment j'ai fait cela.
vi file
:set number!
ou:set number
:35,77s/^/#/
Remarque: les numéros sont inclus, les lignes de 35 à 77, les deux incluses seront modifiées.
Pour décommenter / annuler cela, utilisez simplement
:35,77s/^#//
Si vous souhaitez ajouter un mot de texte comme commentaire après chaque ligne de code, vous pouvez également utiliser:
:35,77s/$/#test/
(pour les langages comme Python):35,77s/;$/;\/\/test/
(pour les langages comme Java)crédits / références:
/unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim
/unix/120615/how-to-comment-multiple-lines-at-once
la source
Vous pouvez également avoir un cas d'utilisation dans lequel vous souhaitez supprimer un bloc de texte et le remplacer.
Comme ça
À
Vous pouvez simplement bloquer visuellement sélectionner "Monde" dans les deux lignes.
Tapez cpour le changement - maintenant vous serez en mode insertion.
Insérez ce que vous voulez et appuyez sur Échap.
Les deux se reflètent verticalement. Il fonctionne exactement comme «I», sauf qu'il remplace le bloc par le nouveau texte au lieu de l'insérer.
la source
Supposons que vous ayez ce fichier:
Vous souhaitez ajouter "fournisseur_" devant "nom", "commentaire", "téléphone" et "e-mail", quel que soit leur emplacement dans le fichier .
Le
c
drapeau vous demandera confirmation. Vous pouvez supprimer cela si vous ne voulez pas l'invite.la source
Une alternative plus flexible:
Exemple: pour saisir le texte XYZ au début de la ligne
Qu'est-ce qu'il se passe ici?
%
== Exécuter sur chaque lignenorm
== Exécute les touches suivantes en mode normalI
== Insérer au début de la ligneXYZ
== Le texte que vous souhaitez saisirEnsuite, vous frappez Enter, et il s'exécute.
Spécifique à votre demande:
Vous pouvez également choisir une gamme particulière:
Ou exécutez sur une plage visuelle sélectionnée:
la source
ctrl-v ctrl-[
pour insérer un "Esc échappé", ce qui vous ramène au "mode normal" aux fins de votre commande normale. Je viens de tester cela avec'<,'>norm Iaa^[ysiw"
, où^[
est le Esc échappé.la source
la source