6
votes

Vim Macro: incrémentation des nombres sur des lignes non consécutives

Je travaille avec un fichier YAML qui a un entier comme ID qui apparaît toutes les 4-6 lignes. Je cherche à ajouter un enregistrement au milieu de ce fichier (pour la lisibilité) qui conserve la numérotation séquentielle intacte.

format de fichier ci-dessous. Des idées? P>

- id: 1
  type: string
  option: diff_string
  other: alt_string   // note: 'other' option does not appear for all records

- id: 2
  type: string
  option: diff_string

//new record would go here as id: 3, increasing id: # of all following records by 1

- id: 3
  type: string
  option: diff_string
  other: alt_string


0 commentaires

3 Réponses :


3
votes

Afin d'incrémenter tous les identifiants suivants de la ligne de curseur + 1: xxx

( nr2char (1) est comme Ctrl-A dans).

Vous pouvez également faire: xxx

où vous entrez ^ a typing ctrl-v puis ctrl-a. Notez que je préfère la première version: vous pouvez le copier-la coller, il n'y a pas de caractère de commande littéral dans le code.

Détail:

  • . + 1, $ est la plage de la ligne suivante jusqu'à la fin du fichier. : Plage d'aide .
  • : g fonctionne sur toutes les lignes obéissant à un motif. L'inverse est : v . : Aide: g
  • / ^ - id: \ d \ + $ / correspondances - id: au début d'une ligne, suivi de 1 ou plusieurs chiffres, puis de fin de ligne (: modèle d'aide )
  • : normal! joue des commandes normales: 0 Pour aller au début de la ligne, Ctrl-A pour incrémenter le numéro suivant.

    Si vous voulez un mappage: xxx

    mettre cela dans votre VIMRC, et aimez maintenant appuyer sur F1 en mode normal et regarder tous les identifiants sous la ligne de curseur incrémentation.


1 commentaires

Excellent, bien que je préfère le changement global personnellement. Merci Benoit, pour votre aide sur toutes les réponses avec cette question.



6
votes

Je pense que vous pouvez obtenir ce que vous voulez avec définir un compteur (ici: variable g: i ) à 1: xxx

puis exécuter une substitution sur Chaque ligne qui correspond ^ - id: \ d \ + $ : xxx

la substitution utilise le \ = trucsy (Voir : Aide Sous-remplacement-expression ) à remplacer \ d \ + avec la valeur réelle de g: i . Après la sous-tension, le compteur est incrémenté ( que g: i = g: i + 1 ).

avec le g / ^-id: \ d \ + $ / Vous vous assurez que la substitution n'est effectuée que sur les lignes correspondant ^ - ID: \ d \ + .

edit si vous Voulez-vous avoir une carte pour cela, vous pouvez placer le snippet suivant dans votre .vimrc : xxx

qui permet resync vos identifiants en tapant resync dans mode normal .

Notez l'échappement du | avec le \ et l'utilisation de où vous appuyez sur Entrée.


7 commentaires

Ceci est un autre moyen valide et il renbliera chaque identifiant unique dans le document en commençant par 1 du début à la fin. Copiez ce code dans votre presse-papiers et utilisez : @ + pour essayer (si vous utilisez une interface graphique).


Que fait : @ + faire? Je vois qu'il imprime le id: x lignes mais je n'ai aucune idée de pourquoi c'est.


NYFENEGGER: : @ joue les commandes ex-ext stockées dans un registre. Le registre + est normalement connecté au presse-papier externe. Voir : Aide: @ . Ceci est putain utile si vous souhaitez essayer des extraits de VIMRC: yy alors : @ ".


J'aime cette méthode car elle garantit que l'ensemble du fichier est en ordre, quel que soit le point de départ. Merci!


René: Est-il possible de sauvegarder cela comme une liaison dans .VIMRC? Quand j'ai essayé, je reçois des erreurs en raison des variables.


@ René Nyfenegger: Je préférerais «Nnoremap» plutôt que «NMAP» à moins que vous ayez une bonne raison d'utiliser «NMAP»!


@Benoit: Merci, ça change.



1
votes

J'utiliserais la commande de substitution courte et simple suivante.

:,$s/^- id: \zs\d\+/\=submatch(0)+1/


0 commentaires