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 A
permet 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 A
et 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.
la source
getpos()
etgetline()
. Aussi, comme vous avez répondu à la question bonus, vous méritez un cookie dansant ;):help function-list
. C'est une référence très utile. Aussi, +1 pour la mention de "Practical Vim". :)a
registre en mode normal est d'enregistrer une macro vide avecqaq
peut-ê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.