In seinem (sehr guten) Buch "Pratical Vim" zeigt Drew Neil, wie man alle Zeilen mit dem Wort "TODO" in einem Register sammelt, um sie später zu verwenden.
Dazu verwendet er einfach einen globalen Befehl: :g/TODO/yank A
(Die Großbuchstaben A
erlauben Zeilen zum benannten Register a
).
Ich denke, das ist ein ziemlich cooler Trick, aber ich muss ihn verbessern: Ich versuche, die Nummer der Zeile einzufügen, bevor sie inhaltlich ist. Ich denke, die Lösung wäre, die Zeilennummer zu erhalten und sie im letzten Teil des Befehls zu verwenden, den ich zuvor erwähnt habe. Das Problem ist, dass ich nicht weiß, wie ich diese Zeilennummer bekommen soll.
Meine Frage lautet also: Wie kann ich in einem globalen Befehl die Nummer der übereinstimmenden Zeile ermitteln und wie kann ich diese Nummer verwenden?
Nur um hier klar zu sein, ist ein Beispiel. Betrachten wir diese Datei:
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 }
Wenn ich tippe :g/TODO/yank A
und den Inhalt des Registers in eine Datei lege, erhalte ich:
//TODO: Hey this is a todo
//TODO: and this is another one
Was ich gerne bekommen würde ist:
1 //TODO: Hey this is a todo
3 //TODO: and this is another one
Bonus der Ruck beinhaltet auch die Einrückung der Linie, es wäre ziemlich cool, wenn ich es direkt aus dem globalen Befehl entfernen könnte.
quelle
getpos()
undgetline()
Befehle nicht. Auch als du die:help function-list
. Es ist eine sehr nützliche Referenz. Auch +1 für die Erwähnung von "Practical Vim". :)a
Register im normalen Modus zu leeren, besteht darin, ein leeres Makro aufzuzeichnen, dasqaq
vielleicht weniger elegant ist als Ihre Lösung, aber es funktioniert;) Auch Ihre Lösung kann in einem Vimscript verwendet werden, obwohl ich glaube, dass dies mit nicht möglich ist Bergwerk.