In meinem fortran-Code habe ich viele Blöcke wie die folgenden
subroutine name(arg1,arg2,arg3,...)
:
end subroutine
und ich möchte, dass sie werden
subroutine name(arg1,arg2,arg3,...)
:
end subroutine name
Wo jeder dieser Blöcke durch eine beliebige Anzahl von Leerzeichen eingerückt werden kann (tatsächlich können solche Blöcke verschachtelt sein). Ich habe es mit dem Befehl versucht
:g/^ *subroutine \(.*\)/;/end subrout/s/end subroutine/& \1
Das ändert jede Zeile (ich habe es in der untersten Zeile gelesen) und ändert nichts, so wie der Puffer \1
leer ist. Der Befehl
:g/^ *subroutine \(.*\)/;/end subrout/s/end subroutine/& hello
funktioniert gut, ist aber offensichtlich nicht das, was ich will. Die Frage ist also: Wie kann ich in der Ersatzzeichenfolge ein Muster verwenden, das mit dem globalen ex-Befehl übereinstimmt :g
?
BEARBEITEN Ich bearbeite die Frage, da ich zum Zeitpunkt meiner Veröffentlichung die Antwort, die eine Antwort auf den konkreten Fall war, auf den ich mich bezog, eilig akzeptierte, aber nicht auf den Titel der Frage, der etwas allgemeiner ist.
Ich gehe auf den Punkt. Ich habe eine Datei wie die folgende (unsinnig, nur um sie so allgemein wie möglich zu gestalten):
# sec1
fun1 are you a function?
fun2 no.
fun3 ok, nice to meet you!
# 2nd part
first line
third line
ops (it was the second)
there were 3 lines in the preceding #
# fourth group
now there's just one
and foreveeer
(Tatsächlich sind die Zeilen, die jeder Zeile folgen, #
Hunderte.)
Ich muss in jeder Zeile nach jeder Zeile #
(und vor der folgenden Zeile) Ersetzungen vornehmen #
. Diese Ersetzungen sollten alle den Text nach der führenden #
Zeile (oder einem Teil davon) verwenden. Ein Beispiel für einen Wunsch, den ich erreichen möchte, ist
# sec1
fun1 in sec1 are you a function?
fun2 in sec1 no.
fun3 in sec1 ok, nice to meet you!
# 2nd part
first in 2nd line
third in 2nd line
ops in 2nd (it was the second)
there in 2nd were 3 lines in the preceding #
# fourth group
now in fourth there's just one
and in fourth foreveeer
Beachten Sie, dass #
in den folgenden Zeilen nur das erste folgende Wort eingefügt wird.
Wie ich bereits sagte, möchte ich wissen, ob das Muster des :g
Befehls als Ersatzzeichenfolge verwendet werden kann. Ich bin so an dieser Antwort interessiert, da es sehr ärgerlich ist, ein Makro zu registrieren (ein falscher Tastendruck bedeutet, von vorne zu beginnen!), Während ein Befehl wie dieser
:g/^# \(\<\w\+\>\)/+;/^#/- s/\(\<\w\+\>\)\(.\+$\)/\2 \1 \3
es wäre perfekt! ... und es fällt mir schwer zu glauben, dass es keine Möglichkeit gibt, einen Befehl zu verwenden, der die Arbeit erledigt!
quelle
norm!
tötet%
ausmatchit
. Lösung ::%g/^\s*subroutine/norm ^whye^%$p
.norm
stattdessen verwendetnorm!
, da ich ziemlich sicher war, dass hier keine benutzerdefinierten Einstellungen störten… Guter Fang, und danke für die Korrektur.:%g
. Ich habe beide an einem Puffer mit unterschiedlichen und verschachtelten Unterroutinen (und mit-u NONE
) ausprobiert und in beiden Fällen die gleichen Ergebnisse erzielt. Ich dachte:global
, der Standardbereich war1,$
(dh%
). In welchem Fall würde das%
einen Unterschied machen?Eine mögliche Problemumgehung ist die Verwendung eines Makros:
Was so detailliert werden kann:
Sie können dann Ihr Makro mit der Anzahl der Unterprogramme ausführen, mit
X@a
denenX
fortgefahren werden sollquelle
Hier ist die Makrolösung von @statox , die für Subroutinenparameter und verschachtelte Subroutinen geändert wurde. Dies setzt voraus, dass Sie auch matchit installiert haben :
@a
@a
/^\s*subroutine\zs<CR>
- suchen nachsubroutine
;\zs
Lässt den Cursor auf dem darauf folgenden Feld2
weil wir den Raum einschließen wollen,w
weil wir ein wollenword
(dies hört bei(
usw. auf)subroutine
end subroutine
(drei Beifall fürmatchit
)end
subroutine
subroutine
ssubroutine
in der aktuellen Zeile kein verpassenUm es auszuführen:
:set nowrapscan
- Vermeiden Sie eine Endlosschleife: Das Makro wird gerettet, wenn es das Ende der Datei erreichtquelle
Sie können mit einem Ersatzbefehl gehen:
Dies stimmt mit dem Ganzen
subroutine / end subroutine
in Gruppe 1 und dem Unterprogrammnamen in Gruppe 2 überein und verkettet sie.Das
{-}
ist nicht gierig,*
daher hört es beim ersten gefundenen Element auf.\_.
alles zusammenpassen und anew-line
.quelle
matchit
kann verschachtelte Unterprogramme verarbeiten.