So erhalten und verwenden Sie die Nummer jeder übereinstimmenden Zeile in einem globalen Befehl

8

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 Aerlauben 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 Aund 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.

statox
quelle

Antworten:

7

Ein Weg, es zu tun:

  1. Löschen Sie das Register:

    :let @a=''
    
  2. Suchergebnisse anhängen:

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

Betreff: BONUS Einrückung im globalen Befehl entfernen:

    :g/TODO/let @A = getpos('.')[1] . ' ' . substitute(getline('.'), '^\s*', '', '') . "\n"
VanLaser
quelle
1
Danke, genau das habe ich gesucht! Ich kannte die getpos()und getline()Befehle nicht. Auch als du die
Bonusfrage
Ein Keks, yay :)
VanLaser
1
@statox Lesezeichen setzen : :help function-list. Es ist eine sehr nützliche Referenz. Auch +1 für die Erwähnung von "Practical Vim". :)
lcd047
@ lcd047: Wow danke !! Ich wünschte, ich wüsste diesen Hilfeeintrag schon einmal. Es ist so schön, diese Liste hier zu haben. Die Vim-Dokumentation ist wirklich erstaunlich! Außerdem bin ich ziemlich neu in Vim und "Practical Vim" ist im Moment meine Bibel :)
statox
@Laser Ein schneller Weg, um das aRegister im normalen Modus zu leeren, besteht darin, ein leeres Makro aufzuzeichnen, das qaqvielleicht 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.
Statox