Es gibt bereits drei großartige Antworten auf dieser Seite, aber wie Luc Hermitte in einem Kommentar vorgeschlagen hat , ist es wichtig, wie schnell und einfach Sie auf eine funktionierende Lösung stoßen können, wenn Sie dies direkt tun.
Als solches ist dies ein Problem, das ich eigentlich gar nicht verwenden würde :substitute
: Es kann leicht mit regulären Normalmodusbefehlen und einem rekursiven Makro gelöst werden:
(Falls erforderlich) Schalten Sie zuerst aus 'wrapscan'
. Der reguläre Ausdruck, den wir verwenden werden, stimmt sowohl mit dem gewünschten Ergebnistext als auch mit dem Anfangstext überein. Wenn diese Option aktiviert ist, wird 'wrapscan'
das Makro ansonsten für immer wiedergegeben. (Oder bis Sie erkennen, was passiert und drücken <C-C>
.):
:set nowrapscan
Richten Sie Ihren Suchbegriff ein (unter Verwendung des gleichen regulären Basisausdrucks, der bereits in den vorhandenen Antworten erwähnt wurde):
/#\d\+\(\.\d\+\)\?<CR>
(Falls erforderlich) Kehren Sie zum ersten Spiel zurück, indem Sie N
so oft wie nötig drücken.
(Falls erforderlich) Ändern Sie die erste Übereinstimmung in den gewünschten Text:
cE#1<Esc>
Löschen Sie das "q
Register und beginnen Sie mit der Aufnahme eines Makros:
qqqqq
Ziehen Sie den aktuellen Zähler:
yiW
Zum nächsten Spiel springen:
n
Ersetzen Sie den aktuellen Zähler durch den, den wir gerade gezogen haben:
vEp
Erhöhen Sie den Zähler:
<C-A>
Makro abspielen q
. Das Register "q
ist noch leer, da wir es in Schritt 5 gelöscht haben. Daher passiert zu diesem Zeitpunkt nichts:
@q
Beenden Sie die Aufzeichnung des Makros:
q
Spielen Sie das neue Makro und schauen Sie zu!
@q
Wie bei allen Makros sieht dies nach vielen Schritten aus, wenn ich sie wie oben beschrieben erläutere. Beachten Sie jedoch, dass das Eintippen dieser Schritte für mich sehr schnell geht: Abgesehen von der rekursiven Makroaufzeichnungs-Boilerplate sind sie alle nur die regulären Bearbeitungsbefehle Ich führe die ganze Zeit während der Bearbeitung aus. Der einzige Schritt, in dem ich etwas tun musste, das sich dem Denken näherte , war Schritt 2, in dem ich den regulären Ausdruck schrieb, um die Suche durchzuführen.
Als zwei Befehle im Befehlszeilenmodus und eine Reihe von Tastenanschlägen formatiert, wird die Geschwindigkeit dieser Art von Lösung klarer: Ich kann Folgendes so schnell heraufbeschwören, wie ich es 1 eingeben kann :
:set nowrapscan
/#\d\+\(\.\d\+\)\?
cE#1<Esc>qqqqqyiWnvEp<C-A>@qq@q
Ich hätte mir wahrscheinlich die anderen Lösungen auf dieser Seite mit ein wenig Nachdenken und einigen Verweisen auf die Dokumentation 2 einfallen lassen können , aber wenn Sie erst einmal verstanden haben, wie Makros funktionieren, sind sie wirklich einfach mit der Geschwindigkeit zu erstellen, die Sie normalerweise bearbeiten.
1: Es gibt Situationen, in denen Makros mehr Nachdenken erfordern, aber ich finde, dass sie in der Praxis nicht viel auftauchen. Und im Allgemeinen treten sie in Situationen auf, in denen ein Makro die einzig praktikable Lösung ist.
2: Um nicht zu implizieren, dass die anderen Antwortenden ihre Lösungen nicht so einfach hätten finden können: Sie benötigen nur Fähigkeiten / Kenntnisse, die ich persönlich nicht so einfach zur Hand habe. Aber alle Vim-Benutzer wissen, wie man reguläre Bearbeitungsbefehle verwendet!
perldo
, können Sie verwenden:%perldo s/#\K\d+(\.\d+)?/++$i/ge