Comment obtenir et utiliser le numéro de chaque ligne correspondante dans une commande globale


8

Dans son (très bon) livre "Pratical Vim", Drew Neil montre comment collecter toutes les lignes contenant le mot "TODO" dans un registre pour les utiliser plus tard.

Pour ce faire, il utilise simplement une commande globale: :g/TODO/yank A(La majuscule Apermet de passer des lignes au registre nommé a).

Je pense que c'est une astuce plutôt cool mais je dois l'améliorer: j'essaie d'insérer le numéro de la ligne avant son contenu. Je pense que la solution serait d'obtenir le numéro de ligne et de l'utiliser dans la dernière partie de la commande que j'ai mentionnée précédemment. Le problème est que je ne sais pas comment obtenir ce numéro de ligne.

Donc, ma question est: comment dans une commande globale puis-je obtenir le numéro de la ligne correspondante et comment puis-je utiliser ce numéro?

Pour être clair, voici un exemple. Considérons ce fichier:

1  //TODO: Hey this is a todo
2  int main(void){
3      //TODO: and this is another one
4      printf("Hello world");
5
6      return 0;
7  }

Quand je tape :g/TODO/yank Aet je mets le contenu du registre dans un fichier j'obtiens:

//TODO: Hey this is a todo
    //TODO: and this is another one

Ce que j'aimerais obtenir, c'est:

1 //TODO: Hey this is a todo
3    //TODO: and this is another one

Le bonus yank comprend également l'indentation de la ligne, ce serait plutôt cool si je pouvais le supprimer directement de la commande globale.

Réponses:


7

Une façon de le faire:

  1. effacer le registre:

    :let @a=''
    
  2. ajoutez-y les résultats de la recherche:

    :g/TODO/let @A = getpos('.')[1] . ' ' . getline('.') . "\n"
    

Re: BONUS supprime l'indentation dans la commande globale:

    :g/TODO/let @A = getpos('.')[1] . ' ' . substitute(getline('.'), '^\s*', '', '') . "\n"

1
Merci c'est exactement ce que je cherchais! Je ne connaissais pas les commandes getpos()et getline(). Aussi, comme vous avez répondu à la question bonus, vous méritez un cookie dansant ;)
statox

Un cookie, yay :)
VanLaser

1
@statox Ajouter à vos favoris: :help function-list. C'est une référence très utile. Aussi, +1 pour la mention de "Practical Vim". :)
lcd047

@ lcd047: Wow merci !! Je souhaite avoir connu cette entrée d'aide auparavant, c'est tellement agréable d'avoir cette liste ici. La documentation Vim est vraiment incroyable! Aussi, je suis assez nouveau sur vim et "Practical Vim" est ma Bible en ce moment :)
statox

@Laser aussi un moyen le plus rapide de vider le aregistre en mode normal est d'enregistrer une macro vide avec qaqpeut-être qu'elle est moins élégante que votre solution mais ça marche;) Votre solution peut également être utilisée dans un vimscript alors que je ne pense pas que ce soit possible avec mien.
statox
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.